?? 遙控紅外編碼.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 + -