|
基于NEC協(xié)議紅外發(fā)射程序,STC89C52開發(fā)板調(diào)試通過,發(fā)這個貼子是呼應(yīng)前期的帖子——接收程序,歡迎大家多提寶貴意見。
NEC 標(biāo)準(zhǔn)下的編碼表示
發(fā)送端: 引導(dǎo)碼高電平約9000us 左右,低電平約4500us 左右;
接收端:引導(dǎo)碼低電平約9000us 左右,高電平約4500us 左右;
用戶碼16 位,數(shù)據(jù)碼16 位,共32位;
發(fā)送端: 數(shù)據(jù)0 是用“高電平約560us +低電平約560us”表示。
數(shù)據(jù)1 可用“高電平約560us+低電平約1680us”表示
接收端反轉(zhuǎn):數(shù)據(jù)0 是用“低電平約560us +高電平約560us”表示。
數(shù)據(jù)1 可用“低電平約560us+高電平約1680us”表示
單片機(jī)源程序如下:
- /*****************************************************
- 主機(jī):AT89C52 主頻為11.0592Mhz 紅外NEC協(xié)議編碼
- 編程:wzqwxx 水上人家
- ******************************************************/
- #include <REGX52.H>
- sbit IR_TX = P2^4; //定義紅外發(fā)射端口
- void T0_init() //初始化定時器0
- {
- TMOD = 0x01;
- ET0 = 1;
- EA = 1;
- }
- void T1_Init(void) //13微秒@11.0592MHz
- {
- TMOD &= 0x0F; //設(shè)置定時器模式
- TMOD |= 0x20; //設(shè)置定時器模式
- TL1 = 0xF4; //設(shè)置定時初始值 38KHz
- TH1 = 0xF4; //設(shè)置定時重載值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 1; //定時器1開始計時
- }
- /****中斷產(chǎn)生紅外發(fā)射不同時長延時函數(shù)560us 1680us 4500us 9000us*****/
- void IR_TXD_time( unsigned char th0,tl0)
- {
- TH0 = th0;
- TL0 = tl0;
- TR0 = 1; //打開定時器計時
- IR_TX = 1;
- while(TF0 == 0); //延時,等待產(chǎn)生中斷
- TF0 = 0;
- TR0 = 0;
- TR1 = 0;
- IR_TX = 1;//結(jié)束時拉高發(fā)射端口,結(jié)束發(fā)射
- }
- /*********紅外發(fā)送4字節(jié)數(shù)據(jù)函數(shù)**********/
- void IR_Send_4B_Date(unsigned char *p)
- {
- unsigned char i,j;
- ET1 = 1; TR1 = 1; //打開T1中斷,產(chǎn)生38KHz頻率波,調(diào)制產(chǎn)生高電平信號
- IR_TXD_time(0xdf,0x9a);// 產(chǎn)生9000us信號
- ET1 = 0;//關(guān)閉38KHz頻率波,調(diào)制產(chǎn)生低電平信號 ,下同
- IR_TXD_time(0xef,0xcd);// 產(chǎn)生4500us信號
- for(i = 0 ; i < 4 ; i++)
- {
- for(j = 0x01 ; j != 0 ; j <<= 1)//發(fā)送32位數(shù)據(jù)
- {
- ET1 = 1; TR1 = 1;
- IR_TXD_time(0xfe,0x08);// 產(chǎn)生560us高電平信號
- ET1 = 0;
- if(*(p+i) & j) //按位與是1則
- IR_TXD_time(0xfa,0x4c);// 產(chǎn)生1680us低電平信號
- else
- IR_TXD_time(0xfe,0x3f);// 產(chǎn)生560us低電平信號
- }
- }
- ET1 = 1;TR1 = 1;
- IR_TXD_time(0xfd,0xfc);// 產(chǎn)生560us高電平信號,結(jié)束32位數(shù)據(jù)發(fā)送
- ET1 = 0;
- }
- /*********主函數(shù)**********/
- void main()
- {
- unsigned char IR_Data[] = {0x22,0xdd,0x00,0xff} ;//待發(fā)數(shù)據(jù)
- unsigned char num;
- T0_init();
- T1_Init();
- while(1)
- {
- P3 = 0x0f;
- if(P3 != 0x0f)
- {
- IR_TXD_time(0x8f,0x9a);// 延時消抖
- if(P3 !=0x0f)
- {
- num = P3&0x0f;
- }
- if(num == 0x0e) //我家機(jī)頂盒的遙控數(shù)據(jù),簡單測試四個鍵值
- {IR_Data[2] =0xdc ; IR_Data[3] = ~IR_Data[2];} // 電源
- else if(num == 0x0d)
- {IR_Data[2] = 0x99 ; IR_Data[3] = ~IR_Data[2];}//左移
- else if(num == 0x0b)
- {IR_Data[2] = 0xc1 ; IR_Data[3] = ~IR_Data[2];} //右移
- else if(num == 0x07)
- {IR_Data[2] = 0xd2 ; IR_Data[3] = ~IR_Data[2];} //下翻
- IR_Send_4B_Date(IR_Data); //發(fā)送
- IR_TXD_time(0xff,0x01);// 延時間隔連發(fā)
- }
- }
- }
- void Timer1() interrupt 3
- {
- IR_TX = ~IR_TX; //13微秒@11.0592MHz ,產(chǎn)生38KHz載波
- }
- void Timer0() interrupt 1
- {
- }
復(fù)制代碼
|
評分
-
查看全部評分
|