📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 // Target : STC12C5A60S2
2 // Crystal: 11.0592Mhz
3 #include <reg52.h>
4 #include "fun.h"
5
6 //声明
7 void init_devices(void);
8
9 void port_init(void)
10 {
11 1 //设置P3.2~P3.4为输入,P3.5~P3.7为开漏输出
12 1 P3M1 = 0xfc; //1111 1100
13 1 P3M0 = 0xe0; //1110 0000
14 1 //设置P2.0为开漏输出
15 1 P2M1=0X01;
16 1 P2M0=0X01;
17 1
18 1 d_vote = 1; //关闭投票指示灯
19 1 //关闭d1 d2 d3 ,按键s1 s2 s3为高电平
20 1 P3 = 0xff;
21 1
22 1 //设置P1.4为推挽输出,P1.0、P1.7为高阻输入(AD转换用)
23 1 P1M1 = 0x81; //1000 0001
24 1 P1M0 = 0x10; //0001 0000
25 1
26 1
27 1 m_power = 0; //打开无线模块电源
28 1 }
29
30 //Watchdog initialize
31 //约568.8ms
32 void watchdog_init(void)
33 {
34 1 WDT_CONTR = 0x33;//启动定时器,11.0592MHz晶振下,溢出时间568.8ms
35 1 }
36
37
38 //外部中断0
39 void INT0_interrupt() interrupt 0
40 {
41 1 //external interupt on INT0
42 1 //关外部中断0、外部中断1
43 1 IE &= 0xfa; //1111 1010
44 1
45 1 m_power = 0; //打开无线模块电源
46 1 d_vote = 1; //关闭投票指示灯
47 1 P3 |= 0xe0; //关闭d1 d2 d3
48 1
49 1 d3 = 0; //点亮d3
50 1 msdelay(500);
51 1 WDR(); //喂狗
52 1 d2 = 0; //点亮d2
53 1 msdelay(500);
54 1 WDR();
55 1 d1 = 0; //点亮d1
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 2
56 1 msdelay(500);
57 1 WDR();
58 1 d_vote = 0; //点亮 d_vote
59 1 msdelay(500);
60 1 WDR();
61 1
62 1 init_devices();
63 1
64 1 m_power = 0; //打开无线模块电源
65 1 d_vote = 1; //关闭投票指示灯
66 1 P3 |= 0xe0; //关闭d1 d2 d3
67 1 }
68
69 //外部中断1
70 void INT1_interrupt() interrupt 2
71 {
72 1 //external interupt on INT1
73 1 //关外部中断0、外部中断1
74 1 IE &= 0xfa; //111 1010
75 1
76 1 m_power = 0; //打开无线模块电源
77 1
78 1 //LED从下到上依次点亮
79 1 d_vote = 1; //关闭投票指示灯
80 1 P3 |= 0xe0; //关闭d1 d2 d3
81 1
82 1 d3 = 0; //点亮d3
83 1 msdelay(500);
84 1 WDR(); //喂狗
85 1 d2 = 0; //点亮d2
86 1 msdelay(500);
87 1 WDR();
88 1 d1 = 0; //点亮d1
89 1 msdelay(500);
90 1 WDR();
91 1 d_vote = 0; //点亮 d_vote
92 1 msdelay(500);
93 1 WDR();
94 1
95 1 init_devices();
96 1
97 1 m_power = 0; //打开无线模块电源
98 1 d_vote = 1; //关闭投票指示灯
99 1 P3 |= 0xe0; //关闭d1 d2 d3
100 1 }
101
102 //TIMER0 initialize
103 // desired value: 16mSec
104 // actual value: 16mSec
105 void timer0_init()
106 {
107 1 AUXR &=0x7F; //T0x12 = 0,定时器0使用12分频
108 1
109 1 TMOD |= 0X01;
110 1 TH0 = T0_16ms >> 8;
111 1 TL0 = T0_16ms,
112 1 ET0 = 1; //允许T0中断
113 1 }
114
115 //定时器0中断 ,16ms一次
116 void Timer0_interrupt() interrupt 1
117 {
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 3
118 1 //重装初值
119 1 TH0 = T0_16ms >> 8; //TH0 = T0_16ms / 256 = 0xc6
120 1 TL0 = T0_16ms; //TL0 = T0_16ms % 256 = 0x66
121 1
122 1 cnt++;
123 1 if (cnt==me) //轮到自己发
124 1 {
125 2 if (addr!=0)//地址没有问题,可以发送
126 2 {
127 3 TR0 = 0; //关定时器
128 3 REN = 0; //禁止接收数据
129 3 putchar(sent[0]);
130 3 putchar(sent[1]);
131 3 putchar(sent[2]);
132 3 REN = 1; //允许接收数据
133 3 }
134 2 else
135 2 {
136 3 TR0 = 0; //关定时器
137 3 REN = 1; //允许接收数据
138 3 }
139 2 }
140 1 }
141
142 //TIMER2 initialize
143 // desired value: 50mSec
144 // actual value: 50.000mSec (0.0%)
145 void timer1_init()
146 {
147 1 AUXR &=0xbF; //T1x12 = 0,定时器1使用12分频
148 1
149 1 TMOD |= 0X10; //定时器1模式1,16bit
150 1 TH1 = T1_50ms >> 8;
151 1 TL1 = T1_50ms;
152 1 ET1 = 1; //允许T1中断
153 1 }
154
155 //定时器1中断 ,50ms一次
156 void Timer1_interrupt() interrupt 3
157 {
158 1 //重装初值
159 1 TH1 = T1_50ms >> 8;
160 1 TL1 = T1_50ms;
161 1 time++; //按键计时
162 1 time_f++; //空闲计时
163 1 if (time==10) //按键之后500ms
164 1 {
165 2 //关按键灯
166 2 P3 |= 0xe0; //关d1 d2 d3
167 2 }
168 1
169 1 if (time==40)//按键之后2S
170 1 {
171 2 key1=0; //进入工厂模式步骤清零
172 2 }
173 1
174 1 if (time_f==10) //500ms未接收到数据
175 1 {
176 2 recnum=0; //接收数据清零
177 2 }
178 1
179 1 if (time_f==1200) //1分钟未接收到数据 没有按键
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 4
180 1 {
181 2 sleep(); //休眠 power down
182 2 }
183 1 }
184
185 //UART0 initialize
186 // desired baud rate: 9600
187 // char size: 8 bit
188 // parity: Disabled
189 void uart0_init(void)
190 {
191 1 //BRTR=1允许BRT BRTx12=1 S1BRS = 1使用BRT
192 1 AUXR |=0x15; //0001 0101
193 1 //方式1,8 N 1,允许接收
194 1 SCON = 0x50; //SM0 = 0,SM1=1,REN=1;
195 1
196 1 //11.0592MHz,9600
197 1 BRT = 256 - (fosc/32/9600); //BRT = 0xdc
198 1 ES = 1; //允许串口中断
199 1 }
200
201 //串口中断
202 void USART_interrupt() interrupt 4
203 {
204 1 //uart has received a character in SBUF
205 1 unsigned int i;
206 1
207 1 //如果是接收中断
208 1 if (RI)
209 1 {
210 2 RI=0; //清接收中断
211 2 time_f=0; //空闲时间计数器清零
212 2
213 2 disable(); //关闭定时器0、定时器1、ADC转换
214 2
215 2 //防止缓冲区数组溢出错误
216 2 if (recnum < 5)
217 2 {
218 3 rec[recnum]=SBUF;
219 3 recnum++; //接收计数指针+1
220 3
221 3 loop: //开始处理流程
222 3 if (recnum>2) //至少收了3个数据
223 3 {
224 4 if ((rec[0]&0x0c)==0x00 && ((rec[0]&0x80)==0x00)) //包头正确 上位机下发的
225 4 {
226 5 //计算校验
227 5 checkXOR=rec[0] ^ rec[1];
228 5
229 5 if ((checkXOR==rec[2])) //校验正确
230 5 {
231 6 recieve(); //当作协议处理
232 6 recnum=0; //接收清零
233 6
234 6 goto loop1; //跳走
235 6 }
236 5 else //校验不正确
237 5 {
238 6 //缓冲区整体前移
239 6 for (i=1;i<recnum;i++)
240 6 {
241 7 rec[i-1]=rec[i];
C51 COMPILER V8.08 MAIN 04/06/2012 21:53:17 PAGE 5
242 7 }
243 6 recnum--;
244 6
245 6 if (recnum<=0) //接收缓冲区没有数据了
246 6 {
247 7 //计数器清零,开中断返回
248 7 recnum=0;
249 7 goto loop1;
250 7 }
251 6 else //接收缓冲区还有数据
252 6 {
253 7 goto loop; //跳回去再检查
254 7 }
255 6 }
256 5 }
257 4 else //不是包头
258 4 {
259 5 //缓冲区整体前移
260 5 for (i=1;i<recnum;i++)
261 5 {
262 6 rec[i-1]=rec[i];
263 6 }
264 5 recnum--;
265 5
266 5 if (recnum<=0) //接收缓冲区没有数据了
267 5 {
268 6 //计数器清零,开中断返回
269 6 recnum=0;
270 6 goto loop1; //跳走
271 6 }
272 5 else //接收缓冲区还有数据
273 5 {
274 6 goto loop; //跳回去再检查
275 6 }
276 5 }
277 4 }
278 3 else //<=2
279 3 {
280 4 //什么也不做,开中断返回主程序,等待接收下一个数据
281 4 }
282 3 }
283 2 else //如果recnum >=5,缓冲区溢出
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -