📄 rf2272.lst
字号:
C51 COMPILER V7.08 RF2272 09/12/2007 11:40:14 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE RF2272
OBJECT MODULE PLACED IN RF2272.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE RF2272.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********** 用单片机代替PT2272解码PT2262的程序 **********
2 晶振: 12MHz
3 开始时间: 2007-09-07 15:20
4 最后修改:
5
6 *********************************** 说 明 ***********************************
7 接收到的信号为发送信号的反码因为每检测到按键有效一次PT2262 都发送四次编码我们可以
8 利用这一特点来解码先检测有没有接收到信息当有的时候我们就去掉第一次编码的信号检测5ms 的
9 高电平来检测编码的开始信号接收到5ms 的高电平后才开始解码我们可以发现每个码的长度都是1.2ms
10 左右每一个编码都是由低电平开始然后到高电平又到低电平又回到高电平我们从第一个高电平
11 的宽度可以把1 码区分出来剩下的悬空码和0 码可以从第二个高电平的宽度区分出来
12 具体的单片机译码方法如下
13 由高电平开始检测到下降沿时就延时300us 读取接收的状态记为A0 然后再检测下一个下降沿
14 降沿后又延时300us 读取接收的状态记为A1 这样就把一个编码给译出来了
15 A0 A1 和悬空1 码0 码的关系如下:
16 A0 A1 代码
17 0 0 1 码
18 0 1 错误
19 1 0 悬空
20 1 1 0 码
21 ******************************************************************************/
22 #include <my_89x51.h>
23 #include <intrins.h>
24 #define uint unsigned int
25 #define ulong unsigned long
26 #define uchar unsigned char
27
28
29 uint key_high_low;
30 uint key1;
31 uchar key_data;
32 //位定义
33 sbit W_REM =P3^3; //遥控接收输入脚
34 sbit LEDR =P1^3;
35 sbit LEDG =P1^4;
36 bit bdata error;
37 bit bdata recv_flg, //接收正确位标志(1:正确 0:错误)
38 //因为当按住PT2262的按键不放的时候PT2262会把编码不断的送出
39 //设置lianji_flg位用来检测按键有没有放开过如果没有放开则不再响应
40 lianji_flg; //按键没有放开过标志(1:连击 0:点击)
41 uchar addr_user_a0; //设定的8位地址密码A0
42 uchar addr_user_a1; //设定的8位地址密码A1
43
44
45 //------------------------------------- sub functon ----------------------------------------------
46
47 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
48 void d1ms (uint ljh_in) /*1mS延时函数*/
49 {
50 1 uint data ljh_i;
51 1 uchar data ljh_j;
52 1 for(ljh_i=0;ljh_i<ljh_in;ljh_i++){
53 2 for(ljh_j=0;ljh_j<108;ljh_j++){
54 3 _nop_(); _nop_();
55 3 _nop_(); _nop_();
C51 COMPILER V7.08 RF2272 09/12/2007 11:40:14 PAGE 2
56 3 _nop_(); _nop_();
57 3 }
58 2 }
59 1 }
60 //<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
61 void ledg()
62 {
63 1 d1ms(100);
64 1 LEDG=!LEDG;
65 1 d1ms(100);
66 1 LEDG=!LEDG;
67 1 d1ms(100);
68 1 LEDG=!LEDG;
69 1 d1ms(100);
70 1 LEDG=!LEDG;
71 1 }
72 //<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
73 void ledr()
74 {
75 1 d1ms(50);
76 1 LEDR=!LEDR;
77 1 d1ms(50);
78 1 LEDR=!LEDR;
79 1 d1ms(50);
80 1 LEDR=!LEDR;
81 1 }
82
83 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
84 void d50us(uchar n) //50uS延时
85 {
86 1 uchar data i,j;
87 1 for(j=n;j;j--) { //[1T+2T+(2i+2)T+1T+2T]*n+1T+2T+2T=(2i+8)*n+5T
88 2 for(i=21;i;i--) ;//延时2T+2T*i=(2i+2)T
89 2 }
90 1 }
91
92 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
93 PT2272_deco() //解码
94 {
95 1 uchar i;
96 1 uint j;
97 1 bit time;
98 1 bit Key_Low_Highbit;
99 1 error =0;
100 1 time = 0;
101 1 j =0;
102 1 recv_flg =0;
103 1 if(recv_flg) ;
104 1 else {//先找出接收码的开头即5ms左右的高电平 //设置高电平时间为4~6ms//检测和等待4ms的高电平
105 2 for(i=80;i;i--) { //延时4mS
106 3 if(!W_REM) i=80;
107 3 else d50us(1);
108 3
109 3 j++;
110 3 if(j>= 400 ) {time =1;break;}//超时退出5ms+25ms
111 3 }
112 2 //等待在2ms内接收到的低电平 --------------------------------------------
113 2 for(i=40;i;i--) { //延时4mS
114 3 if(!W_REM) break;
115 3 else d50us(1);
116 3 }
117 2
C51 COMPILER V7.08 RF2272 09/12/2007 11:40:14 PAGE 3
118 2 //4ms到6ms内接收到下降沿则跳去解码否则返回
119 2 //超出6ms接收错误返回
120 2 if(time|!i) {
121 3 // ledg();
122 3 recv_flg =0; //清按键没有放开过标志
123 3 error = 1;
124 3 }//干扰信号处理
125 2 //等待300us后采集接收信号
126 2 key_high_low = 0;
127 2 key_data = 0;
128 2 if (!error){
129 3 ledg();
130 3 //进入代码接收部分 24个码位 8位地址4位数据
131 3 /* for(i=0;i<12;i++) {
132 3 LEDG=!LEDG;
133 3 d50us(6);
134 3 if(W_REM) {
135 3 key_data |=0x01;
136 3 }
137 3 key_data <<=0x01;
138 3 //左移一位,从key_data 到key_high_low
139 3 Key_Low_Highbit = key_data & 0x80;
140 3 key_high_low <<= 1;
141 3 if(Key_Low_Highbit)
142 3 key_high_low += 0x01;
143 3 //等待第二个下降沿
144 3 while(!W_REM) ;
145 3 while(W_REM) ;
146 3 //等待300us后采集接收信号
147 3 d50us(6);
148 3 if(W_REM) {
149 3 key_data |=0x01;
150 3 }
151 3 //等待第二个码值的下降沿
152 3 key_data <<=0x01;
153 3
154 3 Key_Low_Highbit = key_data & 0x80;
155 3 key_high_low <<= 1;
156 3 if(Key_Low_Highbit)
157 3 key_high_low += 0x01;
158 3
159 3 while(!W_REM) ;
160 3 while(W_REM) ;//LEDG=~LEDG;
161 3 }//12次接收
162 3 */ }
163 2
164 2 }
165 1 key1 = key_high_low;
166 1 if (key_high_low == 0xaaaa){
167 2 ledg();
168 2 recv_flg = 1;
169 2 lianji_flg =1;}
170 1 else {
171 2 recv_flg = 0;
172 2 lianji_flg = 0;}
173 1
174 1
175 1 }
*** WARNING C280 IN LINE 98 OF RF2272.C: 'Key_Low_Highbit': unreferenced local variable
176 //<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
177 void remote_2272_deco() //接收遥控码(解码程序)
178 {
C51 COMPILER V7.08 RF2272 09/12/2007 11:40:14 PAGE 4
179 1 uint i;
180 1 //检测50ms内有没有编码接收
181 1 for(i=1000;i;i--) {
182 2 if(!W_REM) {
183 3
184 3 PT2272_deco(); //解码
185 3 break;
186 3 }
187 2 else d50us(1); //50uS延时
188 2 }
189 1 recv_flg =0; //清按键没有放开过标志
190 1 }
191 //<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
192
193 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
194 void work() //控制输出 //把选中的LED取反
195 {
196 1 if(recv_flg) { //接收不正确,退出
197 2 recv_flg=0; //清接收正确标志位
198 2 //LEDG = !LEDG;
199 2 d50us(200);
200 2 }
201 1 }
202 //<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
203
204 // ==================================== main function ============================================
205 void main (void)
206 {
207 1 //上电初始化 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
208 1 P1 =0xff;
209 1 P3 =0xff;
210 1 d1ms(200);
211 1 //编码设定为:A0~A7地址编码为:悬空 +++++++++++++++++++++++++++++++++++++++++++++
212 1 addr_user_a0 =0xaa;
213 1 addr_user_a1 =0xaa;
214 1 ledr();
215 1
216 1 //start: //================================================================================
217 1 while(1) {
218 2 remote_2272_deco(); //接收遥控码
219 2 // work(); //控制输出
220 2 LEDR =!LEDR;
221 2 d1ms(200);
222 2
223 2 }
224 1 }
225 //==============================================================================================
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -