📄 rs232_com.lst
字号:
C51 COMPILER V7.09 RS232_COM 12/12/2008 17:08:55 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE RS232_COM
OBJECT MODULE PLACED IN RS232_com.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RS232_com.C BROWSE DEBUG OBJECTEXTEND
line level source
1
2 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3 //描述:
4 // 该程序INT0按键程序+显示程序+RS232通讯 &
5 // 按键计数显示在数码管1-2(从右至左),并且发送该数据。 &
6 // 接收到的数据在数码管3-4上显示。 &
7 // 通讯波特率:19200 &
8 // 每次收发一个字节 &
9
10 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
11 //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! &
12 //【声明】 作者: PIAE小组 &
13
14 #include <reg52.h>
15 #include <intrins.h>
16 #include <RS232_def.h>
17
18
19 void INT0_Counter( void ) interrupt 0 using 1
20 {//INT0按键为计数按键
21 1 EA = 0;
22 1 Show_TX_Data++; //计数单元加1
23 1 TXD_flag = 1;//置要发送标志位
24 1 EA = 1;
25 1 }
26
27
28 void RS232_RXD( void ) interrupt 4 using 1
29 {//接收数据函数,在中断服务程序中调用
30 1 EA = 0;//关闭所有中断
31 1 ES = 0;//关闭串口
32 1 if(RI==1)
33 1 {
34 2 RI = 0;
35 2 RX_data = SBUF;
36 2 RXD_flag = 1;//置接收到数据标志
37 2 }
38 1 _nop_();
39 1 ES = 1;//打开串口
40 1 EA = 1;//打开中断
41 1 }
42 //*******************************************************
43 void delay_ms(void) //毫秒延时
44 {
45 1 unsigned int i;
46 1 for (i=0;i<140;i++)
47 1 {
48 2 }
49 1 }
50
51 void delay_nms(unsigned int n) //延时周期
52 {
53 1 unsigned int i;
54 1 for (i=0;i<n;i++)
55 1 {
C51 COMPILER V7.09 RS232_COM 12/12/2008 17:08:55 PAGE 2
56 2 delay_ms();
57 2 }
58 1 }
59
60
61 unsigned long decode(void) //无线解码
62 {
63 1 unsigned long DATA; //记录数据
64 1 unsigned char count; //暂时计数
65 1 unsigned int i;
66 1
67 1 DATA=0; i=0;
68 1 while(1)
69 1 {
70 2 //
71 2 if(!RFBIT) //低位计数
72 2 {
73 3 NOPS; //
74 3 i++; //计数增加
75 3 }
76 2 else
77 2 { if (i>700) break;
78 3 else i=0; }
79 2
80 2 }
81 1
82 1
83 1
84 1
85 1 for (count=0;count<24;count++) //开始收集
86 1 {
87 2
88 2 /*测量高电平宽度*/
89 2 i=0; //宽度计数
90 2 while (RFBIT) //高位计数
91 2 {
92 3 NOPS; //
93 3 i++; //计数增加
94 3 //if (i>192) goto end; //限时解码
95 3 }
96 2
97 2 /*分辨出电平高低*/
98 2
99 2 DATA*=2; //数据左移
100 2
101 2 if (i<64) //分辨高低
102 2 {
103 3 if (!((56>i)&(i>20))) goto end; //电平合法
104 3 DATA+=0; //记低电平
105 3 }
106 2 else
107 2 {
108 3 if (!((200>i)&(i>72))) goto end; //电平合法
109 3 DATA+=1; //记高电平
110 3 }
111 2
112 2 /*测量低电平宽度*/
113 2
114 2 while (!(RFBIT) ) //低位计数
115 2 {
116 3 NOPS; //
117 3 i++; //计数增加
C51 COMPILER V7.09 RS232_COM 12/12/2008 17:08:55 PAGE 3
118 3 if (i>300) goto end; //限时解码
119 3 }
120 2
121 2 /*低电平是否过窄*/
122 2 //if (i<96) goto end; //对比宽度
123 2 }
124 1 /*解码成功返结果*/
125 1 return DATA; //成功返回
126 1
127 1
128 1 /*有误码结束解码*/
129 1
130 1 end:
131 1 return 0; //误码结束
132 1 }
133
134
135 void main(void)
136 {
137 1 unsigned long DATA,i;
138 1 uchar temp,temp1;
139 1
140 1
141 1 CPU_init();
142 1 _nop_();
143 1 led_seg7(1,1);
144 1 led_seg7(3,1);
145 1 DATA = 0;
146 1 i = 0;
147 1 while(1)
148 1 {
149 2 //NOPS;
150 2
151 2 //解码程序
152 2 temp = (unsigned char) (DATA);
153 2 temp1 = (unsigned char) (DATA>>8);
154 2 if(DATA > 0)
155 2 {
156 3 led_seg7(1,temp);
157 3 led_seg7(3,temp1);
158 3 if(i>2000)
159 3 {
160 4 DATA = 0;
161 4 i = 0;
162 4 }
163 3 else
164 3 i++;
165 3 }
166 2 else
167 2 DATA = decode();
168 2
169 2
170 2
171 2 ///////////////////////数码管显示程序/////////////////////////////////
172 2
173 2 }//while 结束
174 1 }//main结束
175
176
177 void Delay(uchar delay_time)
178 {//延时程序
179 1 while(delay_time--)
C51 COMPILER V7.09 RS232_COM 12/12/2008 17:08:55 PAGE 4
180 1 {}
181 1 }
182
183
184 void CPU_init(void)
185 {//初始化CPU
186 1 SCON = 0x50; //串口方式1
187 1 PCON = 0x80; //串口波特率加速
188 1 TMOD = 0x21;
189 1 TH1=0xFD; //19200bps
190 1 TL1=0xFD;
191 1 TR1 = 1;
192 1 TI = 0;
193 1 RI = 0;
194 1 PS = 1; //串口中断的优先级设为最高
195 1
196 1 IT0 = 1;//外部中断0负边沿触发
197 1 EX0 = 1;//打开外部中断0
198 1
199 1 ES = 0;//关闭串口中断
200 1 EA = 0; //关闭总中断
201 1 SJA1000_CS = 1;//片选无效
202 1 }
203
204 void RS232_TXD( void )
205 {
206 1 EA = 0;//关闭所有中断
207 1 ES = 0;//关闭串口中断,采用查询发送方式
208 1 TI = 1;
209 1 while(TI)
210 1 {
211 2 TI = 0;//一字节发送完后清除标志位
212 2 SBUF = TX_data;
213 2 while(!TI)
214 2 {}//等待发送
215 2 TI = 0;
216 2 }
217 1 _nop_();
218 1 ES = 1;//打开串口中断
219 1 EA = 1;//打开中断
220 1 }
221
222 void led_seg7(uchar from,uchar number) //from(1_4):数码管显示起始位置(从右到左),number:显示的数
223 {
224 1 uchar digit,temp_l;
225 1 uchar temp_h=0x7f;
226 1 temp_h = _cror_(temp_h,from-1); //确定从哪一位开始显示,即确定高四位
227 1 temp_h = temp_h & 0xf0; //取高四位
228 1 temp_l = P2 & 0x0f; //取P2的低四位
229 1 P2 = temp_h | temp_l; //设定P2口
230 1
231 1 if(number==0)
232 1 {
233 2 P0 = led[0];
234 2 Delay(5);
235 2 P0 = 0xff;
236 2 }
237 1 else
238 1 {
239 2 while(number)
240 2 {
241 3 digit = number%10 ;
C51 COMPILER V7.09 RS232_COM 12/12/2008 17:08:55 PAGE 5
242 3 number /= 10;
243 3 P0 = led[digit] ;
244 3 Delay(5);
245 3 temp_h = P2 & 0xf0; //取P2的高四位
246 3 temp_h = temp_h | 0x0f; //拼装 temp_h,进行位选
247 3 temp_h = _cror_(temp_h,1);
248 3 temp_h = temp_h & 0xf0; //取高四位
249 3 temp_l = P2 & 0x0f; //取P2的低四位
250 3 P0 = 0xff;
251 3 P2 = temp_h | temp_l; //设定P2口
252 3 }//while结束
253 2 }//else结束
254 1
255 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 618 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 15
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -