📄 clock.lst
字号:
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 1
C51 COMPILER V8.06, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE clock.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <AT89x51.h>
2 #include "intrins.h"
3 unsigned char hour,min,sec,year,month,day,weekday; //当前时间?日期?星期
4 unsigned int count_down; //1秒钟计时用
5 bit led_on; //数码管是否点亮的标志
6 unsigned char display[8]; //8位数码管要显示的数据
7 unsigned char attr; //八个数码管的闪烁控制字节,当为0时,对应数码管闪
8 bit flash; //LED 闪烁开关,与attr共同决定数码管是否闪烁
9 unsigned char show_status; //LED 显示状态标志
10 // 0:设置闹钟数据
11 // 1:显示当前日期及星期
12 // 2:显示当前时间
13 // 3:设置当前日期
14 // 4:设置当前时间
15 bit km; //按键已去抖动标志
16 bit kp; //按键已处理标志
17 bit sound; //蜂鸣器响标志
18 bit alarm_stop; //蜂鸣器响后用户手工按停标志
19 struct { unsigned char h; //小时
20 unsigned char m; //分钟
21 } alarm[8]; //定义结构数组,8个闹钟项
22 unsigned char alarm_en; //闹钟项启用标志
23 unsigned char alarm_wk; //闹钟项周末启用标志
24 unsigned char cur_alarm_set; //当前设置的闹钟项
25 unsigned char cur_alarm_active; //当前到点的闹钟项
26 bit new_alarm_info; //闹钟项内容已修改标志
27 sbit sound_output = P1^5; //蜂鸣器驱动端口,输出0时蜂鸣器响
28 sbit SDA = P1^6; //EEPROM数据线端口
29 sbit SCL = P1^7; //EEPROM时钟线端口
30
31
32 //以下是EEPROM操作时需要的延时函数
33 void I2cDelay()
34 {
35 1 _nop_(); _nop_(); _nop_();
36 1 _nop_(); _nop_(); _nop_();
37 1 }
38
39 //以下是延迟函数,参数为毫秒数
40 void DelayX1ms(unsigned char count)
41 {
42 1 unsigned char i,j;
43 1 for(i=0;i<count;i++)
44 1 for(j=0;j<240;j++) ;
45 1 }
46
47 //以下是I2C启动函数,24C08使用I2C方式
48 void Start()
49 {
50 1 SDA=1;
51 1 I2cDelay();
52 1 SCL=1;
53 1 I2cDelay();
54 1 SDA=0;
55 1 I2cDelay();
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 2
56 1 SCL=0;
57 1 }
58
59 //以下是I2C停止函数
60 void Stop()
61 {
62 1 I2cDelay();
63 1 SDA=0;
64 1 I2cDelay();
65 1 SCL=1;
66 1 I2cDelay();
67 1 SDA=1;
68 1 I2cDelay();
69 1 }
70
71 //以下是发送1字节数据给EEPROM函数
72 bit SendByte(unsigned char value)
73 {
74 1 unsigned char i;
75 1 bit no_ack=0;
76 1 for(i=0;i<8;i++) //发送8位数据
77 1 {
78 2 I2cDelay();
79 2 if(value&0x80) SDA=1;
80 2 else SDA=0;
81 2 value=value<<1;
82 2 I2cDelay();
83 2 SCL=1;
84 2 I2cDelay();
85 2 I2cDelay();
86 2 SCL=0;
87 2 }
88 1 I2cDelay();
89 1 SDA=1; //确认脉冲周期,等待EEPROM的确认
90 1 I2cDelay();
91 1 SCL=1;
92 1 I2cDelay();
93 1 if(SDA==1) no_ack=1;
94 1 I2cDelay();
95 1 SCL=0;
96 1 return no_ack;
97 1 }
98
99 //以下是向EEPROM写1字节函数
100 void mywrite(unsigned char address,unsigned char value)
101 {
102 1 Start();
103 1 SendByte(0xa0); //发送从地址
104 1 SendByte(address); //发送子地址
105 1 SendByte(value); //发送数值
106 1 Stop();
107 1 DelayX1ms(10);
108 1 }
109
110 //以下是从EEPROM接收1字节函数
111 unsigned char ReadByte()
112 {
113 1 unsigned char i,bval;
114 1 bval=0;
115 1 for(i=0;i<8;i++) //接收8位数据
116 1 {
117 2 I2cDelay();
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 3
118 2 SDA=1; //从P1输入数据时,先往P1输入"1"
119 2 I2cDelay();
120 2 SCL=1;
121 2 I2cDelay();
122 2 bval=bval<<1;
123 2 if(SDA) bval=bval|0x01;
124 2 I2cDelay();
125 2 SCL=0;
126 2 }
127 1 I2cDelay();
128 1 SDA=1; //确认脉冲周期,不送出确认
129 1 I2cDelay();
130 1 SCL=1;
131 1 I2cDelay();
132 1 I2cDelay();
133 1 return(bval);
134 1 }
135 //以下是从EEPROM读入1字节数据函数
136 unsigned char myread(unsigned char address)
137 {
138 1 unsigned char tmp;
139 1 Start();
140 1 SendByte(0xa0);
141 1 SendByte(address);
142 1 Start();
143 1 SendByte(0xa1);
144 1 tmp=ReadByte();
145 1 Stop();
146 1 DelayX1ms(2);
147 1 return(tmp);
148 1 }
149
150
151 //以下是定时器0中断程序,用于走时,1/8000秒一次
152 void Timer0ISR(void) interrupt 1 using 3
153 {
154 1 unsigned char tmp; unsigned int tmp_days;
155 1 P3=~P3;
156 1 count_down--;
157 1 if(count_down==1 || count_down==1001 || count_down==2001 || count_down==3001)
158 1 {
159 2 flash=~flash; //数码管闪烁的开关量
160 2 if(sound && flash)
161 2 sound_output=0; //驱动蜂鸣器
162 2 else sound_output=1; //关闭蜂鸣器
163 2 return;
164 2 }
165 1 /*** 计算当前日期为星期几***/
166 1 if(count_down==1500)
167 1 {
168 2 if(year==0) weekday=5; //2000年1月1日为星期六
169 2 else {
170 3 tmp=(year-1)/4+1;
171 3 tmp=(year-tmp)+tmp*2;
172 3 weekday=(tmp+5)%7;
173 3 } //计算出当前年的1月1日为星期几
174 2
175 2 tmp_days=0;
176 2 for(tmp=1;tmp<month;tmp++)
177 2 if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10 || tmp==12)
178 2 tmp_days=tmp_days+31;
179 2 else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 4
180 2 tmp_days=tmp_days+30;
181 2 else if(tmp==2)
182 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -