📄 2051.lst
字号:
C51 COMPILER V9.01 2051 09/19/2012 10:47:35 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE 2051
OBJECT MODULE PLACED IN 2051.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 2051.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //目标器件AT89C2051晶振12M
2 //单键操作实现校时和每天任意两个时间点定闹
3
4 //在有闹铃响时按键则停闹
5 //在正常模式时按键则开启或关闭闹铃功能
6
7 //查看闹铃时间:在正常模式时第1次按键显示第1闹铃时间,第2次按键显示第2闹铃时间,3秒后返回正常模式
8
9 //设置闹铃时间:在正常模式时在3秒内连按3次键进入闹钟设定模式,此时若不按键5秒后返回正常模式
10 //继续按键则时数跳变,再按键分数跳变,再按键完成第1闹铃时间设置等待确认
11 //继续按键则进入第2闹铃时间设置否则5秒后返回正常模式
12
13 //设置时钟时间:在正常模式时长按键5秒则进入校时模式,设置过程与闹铃模式相似,设置完成后返回正常模式
14 //2008年10月12日 I2C
15
16 //头文件包含
17 #include <reg52.h>
18 #define uchar unsigned char
19 #define uint unsigned int
20 #define CYCLE0 50240 //每隔CYCLE0微秒T0产生中断
21 #define CYCLE1 20000 //每隔CYCLE1微秒T1产生中断
22 #define num 400 //显示扫描延时量
23
24 #define Second 0 //时钟秒单元
25 #define Minute 1 //时钟分单元
26 #define Hour 2 //时钟时单元
27 #define Minute_n1 3 //闹铃时单元
28 #define Hour_n1 4 //闹铃分单元
29 #define Minute_n2 5 //闹铃时单元
30 #define Hour_n2 6 //闹铃分单元
31
32 #define DispOut P3 //字符码由P3输出
33 //#define DisScan P1 //位扫描码由P1输出
34
35 //数据缓冲区
36 uchar TimeData[7]; //时间数据缓冲区
37 uchar DispData[4]; //显示缓冲区
38
39 //共阳数码管0~9字符表
40 uchar code Disp[10]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50};
41
42 //全局变量定义
43 uchar KeyVal,f; //键值单元
44
45 //内部可寻址位定义
46 bit SecondFlag; //时钟秒信号位
47 bit SecondFlashFlag; //时钟秒闪信号位
48 bit AddFlag; //设定模式增量信号位
49
50 bit TimeSetFlag; //校时模式标志位
51 bit TimingSetFlag; //闹铃模式标志位
52 bit SetModeFlag; //设置模式标志位
53
54 bit TimingFunFlag; //闹铃功能的标志位
55 bit TimingSuitedFlag; //闹铃时间匹配标志位
C51 COMPILER V9.01 2051 09/19/2012 10:47:35 PAGE 2
56 bit BeeNopFlag; //闹铃输出反相信号位
57 bit BeeMusicFlag; //闹铃声次数信号位
58 bit BeeSpaceFlag; //闹铃声间隔信号位
59 bit TimingDisSelectFlag; //闹铃时间显示选取择控制位
60
61 bit KeyTimeOutFlag; //连续击键超时计数控制位
62 bit UnpressKeyTimeFlag; //无按键计时控制位
63
64 //输出连接定义
65 sbit Hour_SWei= P1^5; //时十位驱动
66 sbit Hour_GWei= P1^4; //时个位驱动
67 sbit Min_SWei= P1^3; //分十位驱动
68 sbit Min_GWei= P1^2; //分个位驱动
69 //sbit Timing_LED= P3^4; //模式指示长亮时表示闹钟功能启动
70 sbit Button_S1= P1^7; //按键S1
71 sbit Bee_Out= P1^6; //闹铃输出
72
73 //函数声明
74 void Delay(uint i); //延时函数
75 void System_init(void); //系统初始化函数
76 void TimerMake(void); //计时函数
77 void Display(void); //显示函数
78 void KeyScan(void); //键值产生函数
79 void KeyFunction(void); //键功能处理函数
80 void TimeCompate(void); //时间比较函数
81 void ChangeData(uchar *x); //设置模式自动增量函数
82 void TimeDisData(void); //时钟数据显示处理函数
83 void TimingDisData(void); //闹铃数据显示处理函数
84 void ClearFlag(void);
85 void StartBuzze(void);
86 void T0_intermit(void); //T0中断函数
87 void T1_intermit(void); //T1中断函数
88
89 //主函数
90 void main(void)
91 {
92 1 uchar DispScanTime;
93 1 uchar KeyTimeOut;
94 1 uchar UnpressKeyTime;
95 1
96 1 System_init();
97 1
98 1 while(1)
99 1 {
100 2 DispScanTime++;
101 2 //显示扫描
102 2 if(DispScanTime%25==0)
103 2 Display();
104 2 //键盘扫描
105 2 if(DispScanTime>250)
106 2 {
107 3 DispScanTime=0;
108 3 Bee_Out=1; //关闭蜂鸣声
109 3 KeyScan();
110 3 KeyFunction();
111 3 }
112 2 //计时
113 2 if(SecondFlag)
114 2 {
115 3 SecondFlag=0;
116 3 //时钟计时
117 3 TimerMake();
C51 COMPILER V9.01 2051 09/19/2012 10:47:35 PAGE 3
118 3 //连续击键超时计时
119 3 if(KeyTimeOutFlag)
120 3 {
121 4 if(++KeyTimeOut>=3)
122 4 ClearFlag(); //返回正常模式
123 4 }
124 3 else
125 3 KeyTimeOut=0;
126 3 //无按键计时
127 3 if(UnpressKeyTimeFlag)
128 3 {
129 4 if(++UnpressKeyTime>=5)
130 4 ClearFlag();
131 4 }
132 3 else
133 3 UnpressKeyTime=0;
134 3 }
135 2 //闹铃启动
136 2 if(TimingFunFlag&&!SetModeFlag&&!TimingSuitedFlag)
137 2 {
138 3 TimeCompate(); //时间比较
139 3 // Timing_LED=0; //LED亮表示闹铃功能生效
140 3 }
141 2 //声光闹铃输出
142 2 else if(TimingSuitedFlag&&BeeSpaceFlag)
143 2 {
144 3 BeeNopFlag=BeeMusicFlag;
145 3 Bee_Out=!BeeNopFlag; //取反再输出
146 3 // Timing_LED=!BeeSpaceFlag; //闹铃输出时LED闪烁
147 3 }
148 2 // else
149 2 // Timing_LED=1;
150 2 }
151 1 }
152
153 //初始化函数
154 void System_init(void)
155 {
156 1 //置显示初值
157 1 TimeData[Hour]=12; //时间初值
158 1 TimeData[Minute]=58;
159 1
160 1 TimeData[Hour_n1]=6; //第一组闹铃初值
161 1 TimeData[Minute_n1]=36;
162 1
163 1 TimeData[Hour_n2]=7; //第二组闹铃初值
164 1 TimeData[Minute_n2]=15;
165 1 //初始化P3口
166 1 P1=0xff;
167 1 //设T0,T1为方式1
168 1 TMOD=0x11;
169 1 //装T0初值
170 1 TH0=(-CYCLE0)/256;
171 1 TL0=(-CYCLE0)%256;
172 1 //装T1初值
173 1 TH1=(-CYCLE1)/256;
174 1 TL1=(-CYCLE1)%256;
175 1 //开中断及启动T0
176 1 EA =1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -