📄 tcmain.lst
字号:
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TCMAIN
OBJECT MODULE PLACED IN TCMain.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TCMain.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND SRC(.\TCMain.SRC)
line level source
1 #include <AT89X51.H>
2 #include <intrins.h>
3 #define Key_UP P1_5
4 #define Key_DOWN P1_4
5 #define Key_SET P1_6
6 #define RelayOutPort P3_7
7 #define LEDPort P0
8 #define DELPort P3_6
9 #define LEDTwoC P2_6
10 #define LEDThreeC P2_7
11 #define TMPort P3_3
12 #define INBUF_LEN 5 //数据长度
13 unsigned char inbuf1[INBUF_LEN]={'0','0','0','0','0'};//发送缓冲区
14 unsigned char inbuf2[50];//接收缓冲区
15 unsigned char count3;
16 void init_serialcomm( void )
17 {
18 1 SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
19 1 TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
20 1 PCON |= 0x80 ; //SMOD=1;
21 1 TH1 = 0xFA ; //Baud:9600 fosc=11.0592MHz
22 1 IE |= 0x90 ; //Enable Serial Interrupt
23 1 TR1 = 1 ; // timer 1 run
24 1 }
25 //向串口发送一个字符
26 void send_char_com( unsigned char ch)
27 {
28 1 SBUF=ch;
29 1 while (TI== 0 );
30 1 TI= 0 ;
31 1 }
32 //向串口发送一个字符串,strlen 为该字符串长度
33 void send_string_com( unsigned char *str, unsigned int strlen)
34 {
35 1 unsigned int k= 0 ;
36 1 do
37 1 {
38 2 send_char_com(*(str + k));
39 2 k++;
40 2 } while (k < strlen);
41 1 }
42 //串口接收中断函数
43 void serial () interrupt 4 using 3
44 {
45 1 if (RI) //RI==开始接收
46 1 {
47 2 unsigned char ch;
48 2 RI = 0 ; //软件RI=0
49 2 ch=SBUF;
50 2 if (ch> 1 )
51 2 {
52 3 count3= 0 ;
53 3 inbuf2[count3]=ch;
54 3 }
55 2 else
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 2
56 2 {
57 3 count3++;
58 3 inbuf2[count3]=ch;
59 3 }
60 2 }
61 1 }
62
63 unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,
-0xFF为空,0xF7为负号
64 unsigned char dis_8[12]={'0','1','2','3','4','5','6','7','8','9',' ','-'};
65 static unsigned char bdata StateREG; //可位寻址的状态寄存器
66 sbit DS1820ON = StateREG^0; //DS1820是否存在
67 sbit SetTF = StateREG^1; //是否是在温度设置状态
68 sbit KeySETDown = StateREG^2; //是否已按过SET键标识
69 sbit PowTF = StateREG^3; //电源电源标识
70 sbit KeyTF = StateREG^4; //键盘是否允许
71
72 //sbit KeySETDowning = StateREG^5; //SET是否正在按下
73 static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位
74 static unsigned char bdata THV _at_ 0x0028;
75 static signed char TMV; //转换后的温度值
76 static unsigned char KeyV,TempKeyV; //键值
77 static unsigned char Second;
78 static unsigned char flag;
79 static signed char TMRomV _at_ 0x0027; //高温限制
80 static signed char TMSetV _at_ 0x0026; //温度设定值
81 static unsigned char KSDNum; //SET键连按时的采集次数
82 static unsigned char IntNum,IntNum2,IntNum3; //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
-时LED闪烁
83 static signed char LED_One,LED_Two,LED_Three; //LED的显示位 LED_One为十位,LED_Two为个位
84 static unsigned char Sign; //负号标识
85
86 void main(void)
87 {
88 1
89 1 void InitDS1820(void); //定义函数
90 1 void ROMDS1820(void);
91 1 void TMVDS1820(void);
92 1 void TMRDS1820(void);
93 1 void TMWDS1820(void);
94 1 void TMREDS1820(void);
95 1 void TMERDS1820(void);
96 1 void ReadDS1820(void);
97 1 void WriteDS1820(void);
98 1 void Delay_510(void);
99 1 void Delay_110(void);
100 1 void Delay_10ms(void);
101 1 void Delay_4s(void);
102 1 void V2ToV(void);
103 1
104 1 DELPort=1;
105 1 StateREG = 0; //初始化变量
106 1 SetTF = 0;
107 1 PowTF = 0; //关电源
108 1 THV = 0;
109 1 TLV = 0;
110 1 TMV = 0;
111 1 KeyV = 0;
112 1 TempKeyV = 0;
113 1 KSDNum = 0;
114 1 IntNum = 0;
115 1 IntNum2 = 0;
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 3
116 1 IntNum3 = 0;
117 1 LED_One = 0;
118 1 LED_Two = 0;
119 1
120 1 InitDS1820(); //初始化
121 1 ROMDS1820(); //跳过ROM
122 1 TMERDS1820(); //E2PRAM中温度上限值调入RAM
123 1 InitDS1820(); //初始化
124 1 ROMDS1820(); //跳过ROM
125 1 TMRDS1820(); //读出温度指令
126 1 ReadDS1820(); //读出温度值和上限值
127 1 TMSetV = TMRomV; //拷贝保存在DS18B20ROM里的上限值到TMSetV
128 1
129 1 EA = 1; //允许CPU中断
130 1 ET0 = 1; //定时器0中断打开
131 1 TMOD = 0x1; //设定时器0为模式1,16位模式
132 1 TH0=0xB1;
133 1 TL0=0xDF; //设定时值为20000us(20ms)
134 1 TR0 = 1;
135 1
136 1 while(1){ //开始定时
137 2
138 2
139 2
140 2
141 2
142 2
143 2 if (flag==0){
144 3 if (Second==1){
145 4 Delay_4s();
146 4 Delay_4s();
147 4 Delay_4s();
148 4 Delay_4s();
149 4 Delay_4s();
150 4 Delay_4s();
151 4
152 4 DELPort=0;
153 4 Second=0;
154 4 }
155 3 }
156 2 }
157 1
158 1
159 1 }
160
161 //定时器0中断外理中键扫描和显示
162 void KeyAndDis_Time0(void) interrupt 1 using 2
163 {
164 1 TH0=0xB1;
165 1 TL0=0xDF; //设定时值为20000us(20ms)
166 1
167 1 LEDPort = 0xFF;
168 1
169 1
170 1 if (inbuf2[0]==0x33){
171 2 send_char_com('O');
172 2 send_char_com('O');
173 2 send_char_com('O');
174 2 SetTF = 1;
175 2 //send_string_com(inbuf2,1);
176 2 //BEEP=0;
177 2 //RELAY=0;
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 4
178 2 send_char_com('O');
179 2 //inbuf2[0]=0x00;
180 2 inbuf2[0]=0x00;
181 2 }
182 1
183 1 if (inbuf2[0]==0x36)
184 1
185 1 {send_char_com('N');
186 2 send_char_com('N');
187 2 send_char_com('N');
188 2 SetTF = 0;
189 2
190 2 inbuf2[0]=0x00;
191 2 }
192 1
193 1 if (inbuf2[0]==0x34){
194 2 KeyV=2;
195 2 //send_string_com(inbuf2,1);
196 2 //BEEP=0;
197 2 //RELAY=0;
198 2 TMSetV = TMSetV - 1;
199 2 inbuf2[0]=0x00;
200 2 }
201 1
202 1 if (inbuf2[0]==0x35){
203 2
204 2 //send_string_com(inbuf2,1);
205 2 //BEEP=1;
206 2 //RELAY=1;
207 2 TMSetV = TMSetV + 1;
208 2 inbuf2[0]=0x00;
209 2 }
210 1
211 1 if (inbuf2[0]==0x74){
212 2 KeyV=2;
213 2 //send_string_com(inbuf2,1);
214 2 //BEEP=1;
215 2 //RELAY=1;
216 2 }
217 1
218 1 if (inbuf2[0]==0x90){
219 2 KeyV=1;
220 2 //send_string_com(inbuf2,1);
221 2 //BEEP=1;
222 2 //RELAY=1;
223 2 }
224 1
225 1
226 1 if (!Key_UP)
227 1 KeyV = 1;
228 1 if (!Key_DOWN)
229 1 KeyV = 2;
230 1 if (!Key_SET)
231 1 KeyV = 3;
232 1 //KeySETDowning = 0; //清除
233 1 if (KeyV != 0) //有键按下
234 1 {
235 2 Delay_10ms(); //延时防抖 按下10ms再测
236 2 if (!Key_UP)
237 2 TempKeyV = 1;
238 2 if (!Key_DOWN)
239 2 TempKeyV = 2;
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 5
240 2 if (!Key_SET)
241 2 TempKeyV = 3;
242 2 if (KeyV == TempKeyV) //两次值相等为确定接下了键
243 2 {
244 3 if (KeyV == 3) //按下SET键,如在SET状态就退出,否则进入
245 3 {
246 4 //KeySETDowning = 1; //表明SET正在按下
247 4
248 4
249 4 PowTF = 0; //电源标识开
250 4 if (!KeyTF)
251 4 if (SetTF){
252 5 send_char_com('N');
253 5 send_char_com('N');
254 5 send_char_com('N');
255 5 SetTF = 0; //标识位标识退出设定
256 5
257 5 InitDS1820(); //初始化
258 5 ROMDS1820(); //跳过ROM
259 5 TMWDS1820(); //写温度上限指令
260 5 WriteDS1820(); //写温度上限到DS18B20ROM
261 5 WriteDS1820(); //写温度上限到DS18B20ROM
262 5 WriteDS1820(); //写温度上限到DS18B20ROM
263 5 InitDS1820(); //初始化
264 5 ROMDS1820(); //跳过ROM
265 5 TMREDS1820(); //温度上限值COPY回E2PRAM
266 5 }
267 4 else {
268 5 send_char_com('O');
269 5 send_char_com('O');
270 5 send_char_com('O');
271 5 SetTF = 1;}
272 4
273 4
274 4 if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
275 4 KeySETDown = 1;
276 4 else
277 4 KSDNum = KSDNum + 1; //前一秒内有按过SET则开始计数
278 4 }
279 3 if (SetTF) //在SET状态下
280 3 {
281 4
282 4 if ((KeyV == 1) && (!KeyTF))
283 4 TMSetV = TMSetV + 1; //上调温度
284 4 if ((KeyV == 2) && (!KeyTF))
285 4 TMSetV = TMSetV - 1; //下调温度
286 4 if (TMSetV <= 20) //限制温度上下限
287 4 TMSetV = 20;
288 4 if (TMSetV >= 75)
289 4 TMSetV = 75;
290 4 }
291 3 if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
292 3 }
293 2
294 2
295 2 }
296 1 KeyV = 0;
297 1 TempKeyV = 0; //清空变量准备下次键扫描
298 1
299 1 if (!PowTF)
300 1 {
301 2 InitDS1820(); //初始化
C51 COMPILER V8.02 TCMAIN 08/10/2012 16:38:28 PAGE 6
302 2 ROMDS1820(); //跳过ROM
303 2 TMVDS1820(); //温度转换指令
304 2
305 2 Delay_510();
306 2 Delay_510(); //延时等待转换完成
307 2
308 2 InitDS1820(); //初始化
309 2 ROMDS1820(); //跳过ROM
310 2 TMRDS1820(); //读出温度指令
311 2 ReadDS1820(); //读出温度值
312 2
313 2 V2ToV(); //转换显示值
314 2 if (TMV > TMSetV) //根据采集到的温度值控制继电器
315 2 {
316 3 RelayOutPort = 0;
317 3 flag=0;
318 3 }
319 2 else
320 2 {
321 3 RelayOutPort = 1;
322 3 DELPort=1;
323 3 Second=1;
324 3 flag=1;
325 3
326 3
327 3 }
328 2
329 2 if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
330 2 if (IntNum2 > 50 ) IntNum2 = 0;
331 2 if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
332 2 if (IntNum3 > 25)
333 2 {IntNum3 = 0;
334 3
335 3
336 3 }
337 2
338 2 if ((SetTF) && (IntNum2 < 25)) goto InitEnd; //计数在后半段时显示
339 2
340 2 LEDPort = LED_Two;
341 2 LEDTwoC = 0;
342 2 Delay_510();
343 2 LEDTwoC = 1; //显示十位数
344 2 LEDPort = LED_Three;
345 2 LEDThreeC = 0;
346 2 Delay_510();
347 2 LEDThreeC = 1; //显示个位数
348 2 }
349 1 InitEnd:;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -