/************************************************************************
TC9012芯片:是一塊用于東芝系列紅外遙控的專用發射集成電路
因為一個小小的語句的錯誤,害了我兩個多小時的精力。寫程序就這樣
*************************************************************************/
- #include"reg52.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar code meg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7f,0x39,0x3f,0x79,0x71};
- uchar code meg_we[]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
- //sbit sc=P3^7;//鎖存信號
- uchar irtime;
- uchar startflag;
- uchar bitnum;
- uchar irdata[33];//傳送一次有1位引導碼+8位客戶碼+8位客戶碼+8位數據碼+8位數據反碼
- uchar irreceok;
- uchar ircode[4];//存放四個字節的紅外線代碼
- uchar irprossok;
- uchar disp[8];
- void _init_();
- void irpross();
- void irwork();
- void delay_zms(uint);
- void xianshi();
- /**********************************************************
- 主函數:
- ***********************************************************/
- void main()
- {
- _init_();
- while(1)
- {
- if(irreceok)//接收完畢?
- {
- irreceok=0;//數據接收成功標志清零
- startflag=0;
- irpross();
- }
- if(irprossok)//處理完畢?
- {
- irprossok=0;
- irwork();
- }
- xianshi();
- }
- }
- void delay_zms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- /* **********************************************************
- 初始函數:設置定時器0為方式2,裝初值0,開啟定時器中斷,總中斷
- 外部0中斷(設置為下降沿觸發)
- *************************************************************/
- void _init_()
- {
- TMOD=0x02;
- TH0=0x00;
- TL0=0x00;
- ET0=1;
- IT0=1;
- EX0=1;
- EA=1;
- TR0=1;
-
- }
- /*************************************************************
- 紅外數據處理函數:將接收的時間數據(時間的長短定義0和1)處理成
- 數據代碼,保存于ircode[]中
- **************************************************************/
- void irpross()
- {
- uchar i,j,k,value;
- k=1;
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- value=value>>1;
- if(irdata[k]>7)//判斷是否為1
- {
- value=value|0x80;
- }
- k++;
- }
- ircode[i]=value;
- }
- irprossok=1;
- }
- /*************************************************************
- 數碼管顯示紅外代碼函數:用于了解和記錄遙控上每個鍵所對應的代碼
- 便于對以后每個鍵的代碼處理,賦予鍵不同
- 功能
- **************************************************************/
- void irwork()
- {
- disp[1]=ircode[0]/16;
- disp[0]=ircode[0]%16;
- disp[3]=ircode[1]/16;
- disp[2]=ircode[1]%16;
- disp[5]=ircode[2]/16;
- disp[4]=ircode[2]%16;
- disp[7]=ircode[3]/16;
- disp[6]=ircode[3]%16;
- }
- void xianshi()
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- P0=meg_du[disp[i]];
- P2=meg_we[i];
- delay_zms(2);
- }
- }
- /************************************************************
- 定時器中斷處理函數:irtime定時次數,定時時間為irtime*256us
- *************************************************************/
- void timer0 () interrupt 1
- {
- irtime++;
- }
- /***************************************************************
- 外部中斷0中斷處理函數:接收紅外線數據,處理,保存
- ****************************************************************/
- void int0 () interrupt 0
- {
- if(startflag) //判斷開始信號,屏蔽第一個中斷
- {
- if(irtime>35) //檢測引導碼
- {
- bitnum=0;
- }
- irdata[bitnum]=irtime;
- irtime=0;
- bitnum++;
- if(bitnum==33)
- {
- bitnum=0;
- irreceok=1;
-
- }
-
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
復制代碼
|