📄 遥控红外编码.lst
字号:
C51 COMPILER V7.08 襙控_焱_盻码 08/22/2007 11:21:59 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE 襙控_焱_盻码
OBJECT MODULE PLACED IN 遥控红外编码.OBJ
COMPILER INVOKED BY: D:\单片机~1\C51\Bin\c51.exe 遥控红外编码.c DB OE SMALL ROM(LARGE)
line level source
*** WARNING C500 IN LINE 1 OF 遥控红外编码.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1 #include<reg52.h>
2 /*用AT89S51单片机制作红外电视遥控器
3 一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。
4 当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:
5 采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;
6 以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
7 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红
8 外线向空间发射。一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,
9 能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,
10 用于核对数据是否接收准确。根据红外编码的格式,发送数据前需要先发送9ms的起始码和4.5ms
11 的结果码。
12
13 接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输
14 出低电平,否则为高电平。所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低电
15 平处发送38kHz红外信号,高电平处则不发送红外信号。
16 C51程序代码:*/
17
18 bit OP; //红外发射管的亮灭
19 sbit p3_4=P3^4;
20 unsigned int count; //延时计数器
21 unsigned int endcount; //终止延时计数
22 unsigned char flag; //红外发送标志
23 char iraddr1; //十六位地址的第一个字节
24 char iraddr2; //十六位地址的第二个字节
25
26 void SendIRdata(char p_irdata);
27 void delay();
28
29 void main(void)
30 {
31 1 count=0;
32 1 flag=0;
33 1 OP=0;
34 1 p3_4=0;
35 1
36 1 EA=1; //允许CPU中断
37 1 TMOD=0x11; //设定时器0和1为16位模式1
38 1 ET0=1; //定时器0中断允许
39 1
40 1
41 1 TH0=0xFF;
42 1 TL0=0xE6; //设定时值0为38K 也就是每隔26us中断一次
43 1 TR0=1;//开始计数
44 1
45 1 iraddr1=3;
46 1 iraddr2=252;
47 1
48 1
49 1 do{
50 2 delay();
51 2 SendIRdata(12);
52 2 }while(1);
53 1 }
54
C51 COMPILER V7.08 襙控_焱_盻码 08/22/2007 11:21:59 PAGE 2
55 //定时器0中断处理
56 void timeint(void) interrupt 1 using 2
57 {
58 1 TH0=0xFF;
59 1 TL0=0xE6; //设定时值为38K也就是每隔26us中断一次
60 1 count++;
61 1
62 1 if (flag==1)
63 1 {
64 2 OP=~OP;
65 2 }
66 1 else
67 1 {
68 2 OP=0;
69 2 }
70 1 p3_4=OP;
71 1 }
72
73
74 void SendIRdata(char p_irdata)
75 {
76 1 int i;
77 1 char irdata=p_irdata;
78 1
79 1 //发送9ms的起始码
80 1 endcount=223;
81 1 flag=1;
82 1 count=0;
83 1 do{}while(count<endcount);
84 1
85 1 //发送4.5ms的结果码
86 1 endcount=117;
87 1 flag=0;
88 1 count=0;
89 1 do{}while(count<endcount);
90 1
91 1 //发送十六位地址的前八位
92 1 irdata=iraddr1;
93 1 for(i=0;i<8;i++)
94 1 {
95 2
96 2 //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
97 2 endcount=10;
98 2 flag=1;
99 2 count=0;
100 2 do{}while(count<endcount);
101 2
102 2 //停止发送红外信号(即编码中的高电平)
103 2 if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
104 2 {
105 3 endcount=41; //1为宽的高电平
106 3 }
107 2 else
108 2 {
109 3 endcount=15; //0为窄的高电平
110 3 }
111 2 flag=0;
112 2 count=0;
113 2 do{}while(count<endcount);
114 2
115 2 irdata=irdata>>1;
116 2 }
C51 COMPILER V7.08 襙控_焱_盻码 08/22/2007 11:21:59 PAGE 3
117 1
118 1 //发送十六位地址的后八位
119 1 irdata=iraddr2;
120 1 for(i=0;i<8;i++)
121 1 {
122 2 endcount=10;
123 2 flag=1;
124 2 count=0;
125 2 do{}while(count<endcount);
126 2
127 2 if(irdata-(irdata/2)*2)
128 2 {
129 3 endcount=41;
130 3 }
131 2 else
132 2 {
133 3 endcount=15;
134 3 }
135 2 flag=0;
136 2 count=0;
137 2 do{}while(count<endcount);
138 2
139 2 irdata=irdata>>1;
140 2 }
141 1
142 1 //发送八位数据
143 1 irdata=p_irdata;
144 1 for(i=0;i<8;i++)
145 1 {
146 2 endcount=10;
147 2 flag=1;
148 2 count=0;
149 2 do{}while(count<endcount);
150 2
151 2 if(irdata-(irdata/2)*2)
152 2 {
153 3 endcount=41;
154 3 }
155 2 else
156 2 {
157 3 endcount=15;
158 3 }
159 2 flag=0;
160 2 count=0;
161 2 do{}while(count<endcount);
162 2
163 2 irdata=irdata>>1;
164 2 }
165 1
166 1 //发送八位数据的反码
167 1 irdata=~p_irdata;
168 1 for(i=0;i<8;i++)
169 1 {
170 2 endcount=10;
171 2 flag=1;
172 2 count=0;
173 2 do{}while(count<endcount);
174 2
175 2 if(irdata-(irdata/2)*2)
176 2 {
177 3 endcount=41;
178 3 }
C51 COMPILER V7.08 襙控_焱_盻码 08/22/2007 11:21:59 PAGE 4
179 2 else
180 2 {
181 3 endcount=15;
182 3 }
183 2 flag=0;
184 2 count=0;
185 2 do{}while(count<endcount);
186 2
187 2 irdata=irdata>>1;
188 2 }
189 1
190 1 endcount=10;
191 1 flag=1;
192 1 count=0;
193 1 do{}while(count<endcount);
194 1 flag=0;
195 1 }
196
197 void delay()
198 {
199 1 int i,j;
200 1 for(i=0;i<400;i++)
201 1 {
202 2 for(j=0;j<100;j++)
203 2 {
204 3 }
205 2 }
206 1 }
207
208
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 550 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -