這是我現在用的紅外遙控程序,我的是STC89C52單片機- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table_we[]={
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar code table_du[]={0xC0,0xF9,0xA4,0xB0,0x99,
- 0x92,0x82,0xf8,0x80,0x90,0x88,
- 0x83,0xC6,0xA1,0x86,0x8E};
- sbit ir=P3^3;
- sbit a=P0^0;//LED或小車端口
- sbit b=P0^1;//LED或小車端口
- sbit c=P0^2;//LED或小車端口
- sbit d=P0^3;//LED或小車端口
- uchar irtime;//紅外時間變量
- uchar irdata[33];//
- uchar bitnum;//第幾位
- uchar startflag;//起始標志位
- uchar irok;//接收結束變量
- uchar ircode[4];
- uchar irprosok;
- uchar disnum[4];
- //uchar disnum[8];
- sbit duan=P0^6;
- sbit wei=P0^7;
- void timer0init(void) //256*(1/12m)*12=0.256ms
- {
- TMOD=0x02;//方式2
- TH0=0x00;
- TL0=0x00;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void irpros(void) // 紅外碼值處理
- {
- uchar mun,k,i,j;
- k=1;
- for(j=0;j<4;j++)//讀出4個碼循環4次
- {
- for(i=0;i<8;i++)
- {
- mun=mun>>1;//右移7次
- if(irdata[k]>7)//判斷8次 大于6是高電平,小于6是低電平
- {
- mun=mun | 0x80;
- }
- k++;
- }
- ircode[j]=mun;
- }
- irprosok=1;
- }
- void irwork(void) // 紅外碼值轉換
- {
- disnum[0]=ircode[0]/16;
- disnum[1]=ircode[0]%16;
- // disnum[2]=ircode[1]/16;
- // disnum[3]=ircode[1]%16;
- disnum[2]=ircode[2]/16;
- disnum[3]=ircode[2]%16;
- // disnum[6]=ircode[3]/16;
- // disnum[7]=ircode[3]%16;
- }
- void delay(uchar x)
- {
- uchar a,b;
- for(a=x;a>0;a--)
- for(b=200;b>0;b--);
- }
- void display()//顯示
- {
- P2=0xfe;
- wei=1;
- wei=0;
- delay(5);
- P2=table_du[disnum[0]];
- delay(5);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xfd;
- wei=1;
- wei=0;
- delay(5);
- P2=table_du[disnum[1]];
- delay(5);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xfb;
- wei=1;
- wei=0;
- delay(5);
- P2=table_du[disnum[2]];
- delay(5);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xf7;
- wei=1;
- wei=0;
- delay(5);
- P2=table_du[disnum[3]];
- delay(5);
- duan=1;
- duan=0;
- P2=0xff;
-
- }
- void int0init(void)//外部中斷初始化
- {
- IT1=1;//下降沿觸發
- EX1=1;//開外部中斷
- EA=1;//開總中斷
- }
- void main()
- {
- timer0init();
- int0init();
- while(1)
- {
- if(irok==1)
- {
- irpros();
- irok=0;
- }
- if(irprosok==1)
- {
- irwork();
- irprosok=0;
- }
- display();
-
- }
-
- }
- void int0 () interrupt 2 //外部0中斷服務
- {
- if(startflag)
- {
- // if(irtime>32&&irtime<63) //8-16ms檢測引導碼
- if(irtime>32)
- {
- bitnum=0;
- }
- irdata[bitnum]=irtime;
- irtime=0;
- bitnum++;
- if(bitnum==33)//接收結束
- {
- bitnum=0;
- irok=1;
- }
- }
- else
- {
- startflag=1;
- irtime=0;
- }
- }
- void timer0 () interrupt 1//定時器0中斷服務函數
- {
- irtime++;
- }
復制代碼 |