📄 finalclock.lst
字号:
C51 COMPILER V6.12 FINALCLOCK 08/29/2010 19:31:23 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE FINALCLOCK
OBJECT MODULE PLACED IN .\finalclock.OBJ
COMPILER INVOKED BY: D:\KEIL V6.12\C51\BIN\C51.EXE .\finalclock.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /***********************************************************************************
2 学校:东北石油大学
3 院系:电子科学学院
4 专业:电子科学与技术
5 班级:电子07-2班
6 学号:070901240227
7 姓名:杨涛
8 *************************************************************************************/
9 #include <reg52.h> //52 单品机头文件
10 #include <intrins.h>
11 #define uchar unsigned char //宏定义
12 #define uint unsigned int
13 void delay(uint z);
14 sbit key1=P3^4; //设置按键
15 sbit key2=P3^5;
16 sbit key3=P3^0;
17 sbit key4=P3^1;
18 sbit key5=P3^2;
19 sbit key6=P3^3;
20 sbit BEEP=P2^1;
21 sbit led=P2^7;
22 sbit DQ = P2^0;
23 void beepopen(uchar times); //声明函数
24 void onit();
25 void clockset();
26 void display(h,m,s);
27 void alarmset();
28 void distribute();
29 void zd_clock();
30 void clock();
31 void delay1(unsigned char t);
32 void song();
33 void alarmbeep();
34 unsigned char Init_DS18B20(void);
35 unsigned int ReadTemperature(void);
36 uchar code disp_code[] =
37 {
38 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,
39 // 0-9 0 1 2 3 4 5 6 7 8 9
40 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
41 // 10-15 a b c d e f
42 0x7F, 0xBF, 0x9C, 0xFF
43 // 16-19 . - 。null
44 }; //数码管显示值列表
45 uchar code disp_code1[]=
46 {
47 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 //带点的0-9
48 };
49 uint num,temp,alarm,l,j,temp1,ttemp;
50 uchar ch,cm,cs,xs,h1,h2,m1,m2,s1,s2,tf,hh,mm,ss,h,m,s,ah,am,as,timer0h, timer0l,k,time,shift,flag,temp0,z;
51 void proc_18b20(uint t)
52 {
53 1 uint t_temp1, t_temp2,t_temp3,t_temp4;
54 1 t_temp1 = (int)(t / 100);
55 1 t_temp2 = (int)(t % 100);
C51 COMPILER V6.12 FINALCLOCK 08/29/2010 19:31:23 PAGE 2
56 1 t_temp3=(int)(t_temp2%10);
57 1 t_temp4=(int)(t_temp2/10);
58 1 P1=0xfe;
59 1 P0=0xf6;
60 1 delay(2);
61 1 P1=0xfd;
62 1 P0=disp_code[12];
63 1 delay(2);
64 1 P1=0xfb;
65 1 P0=disp_code[18];
66 1 delay(2);
67 1 P1=0xf7;
68 1 P0=disp_code[0];
69 1 delay(2);
70 1 P1=0xef;
71 1 P0=disp_code[t_temp3];
72 1 delay(2);
73 1 P1=0xdf;
74 1 P0=disp_code1[t_temp4];
75 1 delay(2);
76 1 P1=0xbf;
77 1 P0=disp_code[t_temp1];
78 1 delay(2);
79 1 P1=0x7f;
80 1 P0=0xf6;
81 1 delay(2);
82 1 }
83 void main()
84 {
85 1 onit();
86 1 while(1)
87 1 {
88 2 zd_clock();
89 2 if(key5==0&&key6!=0&&key1!=0&&key2!=0)
90 2 {
91 3 Init_DS18B20();
92 3 ttemp = ReadTemperature();
93 3 if(ttemp>30)
94 3 beepopen(1);
95 3 ttemp = (unsigned int)(ttemp * 10 + 0.5); //放大10倍输出并四舍五入
96 3 proc_18b20(ttemp);
97 3 }
98 2 else
99 2 {
100 3 if(key6==0) //当k2按下时 设置闹钟时间
101 3 alarmset();
102 3 else
103 3 {
104 4 if(key1==0||key2==0) //当k4或k3按下时 进行时钟设置
105 4 clockset(); //调用时钟设置程序
106 4 else
107 4 {
108 5 clock(); //调用时钟程序
109 5 if(ah==h&&am==m&&as==s)
110 5 {
111 6 ET1= 1; //打开定时器1中断
112 6 alarmbeep();
113 6 }
114 5 }
115 4 }
116 3
117 3 }
C51 COMPILER V6.12 FINALCLOCK 08/29/2010 19:31:23 PAGE 3
118 2 }
119 1 }
120 void timer0() interrupt 1 //定时器0的中断处理程序
121 {
122 1 TH0=(65536-9216)/256; // 每10ms产生一次中断 因为晶振频率为11.0592MHz,所以定时器装入初值应为,65536-
-10000/12*11.0592
123 1 TL0=(65536-9216)%256;
124 1 num++; //定时器0每产生一次中断 num++
125 1 }
126
127
128 void delay(uint z) //延时子函数
129 {
130 1 uint x,y;
131 1 for(x=z;x>0;x--)
132 1 for(y=110;y>0;y--);
133 1 }
134
135 void beepopen(uchar times) //整点报时的驱动蜂鸣器的程序
136 {
137 1 uint m = 0;
138 1 uchar n = 0;
139 1 while(times--)
140 1 {
141 2
142 2 for(m=0; m<5000; m++)
143 2 {
144 3 for(n=0; n<50; n++);
145 3 BEEP = ~BEEP;
146 3 }
147 2 BEEP = 1;
148 2 delay(200);
149 2 }
150 1 }
151 void onit()
152 {
153 1 num=0;
154 1 TMOD=0x01;
155 1 TH0=(65536-9216)/256; //赋初值给定时器0,表明每9126个机器周期发生一次定时器中断
156 1 TL0=(65536-9216)%256;
157 1 EA=1;
158 1 ET0=1;
159 1 TR0=1;
160 1 ah=5; //闹钟的初值为06:00:00
161 1 am=30;
162 1 as=0;
163 1 h=5;
164 1 m=01;
165 1 s=0;
166 1 }
167 void clockset() //时钟设置程序
168 {
169 1 TR0=0;
170 1 ch=h;
171 1 cm=m;
172 1 if(key1==0)
173 1 {
174 2 P3=0xbf;
175 2 if(key3==0)
176 2 {
177 3 while(!key3);
178 3 cs++;
C51 COMPILER V6.12 FINALCLOCK 08/29/2010 19:31:23 PAGE 4
179 3 if(cs==60)
180 3 cs=0;
181 3 num=cs*100;
182 3 }
183 2 if(key4==0)
184 2 {
185 3 while(!key4);
186 3 cm++;
187 3 if(cm==60)
188 3 cm=0;
189 3 }
190 2 if(key5==0)
191 2 {
192 3 while(!key5);
193 3 ch++;
194 3 if(h==24)
195 3 ch=0;
196 3 }
197 2 }
198 1 if(key2==0)
199 1 {
200 2 P3=0x7f;
201 2 if(key3==0)
202 2 {
203 3 while(!key3);
204 3 cs--;
205 3 if(cs==-1)
206 3 cs=59;
207 3 num=cs*100;
208 3 }
209 2 if(key4==0)
210 2 {
211 3 while(!key4);
212 3 cm--;
213 3 if(cm==-1)
214 3 cm=59;
215 3 }
216 2 if(key5==0)
217 2 {
218 3 while(!key5);
219 3 ch--;
220 3 if(ch==-1)
221 3 ch=23;
222 3 }
223 2 }
224 1 display(ch,cm,cs);
225 1 h=ch;
226 1 m=cm;
227 1 }
228 void display(h,m,s) //显示程序
229 {
230 1 h1=h%10;
231 1 h2=h/10;
232 1 m1=m%10;
233 1 m2=m/10;
234 1 s1=s%10;
235 1 s2=s/10;
236 1 P1=0xfe;
237 1 P0=disp_code[s1];
238 1 delay(2);
239 1 P1=0xfd;
240 1 P0=disp_code[s2];
C51 COMPILER V6.12 FINALCLOCK 08/29/2010 19:31:23 PAGE 5
241 1 delay(2);
242 1 P1=0xfb;
243 1 P0=disp_code[17];
244 1 delay(2);
245 1 P1=0xf7;
246 1 P0=disp_code[m1];
247 1 delay(2);
248 1 P1=0xef;
249 1 P0=disp_code[m2];
250 1 delay(2);
251 1 P1=0xdf;
252 1 P0=disp_code[17];
253 1 delay(2);
254 1 P1=0xbf;
255 1 P0=disp_code[h1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -