|
本帖最后由 ll13536121668 于 2019-5-7 12:02 编辑
这个程序缺少了<ir.h> <24c02.H>那位师博能把这个,用Keil uVision 4编译 通过生成代码吗? 修改好用压缩包上传,谢谢
#include<AT89X51.H> //装入AT89X51头文件
#include<ir.h> //装入红外解码程序
#include<24c02.H> //装入24c02读写程序
sbit key=P1^0; //定义按键IO
sbit led=P0^0; //定义指示led
sbit rel=P0^1; //定义输出控制脚
unsigned char kaver; //定义kaver为输出口状态缓存
unsigned char iccdate,irdate; //定义24c02数据和解码数据
//延时10ms函数,用于开关消抖等
delay10ms()
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//学习红外解码并写入24c02的函数
study()
{
IR_IN();
irdate=IRCOM[3];
iccdate=ReadIIC(W_cmd,0x00,R_cmd);
if(irdate!=iccdate) //只在解码结果与读取结果不同时写入24C02
{
if(irdate!=0) //防止没有接收到红外信号,IRCOM[3]置零时,误写入0
{
WP=0;
WriIIC(W_cmd,0x00,irdate);
delay10ms();
WP=1;
led=0;
while(key==0); //学习成功等待按键释放,led停止闪动作为指示
}
}
}
//进入学习状态时的led闪动函数
flash()
{
unsigned char i;
while(key==0)
{
led=~led;
for(i=50;i>0;i--)
study();
}
}
//按键模式识别函数
keymod()
{
unsigned char m=0;
while(key==0) //如果按键按下,开始对按键时间进行计数
{
delay10ms(); //计数时间延时
m++;
delay10ms(); //计数时间延时
if(m>=90) //如果计数次数大于90次,等于按键按下时间大于约5秒后,进入led闪动学习模式
{
m=0;
flash();
}
}
if(m<90) //如果计数次数小于90,则按键作为开关使用
{
m=0;
kaver=~kaver;
}
}
////////////////////主函数////////////////////////////////////
main()
{
WP=1; //24c02写保护
while(1)
{
IRCOM[3]=0;
IR_IN(); // 读4字节32位按键编码 ,前16位用户码为IRCOM[1]+IRCOM[2],8位键值码为IRCOM[3]
irdate=IRCOM[3]; //8位键值反码为IRCOM[4] 这里只调用 IRCOM[3]键值码作为数据码
iccdate=ReadIIC(W_cmd,0x00,R_cmd);
if(irdate==iccdate) //如果解码结果与24C读取码相同,kaver翻转一次
{
irdate=0;
kaver=~kaver;
}
if(key==0)
keymod();
rel=~kaver;
led=kaver;
}
}
|
|