?? clock.lst
字號:
C51 COMPILER V6.12 CLOCK 06/07/2005 21:06:59 PAGE 1
C51 COMPILER V6.12, 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 //更新歷史:增加溫度顯示,調整時閃動。12/1
2 // 增加零下溫度顯示 12/15
3
4 /*============================================================
5 使用1602液晶顯示DS1302+S51時鐘+溫度顯示 馬文壘 2004/12/01
6 ==============================================================
7 聲明:1. 1602驅動程序照搬 明皓 的,非常好用
8 2. DS1302驅動程序是參考網友修改而來
9
10 SMC1602A(16*2)模擬口線接線方式
11 連接線圖:
12 ---------------------------------------------------
13 |LCM-----51 | LCM-----51 | LCM------51 |
14 ---------------------------------------------|
15 |DB0-----P1.0 | DB4-----P1.4 | RS-------P2.0 |
16 |DB1-----P1.1 | DB5-----P1.5 | RW-------P2.1 |
17 |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
18 |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K電阻到GND|
19 ---------------------------------------------------
20 DS1302 接線圖
21
22 Vcc2 CLK I/O /RST
23
24 | | | |
25 --------------
26 | 8 7 6 5|
27 | DS1302 |
28 | |
29 | 1 2 3 4|
30 --------------
31 | | | |
32 VCC1 GND
33
34 1 腳接+5V 2,3腳32768HZ晶振 4腳接地 5腳接S51的P02 6腳接S51的P01 7接S51的P00
35 8腳接后備電源,可以接老計算機主板上的3.6V電池,也可以通過二級管隔離接一個大容量電解電容
36 電壓在2.5V以上即可維持
37
38 按鍵說明:1. 共三個鍵,低電平有效
39 2. P04 和 P05 同時按:初始化
40 3. P06 端口按鍵:選擇要調整的項目
41 4. P05 端口按鍵:增加;P04端口按鍵:減少
42 5. P03 端口按鍵:選擇顯示模式;新增按鍵
43
44
45 [注:AT89S51使用12M晶振]
46 =============================================================*/
47 #include <AT89x51.h>
48 #include <string.h>
49 #include<intrins.h>
50
51 #define LCM_RS P2_0 //定義引腳
52 #define LCM_RW P2_1
53 #define LCM_E P2_2
54 #define LCM_Data P1
55 #define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
C51 COMPILER V6.12 CLOCK 06/07/2005 21:06:59 PAGE 2
56 #define uchar unsigned char
57
58 uchar id,timecount,dipsmodid;
59 bit lmcinit_or_not; //是否需要清屏標志位“1”為需要“0”為不需要
60 bit flag,sflag; //flag是時鐘冒號閃爍標志,sflag是溫度負號顯示標志
61 void Disp_line1(void); //顯示屏幕第一行
62 void Disp_line2(void); //顯示屏幕第二行
63 void id_case1_key();
64 //void Dispmod_id_case_key(void);//選擇顯示模式
65 void Disp_mod0(void);//顯示模式0
66 void Disp_mod1(void);//顯示模式
67
68
69 //*********** DS1302 時間顯示定義部分
70 sbit T_CLK=P0^0;
71 sbit T_IO =P0^1;
72 sbit T_RST=P0^2;
73 sbit ACC0=ACC^0;
74 sbit ACC7=ACC^7;
75 void Set(uchar,uchar); //根據選擇調整相應項目
76 void RTInputByte(uchar); /* 輸入 1Byte */
77 uchar RTOutputByte(void); /* 輸出 1Byte */
78 void W1302(uchar, uchar); // 向DS1302寫入一個字節
79 uchar R1302(uchar); // 從DS1302讀出一個字節
80 void Set1302(unsigned char * ); // 設置時間
81 bit sec,min,hour,year,mon,day,weekk; //閃爍標志位
82 //初始化后設置為:04年12月2日星期4 0點0分0秒
83 unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
84 // 秒 分鐘 小時 日 月 年 星期
85
86 //***** 18B20溫度顯示定義部
87 sbit DQ=P0^7; //18B20 接P07口
88 typedef unsigned char byte;
89 typedef unsigned int word;
90 Read_Temperature(char,char);
91 void mychar(void);
92 byte ow_reset(void);
93 byte read_byte(void);
94 void write_byte(char val);
95 void adjust_res(char res); //res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數分辨率分別對應
96 // 0.5, 0.25, 0.125
97
98 //*******溫度控制部分*********
99 bit tl_flash_flag; //下限閃爍標志
100 bit th_flash_flag; //上限閃爍標志
101 bit tl_flag; //下限越限標志
102 bit th_flag; //上限越限標志
103 bit tl_sign,th_sign; //溫度零下標志 0:零上,1:零下
104 char tempid;
105 void Disp_Temp(void); //顯示上下限溫度
106 void Set_TH_Temp(void); //設置溫度上限
107 void Set_TL_Temp(void); //設置溫度下限
108 signed char tl=20,th=45;
109 void Compare_Temp(signed char l,signed char h); //比較溫度
110 void Tl_Al(void); //下限越限報警
111 void Th_Al(void); //上限越限報警
112
113
114
115 //******* 1602LCD驅動 **********************************************************
116 void WriteDataLCM(unsigned char WDLCM);
117 void WriteCommandLCM(unsigned char WCLCM,BuysC);
C51 COMPILER V6.12 CLOCK 06/07/2005 21:06:59 PAGE 3
118 unsigned char ReadStatusLCM(void);
119 void LCMInit(void);
120 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
121 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
122 void Delay5Ms(void);
123 void Delay400Ms(void);
124 unsigned char code week[]={"Week."};
125
126
127 void main(void)
128 {
129 1 Delay400Ms(); //啟動等待,等LCM講入工作狀態
130 1 LCMInit(); //LCM初始化
131 1 Delay5Ms(); //延時片刻(可不要)
132 1 mychar();
133 1 TMOD=0x01;
134 1 TH0=(65535-50000)/256;
135 1 TL0=(65535-50000)%256;
136 1 EA=1;
137 1 TR0=1;
138 1 ET0=1;
139 1 W1302(0x90,0xa5);//打開充電二級管 一個二級管串聯一個2K電阻
140 1 W1302(0x8e,0x80);//寫保護,禁止寫操作
141 1 adjust_res(0x1f); //調整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
142 1 while(1)
143 1 {
144 2 if (P0_3==0)
145 2 {dipsmodid++;
146 3 lmcinit_or_not=1;
147 3 if(dipsmodid>2) dipsmodid=0;
148 3 while(P0_3==0);
149 3 }
150 2 switch(dipsmodid)
151 2 {
152 3 case 0:
153 3 Disp_mod0();
154 3 break;
155 3 case 1:
156 3 Disp_mod1();
157 3 break;
158 3 }
159 2 }
160 1 }
161 /*//選擇顯示模
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -