📄 irrxd.lst
字号:
C51 COMPILER V7.06 IRRXD 09/14/2005 23:04:01 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IRRXD
OBJECT MODULE PLACED IN IrRxd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IrRxd.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<at89x52.h>
2
3 #define IRRXD P3_3//INT1口
4
5 unsigned char IrRxdBack=0;//中断返回的数据//
6 bdata unsigned char IrRxd=0;
7 sbit IrRxdOk1=IrRxd^0;//有否中断的状态标志//
8
9
10
11
12
13 unsigned char IrRxdReceive(void);
14 void IrRxdInilital(void);
15
16
17
18
19 //红外线接受初始化函数//设置为定时器1在门控GATE下工作//外部中段1工作//
20 void IrRxdInilital(void)
21 {TMOD=(TMOD & 0x0f)|0x80;
22 1 IE=IE|0x84;
23 1 }
24
25
26 //中断处理模块//
27 IrRxdIrq() interrupt 2
28 {unsigned char IrRxdCmpH=0,IrRxdCmpL=0;
29 1 ////////////////////////////////////////////////////////////////////////
30 1 P3_5=0;
31 1 ////////////////////////////////////////////////////////////////////////
32 1 EX1=0;//关中断
33 1 TR1=1;//启动定时器1//
34 1 P3_0=0;
35 1 IrRxdCmpL=IrRxdReceive();//接受低八位的红外线信号//
36 1 IrRxdCmpH=IrRxdReceive();//接受高八位的红外线信号//
37 1 TR1=0;//关定时器//
38 1 while(~IRRXD);//等待中断INT1恢复为高电平//
39 1 if(IrRxdCmpL==0x47) //如如果用户码正确进入代码转化//
40 1 {switch(IrRxdCmpH)
41 2 {case 0x04:IrRxdBack='0';break;//0按键//
42 3 case 0x00:IrRxdBack='1';break;//1
43 3 case 0x08:IrRxdBack='2';break;//2
44 3 case 0x10:IrRxdBack='3';break;//3
45 3 case 0x18:IrRxdBack='4';break;//4
46 3 case 0x20:IrRxdBack='5';break;//5
47 3 case 0x28:IrRxdBack='6';break;//6
48 3 case 0x30:IrRxdBack='7';break;//7
49 3 case 0x38:IrRxdBack='8';break;//8
50 3 case 0x01:IrRxdBack='9';break;//9
51 3 case 0x11:IrRxdBack='a';break;//--/-按键//
52 3 case 0x22:IrRxdBack='c';break;//音量+//
53 3 case 0x2a:IrRxdBack='d';break;//音量-//
54 3 case 0x32:IrRxdBack='e';break;//静音//
55 3 case 0x0a:IrRxdBack='f';break;//频道+//
C51 COMPILER V7.06 IRRXD 09/14/2005 23:04:01 PAGE 2
56 3 case 0x12:IrRxdBack='g';break;//频道-//
57 3 default :IrRxdBack=0x00;break;
58 3 }
59 2 IrRxdOk1=1;//置中断标志为1//
60 2 }
61 1 else IrRxdBack=0x00;//如果用户码错则置空//
62 1 EX1=1;//开中断//
63 1 ////////////////////////////////////////////////////////////////////////
64 1 P3_5=1;
65 1 ////////////////////////////////////////////////////////////////////////
66 1 }
67
68
69 //红外线接受八位数据模块//
70 unsigned char IrRxdReceive(void)
71 {unsigned char IrRxdMunber=0,IrRxdCmp1=0,IrRxdCmp2=0,IrRxdCmp=0;
72 1 for(;IrRxdMunber<=7;IrRxdMunber++)
73 1 {while(~IRRXD);//如果INT1为低电平则等待//直到高电平
74 2 while(IRRXD);//如果INT1为高电平则等待//直到低电平
75 2 IrRxdCmp1=TH1;
76 2 IrRxdCmp2=TL1;
77 2 if(IrRxdCmp1==0){TH1=0;TL1=0;IrRxdMunber--;continue;}//如果时间太短则判为误码,再进入循环//
78 2 else {if(IrRxdCmp1>=0x28) //如果接受的高电平时间长则置一//
79 3 {IrRxdCmp=(IrRxdCmp>>1)|0x80;
80 4 TH1=0;TL1=0;
81 4 }
82 3 else {IrRxdCmp=IrRxdCmp>>1;TH1=0;TL1=0;}//否则置0
83 3 }
84 2 }
85 1 return(IrRxdCmp);//返回接受的数据
86 1 }
87
88
89 main()
90 {unsigned char KingsRight=0,KingsRightBuf[8]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
91 1 long delaytime=0;
92 1 IrRxdInilital();
93 1 while(1)
94 1 {delaytime++;
95 2 if(IrRxdOk1)
96 2 {P1=IrRxdBack;}
97 2 if(delaytime==100000)
98 2 {delaytime=0;
99 3 KingsRight++;
100 3 if(KingsRight==7)KingsRight=0;
101 3 P2=KingsRightBuf[KingsRight];
102 3 }
103 2 }
104 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 424 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -