📄 51
字号:
C51 COMPILER V9.00 TCMAIN 01/14/2010 22:09:38 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE TCMAIN
NO OBJECT MODULE REQUESTED
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_4
4 #define Key_DOWN P1_5
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 V9.00 TCMAIN 01/14/2010 22:09:38 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 V9.00 TCMAIN 01/14/2010 22:09:38 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 V9.00 TCMAIN 01/14/2010 22:09:38 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 2
185 2 //send_string_com(inbuf2,1);
186 2 //BEEP=1;
187 2 send_char_com('N');
188 2 send_char_com('N');
189 2 send_char_com('N');
190 2 SetTF = 0;
191 2
192 2 inbuf2[0]=0x00;
193 2
194 2 }
195 1
196 1 if (inbuf2[0]==0x34){
197 2 KeyV=2;
198 2 //send_string_com(inbuf2,1);
199 2 //BEEP=0;
200 2 //RELAY=0;
201 2 TMSetV = TMSetV - 1;
202 2 inbuf2[0]=0x00;
203 2 }
204 1
205 1 if (inbuf2[0]==0x35){
206 2
207 2 //send_string_com(inbuf2,1);
208 2 //BEEP=1;
209 2 //RELAY=1;
210 2 TMSetV = TMSetV + 1; //上调温度
211 2 inbuf2[0]=0x00;
212 2 }
213 1
214 1 if (inbuf2[0]==0x74){
215 2 KeyV=2;
216 2 //send_string_com(inbuf2,1);
217 2 //BEEP=1;
218 2 //RELAY=1;
219 2 }
220 1
221 1 if (inbuf2[0]==0x90){
222 2 KeyV=1;
223 2 //send_string_com(inbuf2,1);
224 2 //BEEP=1;
225 2 //RELAY=1;
226 2 }
227 1
228 1
229 1 if (!Key_UP)
230 1 KeyV = 1;
231 1 if (!Key_DOWN)
232 1 KeyV = 2;
233 1 if (!Key_SET)
234 1 KeyV = 3;
235 1 //KeySETDowning = 0; //清除
236 1 if (KeyV != 0) //有键按下
237 1 {
238 2 Delay_10ms(); //延时防抖 按下10ms再测
239 2 if (!Key_UP)
C51 COMPILER V9.00 TCMAIN 01/14/2010 22:09:38 PAGE 5
240 2 TempKeyV = 1;
241 2 if (!Key_DOWN)
242 2 TempKeyV = 2;
243 2 if (!Key_SET)
244 2 TempKeyV = 3;
245 2 if (KeyV == TempKeyV) //两次值相等为确定接下了键
246 2 {
247 3 if (KeyV == 3) //按下SET键,如在SET状态就退出,否则进入
248 3 {
249 4 //KeySETDowning = 1; //表明SET正在按下
250 4
251 4
252 4 PowTF = 0; //电源标识开
253 4 if (!KeyTF)
254 4 if (SetTF){
255 5 send_char_com('N');
256 5 send_char_com('N');
257 5 send_char_com('N');
258 5 SetTF = 0; //标识位标识退出设定
259 5
260 5 InitDS1820(); //初始化
261 5 ROMDS1820(); //跳过ROM
262 5 TMWDS1820(); //写温度上限指令
263 5 WriteDS1820(); //写温度上限到DS18B20ROM
264 5 WriteDS1820(); //写温度上限到DS18B20ROM
265 5 WriteDS1820(); //写温度上限到DS18B20ROM
266 5 InitDS1820(); //初始化
267 5 ROMDS1820(); //跳过ROM
268 5 TMREDS1820(); //温度上限值COPY回E2PRAM
269 5 }
270 4 else {
271 5 send_char_com('O');
272 5 send_char_com('O');
273 5 send_char_com('O');
274 5 SetTF = 1;}
275 4
276 4
277 4 if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
278 4 KeySETDown = 1;
279 4 else
280 4 KSDNum = KSDNum + 1; //前一秒内有按过SET则开始计数
281 4 }
282 3 if (SetTF) //在SET状态下
283 3 {
284 4
285 4 if ((KeyV == 1) && (!KeyTF))
286 4 TMSetV = TMSetV + 1; //上调温度
287 4 if ((KeyV == 2) && (!KeyTF))
288 4 TMSetV = TMSetV - 1; //下调温度
289 4 if (TMSetV <= 20) //限制温度上下限
290 4 TMSetV = 20;
291 4 if (TMSetV >= 75)
292 4 TMSetV = 75;
293 4 }
294 3 if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
295 3 }
296 2
297 2
298 2 }
299 1 KeyV = 0;
300 1 TempKeyV = 0; //清空变量准备下次键扫描
301 1
C51 COMPILER V9.00 TCMAIN 01/14/2010 22:09:38 PAGE 6
302 1 if (!PowTF)
303 1 {
304 2 InitDS1820(); //初始化
305 2 ROMDS1820(); //跳过ROM
306 2 TMVDS1820(); //温度转换指令
307 2
308 2 Delay_510();
309 2 Delay_510(); //延时等待转换完成
310 2
311 2 InitDS1820(); //初始化
312 2 ROMDS1820(); //跳过ROM
313 2 TMRDS1820(); //读出温度指令
314 2 ReadDS1820(); //读出温度值
315 2
316 2 V2ToV(); //转换显示值
317 2 if (TMV > TMSetV) //根据采集到的温度值控制继电器
318 2 {
319 3 RelayOutPort = 0;
320 3 flag=0;
321 3 }
322 2 else
323 2 {
324 3 RelayOutPort = 1;
325 3 DELPort=1;
326 3 Second=1;
327 3 flag=1;
328 3
329 3
330 3 }
331 2
332 2 if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
333 2 if (IntNum2 > 50 ) IntNum2 = 0;
334 2 if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
335 2 if (IntNum3 > 25)
336 2 {
337 3 IntNum3 = 0;
338 3 KeyTF = 0;
339 3 }
340 2
341 2 if ((SetTF) && (IntNum2 < 25)) goto InitEnd; //计数在后半段时显示
342 2
343 2 LEDPort = LED_Two;
344 2 LEDTwoC = 0;
345 2 Delay_510();
346 2 LEDTwoC = 1; //显示十位数
347 2 LEDPort = LED_Three;
348 2 LEDThreeC = 0;
349 2 Delay_510();
350 2 LEDThreeC = 1; //显示个位数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -