📄 telecontrol.lst
字号:
C51 COMPILER V8.02 TELECONTROL 05/19/2008 12:28:18 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TELECONTROL
OBJECT MODULE PLACED IN telecontrol.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE telecontrol.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*11.0592MHz晶振*/
2 #include<at89x52.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 #include"led.h"
6
7 sbit beep=P3^5;
8 sbit inf=P3^3;
9 sbit led1=P1^3;
10
11 uchar key_code=0;/*key_code:遥控键值*/
12 uint buf_key_code=0;/*键值暂存对应功能看主函数*/
13 uchar key_bit_count=0;/*键编码脉冲计数*/
14 uint count_T=0,buf_CT=0;/*count_T:定时器中断次数计数,buf_CT用来截获某一时间的count_T值以供判断*/
15 uchar common_code_count=0;/*前导码脉冲计数*/
16 uchar inf_status=0;/*inf_status:脉冲接收器所处的状态,0:无信号,1:前导码接收区,2:数据编码接收区*/
17
18 void main()
19 {
20 1 EA=1; //开全局中断
21 1 ET0=1; //开定时器0中断
22 1 TMOD=0x02;//T0设置为8位自动装载模式
23 1 TH0=0xCA; //自动装载值为202,中断间隔为50us
24 1 TL0=0xCA; //初值为202
25 1 IT1=1; //INT1为下降沿触发
26 1 EX1=1; //开外部中断
27 1 TR0=1; //启动定时器计数
28 1 while(1)
29 1 {
30 2 /*收到数字键则显示数字*/
31 2 if(key_code<10)
32 2 {
33 3 beep=0;//响蜂鸣器
34 3 //CLEARSCREEN;
35 3 led_display(key_code);//其它数字和编码值相同,直接显示键值
36 3 key_code=255;//清键值
37 3 delay_ms(20);
38 3 beep=1;
39 3 }
40 2 /*收到功能键则显示相应的功能*/
41 2 else if(key_code<50)
42 2 {
43 3 beep=0;
44 3 // CLEARSCREEN;//清屏
45 3 led_display(key_code);
46 3 key_code=255;//清键值
47 3 delay_ms(30);
48 3 beep=1;
49 3 }
50 2 delay_ms(50);
51 2 }
52 1 }
53
54 void Time0(void) interrupt 1
55 {
C51 COMPILER V8.02 TELECONTROL 05/19/2008 12:28:18 PAGE 2
56 1 count_T++;//周期累加
57 1 /*如果外部中断处于无信号区,则滤除前导宽脉冲中间的跳变毛刺*/
58 1 if(inf_status==0&&count_T<160)
59 1 {
60 2 EX1=0;
61 2 }
62 1 /*如果外部中断处于信号区,则滤除宽脉冲中间的跳变毛刺*/
63 1 else if((inf_status==1||inf_status==2)&&count_T<12)
64 1 {
65 2 EX1=0;
66 2 }
67 1 /*渡过上升沿后重新开放外部中断*/
68 1 else
69 1 {
70 2 EX1=1;
71 2 }
72 1 /*超过25ms,则锁定count_T值,等待下一次信号脉冲下降沿来解开*/
73 1 if(count_T>500)
74 1 {
75 2 inf_status=0;
76 2 count_T=600;
77 2 }
78 1 }
79
80 /***************************************************************
81 外部中断1,用于捕获红外脉冲信号
82 ****************************************************************/
83 void int_1(void) interrupt 2
84 {
85 1 led1=0;
86 1 TR0=1;
87 1 if(count_T>15&&count_T<250)//如果信号合法,则捕进buf_CT,count_T清0,对下一个脉冲信号计时
88 1 {
89 2 buf_CT=count_T;
90 2 count_T=0;
91 2 }
92 1 delay_ms(1);//延时100us以消除下降沿跳变抖动
93 1 if(inf==0)//INT1引脚稳定为低电平,则表示确实是信号,count_T重新计时,因上面延时了100us,故要补偿2次T0中断
94 1 {
95 2 count_T=10;
96 2 }
97 1 if(buf_CT>15&&buf_CT<250)//若收到的信号合法,则再进行以下的信号分析
98 1 {
99 2 if(inf_status==0)//若当前信号接收系统处于空闲状态,则标志进入前导码接收区
100 2 {
101 3 if(buf_CT>210&&buf_CT<250)//捕捉前导码
102 3 {
103 4 inf_status=1;//标志进入前导码接收区
104 4 buf_key_code=0;
105 4 key_bit_count=0;
106 4 buf_CT=0;
107 4 }
108 3 }
109 2 else if(inf_status==1)//前导码接收区(收到的脉冲全部忽略)
110 2 {
111 3 if((buf_CT>15&&buf_CT<25)||(buf_CT>32&&buf_CT<45))//脉冲接收
112 3 {
113 4 common_code_count++;//脉冲数计算
114 4 if(common_code_count>=26)//若收够了26个脉冲
115 4 {
116 5 inf_status=2;//则标志进入数据接收区
117 5 common_code_count=0;//脉冲计数清0
C51 COMPILER V8.02 TELECONTROL 05/19/2008 12:28:18 PAGE 3
118 5 key_bit_count=0;
119 5 buf_key_code=0;
120 5 }
121 4 }
122 3 }
123 2 else if(inf_status==2)//数据接收区
124 2 {
125 3 if(buf_CT>15&&buf_CT<25)//窄脉冲接收
126 3 {
127 4 buf_key_code>>=1;//接收0
128 4 key_bit_count++;
129 4
130 4 }
131 3 else if(buf_CT>32&&buf_CT<45)//宽脉冲接收
132 3 {
133 4 buf_key_code>>=1;
134 4 buf_key_code|=0x80;//接收1
135 4 key_bit_count++;//数据脉冲数累加,一共有8个
136 4 }
137 3 if(key_bit_count>=8)//若收完8位个数据脉冲,则进行以下的处理
138 3 {
139 4 inf_status=0;//标志接收系统返回空闲状态
140 4 key_bit_count=0;
141 4 key_code=buf_key_code;
142 4 buf_key_code=0;
143 4 TR0=0;
144 4 count_T=600;
145 4 }
146 3 }
147 2 buf_CT=0;
148 2 }
149 1 led1=1;
150 1 EX1=1;
151 1 }
152
153
154
155
156
157
158
159
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 725 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
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 + -