|
本帖最后由 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;
}
}
|
|