📄 text1.lst
字号:
C51 COMPILER V8.17 TEXT1 02/22/2009 16:39:38 PAGE 1
C51 COMPILER V8.17, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <at89x52.h>
2 #include <intrins.h>
3
4 unsigned char code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
5 unsigned char code TEM_DATA[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46}; //加有小数点的数
-据
6 unsigned char time[2],dis_buff[4],temp[4];
7 unsigned int i,b,ti,F;
8 unsigned char set;
9 static unsigned int tr0,tr1; //定时器定时变量
10 char tdata;
11 bit S; //标志当前是否显示的是温度
12 sbit k1=P1^0; //调整模式
13 sbit k2=P1^1; //+按钮
14 sbit k3=P1^2; //-按钮
15 sbit k4=P1^3; //(未使用)
16 sbit SLED=P3^3; //秒指示灯
17 sbit PLED=P3^1; //显示温度时作小数点 (显示时间时作点)
18 sbit di1=P3^4;
19 sbit di2=P3^5;
20 sbit di3=P3^6;
21 sbit di4=P3^7;
22 void w_1302 (unsigned char add,unsigned char dat); //对指定的寄存器写数据,add寄存器地址,dat数据
23 unsigned char r_1302 (unsigned char add); //读指定的寄存器数据,返回值为十进制数
24 void init_ds1302 (void);
25 get_18b20 (void);
26
27 void init_key (void)
28 {
29 1 set=1;
30 1 k1=1;
31 1 k2=1;
32 1 k3=1;
33 1 }
34
35
36
37 void get_time ()
38 {
39 1 time[0]=r_1302 (0x83);//读秒
40 1 time[1]=r_1302 (0x85);//读分
41 1
42 1 }
43
44 void time_updata ()
45 {
46 1 dis_buff[0]=LED_DATA[time[1]/10];
47 1 if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //时间第一位是0的话,就不显示
48 1 dis_buff[1]=LED_DATA[time[1]%10];
49 1 dis_buff[2]=LED_DATA[time[0]/10];
50 1 dis_buff[3]=LED_DATA[time[0]%10];
51 1 }
52
53 void get_temp ()
54 {
C51 COMPILER V8.17 TEXT1 02/22/2009 16:39:38 PAGE 2
55 1 F=get_18b20 ();
56 1 temp[0]=F/1000;//温度十位值
57 1 temp[1]=(F%1000)/100;//温度个位值
58 1 temp[2]=((F%1000)%100)/10;//温度小数位值
59 1 }
60
61 void temp_updata ()
62 {
63 1 dis_buff[0]=LED_DATA[temp[0]];
64 1 if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //温度第一位是0的话,就不显示
65 1 dis_buff[1]=LED_DATA[temp[1]];
66 1 dis_buff[2]=LED_DATA[temp[2]];
67 1 dis_buff[3]=TEM_DATA[10]; //显示℃符号
68 1 }
69
70 void displayscanf (void) interrupt 1 using 0 //定时器0中断服务程序,用于数码管动态显示扫描
71 {
72 1 tr0++;
73 1 TH0=0xcd; //刷新周新6.5ms
74 1 TL0=0x38;
75 1 if (tr0==77) {SLED=~SLED;PLED=SLED;tr0=0;} //LED每秒闪一次
76 1 if (set!=0) //判断当前是否是调时模式
77 1 {
78 2 if (set==1) {SLED=0;PLED=1;} //调整小时时,SLED灯亮
79 2 if (set==2) {SLED=1;PLED=0;}//调整分钟时,PROT灯亮
80 2 }
81 1 if (S==1) {SLED=1;PLED=0;} //判断当前是否显示的是温度
82 1 i++;
83 1 if (i==4) i=0; //扫描完一圈后,从新开始!
84 1 if (i==0) {P0=dis_buff[0];di1=0;}
85 1 if (i!=0) di1=1;
86 1
87 1 if (i==1) {P0=dis_buff[1];di2=0;}
88 1 if (i!=1) di2=1;
89 1
90 1 if (i==2) {P0=dis_buff[2];di3=0;}
91 1 if (i!=2) di3=1;
92 1
93 1 if (i==3) {P0=dis_buff[3];di4=0;}
94 1 if (i!=3) di4=1;
95 1 }
96
97 void dis_other (void) interrupt 3 using 0 //控制分时显示
98 {
99 1 tr1++;
100 1 TH1=0x00; //定时最大值32.76ms
101 1 TL1=0x00;
102 1 if (tr1>1000) tr1=0;
103 1 if ((tr1>610)&&(tr1<1000)) //每20秒显示一次温度
104 1 {
105 2 S=1;
106 2 temp_updata ();
107 2 }
108 1 else
109 1 {
110 2 time_updata ();
111 2 S=0;
112 2 }
113 1 }
114
115
116
C51 COMPILER V8.17 TEXT1 02/22/2009 16:39:38 PAGE 3
117 void key_delay (unsigned int m) //按键消抖动
118 {
119 1 unsigned char t;
120 1 t=10;
121 1 while (m--)
122 1 {
123 2 while (t--);
124 2 }
125 1 }
126
127 void set_time (void) //调整时间函数
128 {
129 1 if (k1==0)
130 1 {
131 2 key_delay (500);
132 2 if (k1==0)
133 2 {
134 3 set++;
135 3 if (set!=0) TR1=0; //停止显示温度
136 3 if (set==3)
137 3 {
138 4 set=0; //退出时间调整模式
139 4 TR1=1; //恢复每30秒显示一次温度
140 4 w_1302 (0x8e,0x00); //禁止写保护
141 4 w_1302 (0x80,0x00); //将秒复位
142 4 w_1302 (0x8e,0x80);//允许写保护
143 4 }
144 3 while(!k1); //等待热键释放
145 3 }
146 2 }
147 1
148 1 if (set!=0)
149 1 {
150 2 if (k2==0)
151 2 {
152 3 key_delay (20);
153 3 if (k2==0)
154 3 {
155 4 while (k2==0);
156 4 if (set==1) //调时
157 4 {
158 5 tdata=r_1302 (0x85);
159 5 tdata++;
160 5 if (tdata>23) tdata=0;
161 5 tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
162 5 w_1302 (0x8e,0x00); //禁止写保护
163 5 w_1302 (0x84,tdata); //将调整后的数据写入DS1302
164 5 time[1]=r_1302 (0x85);//重新读时
165 5 time_updata ();
166 5 w_1302 (0x8e,0x80); //允许写保护
167 5 }
168 4 if (set==2) //调分
169 4 {
170 5 tdata=r_1302 (0x83);
171 5 tdata++;
172 5 if (tdata>59) tdata=0;
173 5 tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
174 5 w_1302 (0x8e,0x00); //禁止写保护
175 5 w_1302 (0x82,tdata); //将调整后的数据写入DS1302
176 5 time[0]=r_1302 (0x83);//重新读时
177 5 time_updata ();
178 5 w_1302 (0x8e,0x80); //允许写保护
C51 COMPILER V8.17 TEXT1 02/22/2009 16:39:38 PAGE 4
179 5 }
180 4 }
181 3 }
182 2 }
183 1 if (k3==0)
184 1 {
185 2 key_delay (20);
186 2 if (k3==0)
187 2 {
188 3 while (k3==0);
189 3 if (set==1) //调时
190 3 {
191 4 tdata=r_1302 (0x85);
192 4 tdata--;
193 4 if (tdata<0) tdata=23;
194 4 tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
195 4 w_1302 (0x8e,0x00); //禁止写保护
196 4 w_1302 (0x84,tdata); //将调整后的数据写入DS1302
197 4 time[1]=r_1302 (0x85);//重新读时
198 4 time_updata ();
199 4 w_1302 (0x8e,0x80); //允许写保护
200 4 }
201 3 if (set==2) //调分
202 3 {
203 4 tdata=r_1302 (0x83);
204 4 tdata--;
205 4 if (tdata<0) tdata=59;
206 4 tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
207 4 w_1302 (0x8e,0x00); //禁止写保护
208 4 w_1302 (0x82,tdata); //将调整后的数据写入DS1302
209 4 time[0]=r_1302 (0x83);//重新读时
210 4 time_updata ();
211 4 w_1302 (0x8e,0x80); //允许写保护
212 4 }
213 3 }
214 2 }
215 1 }
216
217 main ()
218 {
219 1 P0=0X00; //第一次上电时做测试数码管用
220 1 P3=0X00;
221 1 key_delay (300); //延时
222 1 P0=0xff;
223 1 P3=0xff;
224 1 init_key (); // 按键初始化(全出高电平)
225 1 init_ds1302 (); //时间芯片初始化
226 1 TMOD=0x11;
227 1 TH0=0xcd; //定时6.5ms
228 1 TL0=0x38;
229 1 TH1=0x00; //定时最大值
230 1 TL1=0x00;
231 1 EA=1;
232 1 ET0=1;
233 1 ET1=1;
234 1 TR0=1;
235 1 TR1=1;
236 1 P3=0XFF; //关闭显示
237 1 i=0;
238 1 set=0;
239 1 while (1)
240 1 {
C51 COMPILER V8.17 TEXT1 02/22/2009 16:39:38 PAGE 5
241 2 get_time();
242 2 get_temp ();
243 2 set_time ();
244 2 }
245 1 }
246
247
248
249
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 978 ----
CONSTANT SIZE = 21 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 24 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -