?? 遙控解碼程序.lst
字號:
C51 COMPILER V7.08 襙控絖碼砡序 08/22/2007 15:13:45 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 //紅外線遙控器軟件解碼原理和程序(C語言)
2 //紅外線一開始發(fā)送一段13.5ms的引導(dǎo)碼,引導(dǎo)碼由9ms的高電平和4.5ms的低電平組成,跟著引導(dǎo)碼
3 //是系統(tǒng)碼,系統(tǒng)反碼,按鍵碼,按鍵反碼,如果按著鍵不放,則遙控器則發(fā)送一段重復(fù)碼,重復(fù)碼
4 //由9ms的高電平,2.25ms的低電平,跟著是一個短脈沖。
5
6 #include"reg52.h"
7 #define NULL 0x00//數(shù)據(jù)無效
8 #define RESET 0X01//程序復(fù)位
9 #define REQUEST 0X02//請求信號
10 #define ACK 0x03//應(yīng)答信號,在接收數(shù)據(jù)后發(fā)送ACK信號表示數(shù)據(jù)接收正確,
11 //也位請求信號的應(yīng)答信號
12 #define NACK 0x04//應(yīng)答信號,表示接收數(shù)據(jù)錯誤
13 #define BUSY 0x05//忙信號,表示正在忙
14 #define FREE 0x06//空閑信號,表示處于空閑狀態(tài)
15 #define READ_IR 0x0b//讀取紅外
16 #define STORE_IR 0x0c//保存數(shù)據(jù)
17 #define READ_KEY 0x0d//讀取鍵值
18 #define RECEIVE 0Xf400//接收緩沖開始地址
19 #define SEND 0xfa00//發(fā)送緩沖開始地址
20 #define IR 0x50//紅外接收緩沖開始地址
21 #define HEAD 0xaa//數(shù)據(jù)幀頭
22 #define TAIL 0x55//數(shù)據(jù)幀尾
23 #define SDA P1^7
24 #define SCL P1^6
25
26
27 unsigned char xdata *buf1; //接受數(shù)據(jù)緩沖
28 unsigned int buf1_length; //接收到的數(shù)據(jù)實際長度
29 unsigned char xdata *buf2; //發(fā)送數(shù)據(jù)緩沖
30 unsigned int buf2_length; //要發(fā)送的數(shù)據(jù)實際長度
31 bit buf1_flag; //接收標志,1表示接受到一個數(shù)據(jù)幀,0表示沒有接受到數(shù)據(jù)幀或數(shù)據(jù)
32 //幀為空
33
34 bit buf2_flag; //發(fā)送標志,1表示需要發(fā)送或沒發(fā)送完畢,0表示沒有要發(fā)送的數(shù)據(jù)或
35 //發(fā)送完畢
36 unsigned char state1,state2; //用來標志接收字符的狀態(tài),state1用來表示接
37 //收狀態(tài),state2用來表示發(fā)送狀態(tài)
38 unsigned char data *ir;
39 union{
40 unsigned char a[2];
41 unsigned int b;
42 unsigned char data *p1[2];
43 unsigned int data *p2[2];
44 unsigned char xdata *p3; //紅外緩沖的指針
45 unsigned int xdata *p4;
46 }p;
47 //union{ //
48 // unsigned char a[2]; //
49 // unsigned int b;
50 // unsigned char data *p1[2];
51 // unsigned int data *p2[2];
52 // unsigned char xdata *p3;
53 // unsigned int xdata *p4; //地址指針
54 //}q; //
C51 COMPILER V7.08 襙控絖碼砡序 08/22/2007 15:13:45 PAGE 2
55
56 union{
57 unsigned char a[2];
58 unsigned int b;
59 }count;
60 union{
61 unsigned char a[2];
62 unsigned int b;
63 }temp;
64 union{
65 unsigned char a[4];
66 unsigned int b[2];
67 unsigned long c;
68 }ir_code;
69
70 union{
71 unsigned char a[4];
72 unsigned int b[2];
73 unsigned long c;
74 unsigned char data *p1[4];
75 unsigned int data *p2[4];
76 unsigned char xdata *p3[2];
77 unsigned int xdata *p4[2];
78 }I;
79 unsigned char ir_key;
80 bit ir_flag; //紅外接收標志,0為緩沖區(qū)空,1為接收成功,2為緩沖溢出
81 void sub(void);
82 void delay(void);
83 void ie_0(void);
84 void tf_0(void);
85 void ie_1(void);
86 void tf_1(void);
87 void tf_2(void);
88 void read_ir(void);
89 void ir_jiema(void);
90 void ir_init(void);
91 void ir_exit(void);
92 void store_ir(void);
93 void read_key(void);
94 void reset_iic(void);
95 unsigned char read_byte_ack_iic(void);
96 unsigned char read_byte_nack_iic(void);
97 bit write_byte_iic(unsigned char a);
98 void send_ack_iic(void);
99 void send_nack_iic(void);
100 bit receive_ack_iic(void);
101 void start_iic(void);
102 void stop_iic(void);
103 void write_key_data(unsigned char a);
104 unsigned int read_key_data(unsigned char a);
105 void ie0(void) interrupt 0{ie_0();}
106 void tf0(void) interrupt 1{tf_0();}
107 void ie1(void) interrupt 2{ie_1();}
108 void tf1(void) interrupt 3{tf_1();tf_2();}
109 void tf2(void) interrupt 5{ //采用中斷方式跟查詢方式相結(jié)合的辦法解碼
110 1 EA=0; //禁止中斷
111 1 if(TF2){ //判斷是否是溢出還是電平變化產(chǎn)生的中斷
112 2 TF2=0; //如果是溢出產(chǎn)生的中斷則清除溢出位,重新開放中斷退出
113 2 EA=1;
114 2 goto end;
115 2 }
116 1 EXF2=0; //清除電平變化產(chǎn)生的中斷位
C51 COMPILER V7.08 襙控絖碼砡序 08/22/2007 15:13:45 PAGE 3
117 1 *ir=RCAP2H; //把捕捉的數(shù)保存起來
118 1 ir++;
119 1 *ir=RCAP2L;
120 1 *ir++;
*** WARNING C275 IN LINE 120 OF 遙控解碼程序.C: expression with possibly no effect
121 1 F0=1;
122 1 TR0=1; //開啟計數(shù)器0
123 1 loop:
124 1 TL0=0; //將計數(shù)器0重新置為零
125 1 TH0=0;
126 1 while(!EXF2){ //查詢等待EXF2變?yōu)?
127 2 if(TF0)goto exit; //檢查有沒超時,如果超時則退出
128 2 };
129 1 EXF2=0; //將EXF2清零
130 1 if(!TH0) //判斷是否是長低電平脈沖過來了
131 1 { //不是長低電平脈沖而是短低電平
132 2 if(F0)count.b++; //短脈沖數(shù)加一
133 2 temp.a[0]=RCAP2H; //將捕捉數(shù)臨時存放起來
134 2 temp.a[1]=RCAP2L;
135 2 goto loop; //返回繼續(xù)查詢
136 2 }
137 1 else{ //是低電平脈沖,則進行處理
138 2
139 2 F0=0;
140 2 *ir=temp.a[0]; //把連續(xù)的短脈沖總時間記錄下來
141 2 ir++;
142 2 *ir=temp.a[1];
143 2 ir++;
144 2 *ir=RCAP2H; //把長電平脈沖時間記錄下來
145 2 ir++;
146 2 *ir=RCAP2L;
147 2 ir++;
148 2 if(ir>=0xda) {
149 3 goto exit; //判斷是否溢出緩沖,如果溢出則失敗退出
150 3 }
151 2 goto loop; //返回繼續(xù)查詢
152 2 }
153 1 exit:
154 1 ir_flag=1; //置ir_flag為1表示接收成功
155 1 end:
156 1 ;
157 1 }
158
159
160 void rs232(void) interrupt 4{
161 1 static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用來接收
162 1 //發(fā)送臨時用,rsbuf1,rsbuf2用來分別用來存放接收發(fā)送的半字節(jié)
163 1 EA=0; //禁止中斷
164 1 if(RI){
165 2 RI=0; //清除接收中斷標志位
166 2 sbuf1=SBUF; //將接收緩沖的字符復(fù)制到sbuf1
167 2 if(sbuf1==HEAD){ //判斷是否幀開頭
168 3 state1=10; //是則把state賦值為10
169 3 buf1=RECEIVE; //初始化接收地址
170 3 }
171 2 else{
172 3 switch(state1){
173 4 case 10:sbuf2=sbuf1>>4; //把高半字節(jié)右移到的半字節(jié)
174 4 sbuf2=~sbuf2; //把低半字節(jié)取反
175 4 if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判斷接收是否正確
176 4 { //接收錯誤,有可能接收的是數(shù)據(jù)幀尾,也有可能是接收錯
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -