📄 clock2.lst
字号:
C51 COMPILER V7.50 CLOCK2 08/29/2006 19:01:56 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CLOCK2
OBJECT MODULE PLACED IN clock2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE clock2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************************************************/
2 /* 程序名:数码管显示的时钟代码 */
3 /* */
4 /* 晶振:12.0 M CPU型号:AT89S52 */
5 /* */
6 /* */
7 /* 功能描述: 数码管时钟显示,需将J2跳线帽插上 */
8 /* 但是要拔去LCD12864和LCD1602! */
9 /* */
10 /* http://www.mculover.net */
11 /* http://www.mculover.net/bbs */
12 /* */
13 /* */
14 /* 湘灵电子工作室 版权所有 */
15 /* 2006-03-20 */
16 /************************************************************************************/
17 #include<reg51.h>
18
19 #define _TH0_TL0_ (65536 - 50000)
20 #define HI (_TH0_TL0_ / 256) //给高8位赋值3C
21 #define LO (_TH0_TL0_ % 256) //给低8位赋值B0
22 #define M 20 //(1000/50)1秒要50个中断的累计
23
24 //65536-0X3CB0=50000
25
26 sbit P2_0 = P2 ^ 0;
27 sbit P2_1 = P2 ^ 1;
28 sbit P2_2 = P2 ^ 2;
29 sbit P2_3 = P2 ^ 3;
30 sbit P2_4 = P2 ^ 4;
31 sbit P2_5 = P2 ^ 5;
32 sbit P2_6 = P2 ^ 6;
33 sbit P2_7 = P2 ^ 7;
34
35 //unsigned char hour = 12, min = 0, sec = 0; //初始化时分秒的值
36 struct Time{
37 unsigned char hour;
38 unsigned char min;
39 unsigned char sec;
40 }clock;
41
42 //struct Time clock;
43
44 unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
45 unsigned char Led[6];
46
47 /*********************************************************************************************/
48 void Delay(unsigned char a)//延时程序
49 {
50 1 unsigned char j;
51 1 while(--a != 0)
52 1 {
53 2 for (j = 0; j < 125; j++);
54 2 }
55 1 }
C51 COMPILER V7.50 CLOCK2 08/29/2006 19:01:56 PAGE 2
56
57 /*********************************************************************************************/
58 void Disp(void)//数码管显示
59 {
60 1 P2_7 = 0; //第一个数码管显示时的十位
61 1 // P0 = SEG_TAB[ hour / 10 ];
62 1 Led[0] = clock.hour / 10;
63 1 P0 = SEG_TAB[Led[0]];
64 1 Delay(4);
65 1 P2_7 = 1;
66 1
67 1 P2_6 = 0;//第2个数码管显示时的个位
68 1 //P0 = SEG_TAB[ hour % 10 ];
69 1 Led[1] = clock.hour % 10;
70 1 P0 = SEG_TAB[Led[1]];
71 1 Delay(4);
72 1 P2_6 = 1;
73 1
74 1 P2_4 = 0;//第4个数码管显示分的十位
75 1 // P0 = SEG_TAB[ min / 10 ];
76 1 Led[2] = clock.min / 10;
77 1 P0 = SEG_TAB[Led[2]];
78 1 Delay(4);
79 1 P2_4 = 1;
80 1
81 1 P2_3 = 0;//第5个数码管显示分的个位
82 1 // P0 =SEG_TAB[ min % 10 ];
83 1 Led[3] = clock.min % 10;
84 1 P0 = SEG_TAB[Led[3]];
85 1 Delay(4);
86 1 P2_3 = 1;
87 1
88 1 P2_1 = 0;//第7个数码管显示秒的十位
89 1 // P0 = SEG_TAB[ sec / 10 ];
90 1 Led[4] = clock.sec / 10;
91 1 P0 = SEG_TAB[Led[4]];
92 1 Delay(4);
93 1 P2_1 = 1;
94 1
95 1 P2_0 = 0;//第8个数码管显示秒的各位。
96 1 // P0 = SEG_TAB[ sec % 10 ];
97 1 Led[5] = clock.sec % 10;
98 1 P0 = SEG_TAB[Led[5]];
99 1 Delay(4);
100 1 P2_0 = 1;
101 1 }
102
103 /********************************************************************************************/
104 void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序
105 {
106 1 static unsigned char count = 0; //定义静态变量count
107 1
108 1 TR0 = 0; //以下调整出栈入栈的时间误差
109 1 TL0 += (_TH0_TL0_ + 9) % 256;
110 1 TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
111 1 TR0 = 1;
112 1
113 1 count++;
114 1 if(count == M)//1秒种时间到
115 1 {
116 2 count = 0;
117 2 clock.sec++;
C51 COMPILER V7.50 CLOCK2 08/29/2006 19:01:56 PAGE 3
118 2 if( clock.sec == 60)//1分钟时间到
119 2 {
120 3 clock.min++;
121 3 clock.sec = 0;
122 3 if( clock.min == 60)//1小时时间到
123 3 {
124 4 clock.hour++;
125 4 clock.min = 0;
126 4 if( clock.hour == 24)//24小时时间到
127 4 {
128 5 clock.hour = 0;
129 5 clock.min = 0;
130 5 clock.sec = 0;
131 5 }
132 4 }
133 3 }
134 2 }//if
135 1 }
136
137 /******************************************************************************************/
138 void Timer0Init(void) //初始化定时器0程序
139 {
140 1 TMOD = 0x01; //设置模式1 定时器0 工作方式0
141 1
142 1 TH0 = HI; //给TH0,TL0赋初始值
143 1 TL0 = LO;
144 1
145 1 TR0 = 1; //启动定时器0
146 1 ET0 = 1; //定时器中断开
147 1 EA = 1; //总中断开
148 1 }
149
150 /******************************************************************************************/
151 void main(void)//主函数
152 {
153 1 Timer0Init();//初始化定时器0
154 1
155 1 while(1)
156 1 {
157 2 Disp();//显示时间
158 2 }
159 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 227 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 ----
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 + -