📄 timer.lst
字号:
C51 COMPILER V7.50 TIMER 11/16/2008 13:42:40 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN timer.OBJ
COMPILER INVOKED BY: D:\Tool\keil\C51\BIN\C51.EXE timer.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*---------------------------------------------------------------
2 井威改了
3 说明:一个可设定时间的时钟,外接12MHZ的晶振
4 4个button用来调节时间的
5 button0 小时加1
6 button1 小时减1
7 button2 分钟加1
8 button3 分钟减1
9 hs 小时十位
10 hg 小时个位
11 fs 分钟十位
12 fg 分钟个位
13 ms 秒钟十位
14 mg 秒钟个位
15 初始化时间为00:00:00
16 ---------------------------------*/
17 #include <reg51.h>
18 #include <ds18b20.h>
19
20 #define uint unsigned int
21 #define uchar unsigned char
22 /*七段共阳管显示定义*/
23 uchar code SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
24 //初始化变量
25 uchar hs=0,hg=0,fs=0,fg=0,ms=0,mg=0;
26 sbit P1_0=P1^0;
27 sbit P1_1=P1^1;
28 sbit P1_2=P1^2;
29 sbit P1_3=P1^3;
30 sbit P1_7=P1^7;
31
32 void delay(uchar k); //延时子程序
33 void time_pro(); //时间处理子程序
34 void display(); //显示子程序
35
36 //延时k ms的子程序
37
38 void delay(uchar k)
39 {
40 1 unsigned char j;
41 1 while((k--)!=0)
42 1 {
43 2 for(j=0;j<125;j++)
44 2 {;}
45 2 }
46 1 }
47
48 void time_pro(void)
49 {
50 1
51 1 if(mg==10) //秒钟设为60进制
52 1 mg=0,ms++;
53 1 if(ms==6)
54 1 ms=0,fg++;
55 1 if(fg==10) //分钟设为60进制
C51 COMPILER V7.50 TIMER 11/16/2008 13:42:40 PAGE 2
56 1 fg=0,fs++;
57 1 if(fs==6)
58 1 fs=0,hg++;
59 1 if(hs!=2&&hg==10) //时钟设为24进制
60 1 hg=0,hs++;
61 1 if(hs==2&&hg==4)
62 1 hg=0,hs=0;
63 1 }
64
65 void display(void)
66 {
67 1 P2=0x01;
68 1 P0=SEG7[hs]; //显示小时的十位
69 1 delay(4);
70 1 P2=0x02;
71 1 P0=SEG7[hg]; //显示小时的个位
72 1 delay(4);
73 1 P2=0x4;
74 1 P0=SEG7[fs]; //显示分钟的十位
75 1 delay(4);
76 1 P2=0x08;
77 1 P0=SEG7[fg]; //显示分钟的个位
78 1 delay(4);
79 1 P2=0x10;
80 1 P0=SEG7[ms]; //显示秒钟的十位
81 1 delay(4);
82 1 P2=0x20;
83 1 P0=SEG7[mg]; //显示秒钟的个位
84 1 delay(4);
85 1 //每次显示的延时4ms,这样可以保证动态扫描6个LED
86 1 /*本来显示的位段码应是从0x01到0x20的,但是这样设置的话,在P0显示
87 1 的顺序就向右移了一位,在其他IO口就不会哦,不知道是什么原因,
88 1 希望有人可以告诉我,Email:tian53169@163.com
89 1 为了在P0口中按正确的顺序显示,我把位段码向右移了一位,就是现在的顺序了
90 1 */
91 1
92 1 }
93
94 void timer0(void) interrupt 1 using 1 //定时器0方式1,50ms中断一次
95 {
96 1
97 1 P1_7=!P1_7; //当P_7=1启动T/C1的中断
98 1 TH0=(65536-50000)/256;
99 1 TL0=(65536-50000)%256;
100 1
101 1 }
102
103 void timer1(void) interrupt 3 using 2 //计数器1方式2,1s中断一次
104 {
105 1 mg++; //秒钟加1
106 1 }
107
108
109 void button0(void) //按键0的子程序
110 {
111 1 if(P1_0==1)
112 1 {
113 2 delay(50); //延时50ms去抖动,再扫描
114 2 if(P1_0==1)
115 2 hg++;
116 2 }
117 1 }
C51 COMPILER V7.50 TIMER 11/16/2008 13:42:40 PAGE 3
118
119 void button1(void) //按键1的子程序
120 {
121 1 if(P1_1==1)
122 1 {
123 2 delay(50);
124 2 if(P1_1==1)
125 2 {
126 3 if(hs==0&&hg==0) //为00时减1为23
127 3 hs=2,hg=3;
128 3 else if(hg==0)
129 3 hs--,hg=9;
130 3 else
131 3 hg--;
132 3 }
133 2 }
134 1 }
135
136 void button2(void) //按键2的子程序
137 {
138 1 if(P1_2==1)
139 1 {
140 2 delay(50);
141 2 if(P1_2==1)
142 2 fg++;
143 2 }
144 1 }
145
146 void button3(void) //按键3的子程序
147 {
148 1 if(P1_3==1)
149 1 {
150 2 delay(50);
151 2 if(P1_3==1)
152 2 {
153 3 if(fs==0&&fg==0) //当为00时减1为59
154 3 fs=5,fg=9;
155 3 else if(fg==0)
156 3 fs--,fg=9;
157 3 else
158 3 fg--;
159 3 }
160 2 }
161 1 }
162
163 void main(void)
164 {
165 1 P1_7=1;
166 1 P1=0x00; //初始化p1口,全设为0
167 1 TMOD=0x61; //time1为计数器,方式2,time0为定时器,方式1
168 1 TH0=(65536-50000)/256; //预置计数初值
169 1 TL0=(65536-50000)%256;
170 1 TH1=256-10;
171 1 TL1=256-10;
172 1 EA=1; //开cpu中断
173 1 ET0=1; //T/C0开中断
174 1 ET1=1; //T/C1开中断
175 1 TR0=1; //启动T/C0开始计时
176 1 TR1=1; //启动T/C0开始计时
177 1 do
178 1 {
179 2
C51 COMPILER V7.50 TIMER 11/16/2008 13:42:40 PAGE 4
180 2 button0(); //扫描按键0
181 2 button1(); //扫描按键1
182 2 button2(); //扫描按键2
183 2 button3(); //扫描按键3
184 2 time_pro(); //时间处理
185 2 display(); //显示时间
186 2
187 2 }
188 1 while(1);
189 1
190 1 }
191
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 500 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 2
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 + -