📄 51
字号:
C51 COMPILER V8.09 EX75 07/12/2010 13:32:37 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE EX75
OBJECT MODULE PLACED IN ex75.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex75.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //独立式键盘调时的数码时钟实验
2 #include<reg52.h> // 包含51单片机寄存器定义的头文件
3 unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9的段码
4 unsigned char int_time ; //中断次数计数变量
5 unsigned char second; //秒计数变量
6 unsigned char minute; //分钟计数变量
7 unsigned char hour; //小时计数变量
8
9 sbit S1=P3^2; //将S1位定义为P3.2
10 sbit S2=P3^3; //将S2位定义为P3.3
11 sbit S3=P3^4; //将S3位定义为P3.4
12 sbit S4=P3^5; //将S4位定义为P3.5
13
14 /******************************************************************
15 函数功能:数码管扫描延时
16 ********************************************************************/
17 void delay(void)
18 {
19 1 unsigned char j;
20 1 for(j=0;j<200;j++)
21 1 ;
22 1 }
23 /******************************************************************
24 函数功能:键盘扫描延时
25 ********************************************************************/
26 void delay60ms(void)
27 {
28 1 unsigned char i,j;
29 1 for(i=0;i<200;i++)
30 1 for(j=0;j<100;j++)
31 1 ;
32 1 }
33
34 /******************************************************************
35 函数功能:显示秒
36 入口参数:s
37 ********************************************************************/
38 void DisplaySecond(unsigned char s)
39 {
40 1 P2=0xbf; //P2.6引脚输出低电平, DS6点亮
41 1 P0=Tab[s/10]; //显示十位
42 1 delay();
43 1
44 1 P2=0x7f; //P2.7引脚输出低电平, DS7点亮
45 1 P0=Tab[s%10]; //显示个位
46 1 delay();
47 1
48 1 P0=0xff; //关闭所有数码管
49 1
50 1 }
51
52 /******************************************************************
53 函数功能:显示分钟
54 入口参数:m
55 ********************************************************************/
C51 COMPILER V8.09 EX75 07/12/2010 13:32:37 PAGE 2
56 void DisplayMinute(unsigned char m)
57 {
58 1 P2=0xf7; // P2.3引脚输出低电平, DS3点亮
59 1 P0=Tab[m/10];//显示个位
60 1 delay();
61 1
62 1 P2=0xef; // P2.4引脚输出低电平, DS4点亮
63 1 P0=Tab[m%10];
64 1 delay();
65 1
66 1 P2=0xdf; //P2.5引脚输出低电平, DS5点亮
67 1 P0=0xbf; //分隔符“-”的段码
68 1 delay();
69 1
70 1 P0=0xff; //关闭所有数码管
71 1 }
72 /******************************************************************
73 函数功能:显示小时的子程序
74 入口参数:h
75 ********************************************************************/
76 void DisplayHour(unsigned char h)
77 {
78 1
79 1 P2=0xfe; //P2.0引脚输出低电平, DS0点亮
80 1 P0=Tab[h/10]; //显示十位
81 1 delay();
82 1
83 1
84 1 P2=0xfd; //P2.1引脚输出低电平, DS1点亮
85 1 P0=Tab[h%10]; //显示个位
86 1 delay();
87 1
88 1
89 1 P2=0xfb; //P2.2引脚输出低电平, DS2点亮
90 1 P0=0xbf; //分隔符“-”的段码
91 1 delay();
92 1
93 1 P0=0xff; //关闭所有数码管
94 1
95 1 }
96 /******************************************************************
97 函数功能:键盘扫描
98 ********************************************************************/
99 void key_scan(void)
100 {
101 1 P3=0x3c; //将P1口高4位置高电平“1”
102 1 if((P3&0x3c)!=0x3c) //有键按下
103 1 {
104 2 delay60ms(); //延时60ms再检测
105 2 if((P3&0x3c)!=0x3c) //确实有键按下
106 2 {
107 3 if(S1==0) //如果是S1键按下
108 3 second++; //秒加1
109 3 if(S2==0) //如果是S2键按下
110 3 minute++; //分钟加1
111 3 if(S3==0) //如果是S3键按下
112 3 hour++; //小时加1
113 3 if(S4==0) //如果是S4键按下
114 3 {
115 4 second=0; //秒清0
116 4 minute=0; //分钟清0
117 4 hour=0; //小时清0
C51 COMPILER V8.09 EX75 07/12/2010 13:32:37 PAGE 3
118 4 }
119 3 }
120 2 }
121 1 }
122
123 /******************************************************************
124 函数功能:主函数
125 ********************************************************************/
126
127 void main(void)
128 {
129 1
130 1 TMOD=0x01; //使用定时器T0
131 1 EA=1; //开中断总允许
132 1 ET0=1; //允许T0中断
133 1 TH0=(65536-46083)/256; //定时器高八位赋初值
134 1 TL0=(65536-46083)%256; //定时器低八位赋初值
135 1 TR0=1; //启动定时器T0
136 1 int_time=0; //中断计数变量初始化
137 1 second=0; //秒计数变量初始化
138 1 minute=0; //分钟计数变量初始化
139 1 hour=0; //小时计数变量初始化
140 1
141 1 while(1)
142 1 {
143 2 DisplaySecond(second); //调用秒显示子程序
144 2 delay();
145 2
146 2 DisplayMinute(minute); //调用分钟显示子程序
147 2 delay();
148 2
149 2
150 2 DisplayHour(hour); //调用小时显示子程序
151 2 delay();
152 2
153 2
154 2
155 2 }
156 1 }
157
158 /******************************************************************
159 函数功能:定时器T0的中断服务子程序
160 ********************************************************************/
161 void interserve(void ) interrupt 1 using 1 //using Time0
162 {
163 1 TR0=0; //关闭定时器T0
164 1 int_time++; //中断次数加1
165 1 if(int_time==20) //如果中断次数满20
166 1 {
167 2 int_time=0; //中断计数变量清0
168 2 second++; //秒计数变量加1
169 2 }
170 1 if(second==60) //如果秒计满60
171 1 {
172 2 second=0; //如果秒计满60,将秒计数变量清0
173 2 minute++; //分钟计数变量加1
174 2 }
175 1 if(minute==60) //如果分钟计满60
176 1 {
177 2 minute=0; //如果分钟计满60,将分钟计数变量清0
178 2 hour++; //小时计数变量加1
179 2 }
C51 COMPILER V8.09 EX75 07/12/2010 13:32:37 PAGE 4
180 1 if(hour==24) //如果小时计满24
181 1 {
182 2 hour=0; //如果小时计满24,将小时计数变量清0
183 2 }
184 1 key_scan(); //执行键盘扫描
185 1 TH0=(65536-46083)/256; //定时器T0高四位赋值
186 1 TL0=(65536-46083)%256; //定时器T0低四位赋值
187 1 TR0=1; //启动定时器T0
188 1
189 1 }
190
191
192
193
194
195
196
197
198
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 296 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -