char get_hinder_num()
{
......
}
//获取倒计时的时间,立即报警返回0
char get_count_down(char hinder_num)
{
......
}
//报警函数
void beep()
{
......
}
flag_delay = 1 //等待标志
void main()
{
char hinder_num = 0
char count_down = 0
while(1)
{
while(hinder_num == 0){ hinder_num = get_hinder_num()} //发生阻碍跳出
count_down = get_count_down() //获取倒计时
if (count_down == 0){beep()} //倒计时为0,立即报警
else
{
flag_delay = 1
......//使用定时器开始倒计时,根据count_down确定倒计时间
//时间到把flag_delay置为0
while(flag_delay) //等待
{
if (hinder_num != get_hinder_num()) //如果阻碍数量发生变化,退出等待
{
......//关闭定时器
break
}
}
}
}
}
void main(){
unsigned char i=0x0a
P3=0x00
P1=0X00
TMOD=0X01
TH0=0X3C//设置定时100ms初值
TL0=0XB0
EA =1// ;CPU开中断
ET0 =1 // ;定时器0允许中断
while(1){
if (P3!=0x00){
TR0=1
while(1)
}
}
}
***** interrupt()//定时器0中断自己查一下怎么写
{
TH0=0X3C
TL0=0XB0
if(I!=0X00)
{
return
}else
{
i=0X0A
P3.7^=p3.7
}
}
下面是一个用C写的遥控器程序.能在数码管上显示键码.#include <reg52.h>
#define c(x) (x*110592/120000)
sbit Ir_Pin=P3^3
unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E} //共阳极数码显示码0-F.
unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}
unsigned char Led_Buf[4]//显示缓冲区
char Led_Index //位选
unsigned char Ir_Buf[4]//用于保存解码结果
//==============================================================
//数码管扫描
timer0() interrupt 1 using 1
{
TL0=65536-1000
TH0=(65536-1000)/256//定时器0设定约1000us中断一次,用于数码管扫描
P0=0xff
P2=Led_Sel[Led_Index] //位选
P0=Led_Tab[Led_Buf[Led_Index]] //段选
if(++Led_Index>3) Led_Index=0 //四个扫描完了,到第一个数码管
}
//==============================================================
unsigned int Ir_Get_Low()
{
TL1=0
TH1=0
TR1=1
while(!Ir_Pin &&(TH1&0x80)==0)
TR1=0
return TH1*256+TL1
}
//=============================================================
unsigned int Ir_Get_High()
{
TL1=0
TH1=0
TR1=1
while(Ir_Pin &&(TH1&0x80)==0)
TR1=0
return TH1*256+TL1
}
//==============================================================
main()
{
unsigned int temp
char i,j
Led_Index=1
TMOD=0x11
TL0=65536-1000
TH0=(65536-1000)/256//定时器0设定约1000us中断一次,用于数码管扫描
EA=1
ET0=1
TR0=1
Led_Buf[0]=0
Led_Buf[1]=0
Led_Buf[2]=0
Led_Buf[3]=0//显示区设成0
do{
restart:
while(Ir_Pin)
temp=Ir_Get_Low()
if(temp<c(8500) || temp>c(9500)) continue//引导脉冲低电平9000
temp=Ir_Get_High()
if(temp<c(4000) || temp>c(5000)) continue//引导脉冲高电平4500
for(i=0i<4i++) //4个字节
for(j=0j<8j++) //每个字节8位
{
temp=Ir_Get_Low()
if(temp<c(200) || temp>c(800)) goto restart
temp=Ir_Get_High()
if(temp<c(200) || temp>c(2000)) goto restart
Ir_Buf[i]>>=1
if(temp>c(1120)) Ir_Buf[i]|=0x80
}
Led_Buf[0]=Ir_Buf[2]&0xf
Led_Buf[1]=(Ir_Buf[2]/16)&0xf
Led_Buf[2]=Ir_Buf[3]&0xf
Led_Buf[3]=(Ir_Buf[3]/16)&0xf//显示结果
}while(1)
}