📄 clock.lst
字号:
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE clock.c DEBUG OBJECTEXTEND
stmt level source
1
2 /*============================================================
3 使用1602液晶显示DS1302+S51时钟+温度显示
4 ==============================================================
5
6 SMC1602A(16*2)模拟口线接线方式
7 连接线图:
8 ---------------------------------------------------
9 |LCM-----51 | LCM-----51 | LCM------51 |
10 ---------------------------------------------|
11 |DB0-----P1.0 | DB4-----P1.4 | RS-------P2.0 |
12 |DB1-----P1.1 | DB5-----P1.5 | RW-------P2.1 |
13 |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
14 |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
15 ---------------------------------------------------
16 DS1302 接线图
17
18 Vcc2 CLK I/O /RST
19
20 | | | |
21 --------------
22 | 8 7 6 5|
23 | DS1302 |
24 | |
25 | 1 2 3 4|
26 --------------
27 | | | |
28 VCC1 GND
29
30 1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
31 8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
32 电压在2.5V以上即可维持
33
34 按键说明:1. 共三个键,低电平有效
35 2. P04 和 P05 同时按:初始化
36 3. P06 端口按键:选择要调整的项目
37 4. P05 端口按键:增加;P04端口按键:减少
38 5. P03 端口按键:选择显示模式;新增按键
39
40
41 [注:AT89S51使用12M晶振]
42 =============================================================*/
43 #include <AT89x51.h>
44 #include <string.h>
45 #include<intrins.h>
46
47 #define LCM_RS P2_0 //定义引脚
48 #define LCM_RW P2_1
49 #define LCM_E P2_2
50 #define LCM_Data P1
51 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
52 #define uchar unsigned char
53
54 uchar id,timecount,dipsmodid;
55 bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 2
56 bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
57 void Disp_line1(void); //显示屏幕第一行
58 void Disp_line2(void); //显示屏幕第二行
59 void id_case1_key();
60 //void Dispmod_id_case_key(void);//选择显示模式
61 void Disp_mod0(void);//显示模式0
62 void Disp_mod1(void);//显示模式
63
64
65 //*********** DS1302 时间显示定义部分
66 sbit T_CLK=P0^0;
67 sbit T_IO =P0^1;
68 sbit T_RST=P0^2;
69 sbit ACC0=ACC^0;
70 sbit ACC7=ACC^7;
71 void Set(uchar,uchar); //根据选择调整相应项目
72 void RTInputByte(uchar); /* 输入 1Byte */
73 uchar RTOutputByte(void); /* 输出 1Byte */
74 void W1302(uchar, uchar); // 向DS1302写入一个字节
75 uchar R1302(uchar); // 从DS1302读出一个字节
76 void Set1302(unsigned char * ); // 设置时间
77 bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
78 //初始化后设置为:04年12月2日星期4 0点0分0秒
79 unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
80 // 秒 分钟 小时 日 月 年 星期
81
82 //***** 18B20温度显示定义部
83 sbit DQ=P0^7; //18B20 接P07口
84 typedef unsigned char byte;
85 typedef unsigned int word;
86 Read_Temperature(char,char);
87 void mychar(void);
88 byte ow_reset(void);
89 byte read_byte(void);
90 void write_byte(char val);
91 void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
92 // 0.5, 0.25, 0.125
93
94 //*******温度控制部分*********
95 bit tl_flash_flag; //下限闪烁标志
96 bit th_flash_flag; //上限闪烁标志
97 bit tl_flag; //下限越限标志
98 bit th_flag; //上限越限标志
99 bit tl_sign,th_sign; //温度零下标志 0:零上,1:零下
100 char tempid;
101 void Disp_Temp(void); //显示上下限温度
102 void Set_TH_Temp(void); //设置温度上限
103 void Set_TL_Temp(void); //设置温度下限
104 signed char tl=20,th=45;
105 void Compare_Temp(signed char l,signed char h); //比较温度
106 void Tl_Al(void); //下限越限报警
107 void Th_Al(void); //上限越限报警
108
109
110
111 //******* 1602LCD驱动 **********************************************************
112 void WriteDataLCM(unsigned char WDLCM);
113 void WriteCommandLCM(unsigned char WCLCM,BuysC);
114 unsigned char ReadStatusLCM(void);
115 void LCMInit(void);
116 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
117 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 3
118 void Delay5Ms(void);
119 void Delay400Ms(void);
120 unsigned char code week[]={"Week."};
121
122
123 void main(void)
124 {
125 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
126 1 LCMInit(); //LCM初始化
127 1 Delay5Ms(); //延时片刻(可不要)
128 1 mychar();
129 1 TMOD=0x01;
130 1 TH0=(65535-50000)/256;
131 1 TL0=(65535-50000)%256;
132 1 EA=1;
133 1 TR0=1;
134 1 ET0=1;
135 1 W1302(0x90,0xa5);//打开充电二级管 一个二级管串联一个2K电阻
136 1 W1302(0x8e,0x80);//写保护,禁止写操作
137 1 adjust_res(0x1f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
138 1 while(1)
139 1 {
140 2 if (P0_3==0)
141 2 {dipsmodid++;
142 3 lmcinit_or_not=1;
143 3 if(dipsmodid>2) dipsmodid=0;
144 3 while(P0_3==0);
145 3 }
146 2 switch(dipsmodid)
147 2 {
148 3 case 0:
149 3 Disp_mod0();
150 3 break;
151 3 case 1:
152 3 Disp_mod1();
153 3 break;
154 3 }
155 2 }
156 1 }
157 /*//选择显示模?
158 void Dispmod_id_case_key()
159 {
160 if (P0_3==0)
161 {dipsmodid++;
162 if(dipsmodid>1) dipsmodid=0;
163 }
164 }*/
165 //显示模式0
166 void Disp_mod0(void)
167 {
168 1 if(lmcinit_or_not==1)
169 1 {LCMInit();
170 2 lmcinit_or_not=0;
171 2 }
172 1 if ((P0_4|P0_5)==0) //初始化
173 1 {
174 2 Delay5Ms();
175 2 if ((P0_4|P0_5)==0) Set1302(inittime);
176 2 }
177 1 //mychar(); //显示自定义字符
178 1 if (P0_6==0) // 设置和选择项目键
179 1 {
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 4
180 2 Delay5Ms();
181 2 if(P0_6==0){id++;if(id>7) id=0;}
182 2 while(P0_6==0);
183 2 }
184 1 switch(id)
185 1 {
186 2 case 0:
187 2 sec=0;
188 2 Disp_line1(); Disp_line2();
189 2 break;
190 2 case 1://年
191 2 year=1;
192 2 Disp_line1(); Disp_line2();
193 2 id_case1_key();
194 2 break;
195 2 case 2://月
196 2 year=0;mon=1;
197 2 Disp_line1(); Disp_line2();
198 2 id_case1_key();
199 2 break;
200 2 case 3://日
201 2 mon=0;day=1;
202 2 Disp_line1(); Disp_line2();
203 2 id_case1_key();
204 2 break;
205 2 case 4://星期
206 2 day=0;weekk=1;
207 2 Disp_line1(); Disp_line2();
208 2 id_case1_key();
209 2 break;
210 2 case 5://小时
211 2 weekk=0;hour=1;
212 2 Disp_line1(); Disp_line2();
213 2 id_case1_key();
214 2 break;
215 2 case 6://分钟
216 2 hour=0;min=1;
217 2 Disp_line1(); Disp_line2();
218 2 id_case1_key();
219 2 break;
220 2 case 7://秒
221 2 min=0;sec=1;
222 2 Disp_line1(); Disp_line2();
223 2 id_case1_key();
224 2 break;
225 2 }
226 1 }
227 //显示模式1
228 void Disp_mod1(void)
229 {
230 1 if(lmcinit_or_not==1)
231 1 {LCMInit();
232 2 lmcinit_or_not=0;
233 2 }
234 1 Read_Temperature(1,0);
235 1 DisplayOneChar(0,1,'T');
236 1 DisplayOneChar(1,1,'L');
237 1 DisplayOneChar(2,1,':');
238 1 DisplayOneChar(7,1,'T');
239 1 DisplayOneChar(8,1,'H');
240 1 DisplayOneChar(9,1,':');
241 1 if(P0_6==0)
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 5
242 1 {
243 2 if(P0_6==0)
244 2 {
245 3 tempid++;
246 3 if(tempid>2) tempid=0;
247 3 while(P0_6==0);
248 3 }
249 2 }
250 1 switch(tempid)
251 1 {
252 2 case 0:
253 2 tl_flash_flag=0;
254 2 th_flash_flag=0;
255 2 Disp_Temp();
256 2 break;
257 2 case 1:
258 2 tl_flash_flag=1;
259 2 th_flash_flag=0;
260 2 Disp_Temp();
261 2 Set_TL_Temp();
262 2 break;
263 2 case 2:
264 2 tl_flash_flag=0;
265 2 th_flash_flag=1;
266 2 Disp_Temp();
267 2 Set_TH_Temp();
268 2 break;
269 2 }
270 1 Compare_Temp(tl,th);
271 1 Tl_Al();
272 1 Th_Al();
273 1 }
274
275 //显示上下限温度
276 void Disp_Temp(void)
277 {
278 1
279 1 unsigned char tl_gw,tl_sw,tl_bw; //下限温度的个位,十位,百位
280 1 unsigned char th_gw,th_sw,th_bw; //上限温度的个位,十位,百位
281 1
282 1 tl_sign=tl>>7;
283 1 if(tl_sign)
284 1 {
285 2 tl_bw=(~(tl-1))/100; //计算百位
286 2 tl_sw=((~(tl-1))-tl_bw*100)/10; //计算十位
287 2 tl_gw=(~(tl-1))-tl_bw*100-tl_sw*10; //计算个位
288 2 }
289 1 else
290 1 {
291 2 tl_bw=(tl)/100;
292 2 tl_sw=(tl-tl_bw*100)/10;
293 2 tl_gw=tl-tl_bw*100-tl_sw*10;
294 2 }
295 1
296 1 if(tl_flash_flag==1)
297 1 {
298 2 if(flag==1)
299 2 {if(tl_sign)
300 3 {
301 4 DisplayOneChar(3,1,0x2d);
302 4 DisplayOneChar(4,1,tl_sw+0x30);
303 4 DisplayOneChar(5,1,tl_gw+0x30);
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 6
304 4 }
305 3 else
306 3 {
307 4 DisplayOneChar(3,1,tl_bw+0x30);
308 4 DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
309 4 DisplayOneChar(5,1,tl_gw+0x30);
310 4 }
311 3 }
312 2 else
313 2 {DisplayOneChar(3,1,0x20);
314 3 DisplayOneChar(4,1,0x20); //显示下限温度
315 3 DisplayOneChar(5,1,0x20);
316 3 }
317 2 }
318 1 else
319 1 {
320 2 DisplayOneChar(3,1,tl_bw+0x30);
321 2 DisplayOneChar(4,1,tl_sw+0x30); //显示下限温度
322 2 DisplayOneChar(5,1,tl_gw+0x30);
323 2 }
324 1
325 1
326 1 th_sign=th>>7;
327 1 if(th_sign)
328 1 {
329 2 th_bw=(~(th-1))/100; //计算百位
330 2 th_sw=((~(th-1))-th_bw*100)/10; //计算十位
331 2 th_gw=(~(th-1))-th_bw*100-th_sw*10; //计算个位
332 2 }
333 1 else
334 1 {
335 2 th_bw=(th)/100;
336 2 th_sw=(th-th_bw*100)/10;
337 2 th_gw=th-th_bw*100-th_sw*10;
338 2 }
339 1
340 1
341 1 if(th_flash_flag==1)
342 1 {
343 2 if(flag==1)
344 2 {if(th_sign)
345 3 {
346 4 DisplayOneChar(10,1,0x2d);
347 4 DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
348 4 DisplayOneChar(12,1,th_gw+0x30);
349 4 }
350 3 else
351 3 {
352 4 DisplayOneChar(10,1,th_bw+0x30);
353 4 DisplayOneChar(11,1,th_sw+0x30); //显示下限温度
354 4 DisplayOneChar(12,1,th_gw+0x30);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -