51 单片机:利用数码管显示脉冲的时间(计时器)

  1. 1. 实验 2 利用数码管显示脉冲的时间(计时器)

这学期我开了单片机的课,之后会将我的一些作业发自己网站上,希望能有用。

实验 2 利用数码管显示脉冲的时间(计时器)

本实验利用“共阳数码管”显示测量脉冲的时间(ms),而这个脉冲由按键产生。

代码如下,对其中的一些语句做出了标注。

说明:我所用的 STC 实验板中,p21-p24 是“4 位共阳数码管”的第一位数字的控制引脚,P0 是数码管的公共极;p32 是按键引脚,按下是高电平。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<reg51.h>
sbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit p24=P2^4;
sbit p32=P3^2;
unsigned char led[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 共阳 0~9
unsigned int n=0,s=0,i=0,qian=0,bai=0,shi=0,ge=0;
void delay(int z)// 延时函数
{
int i,j;
for(i=z;i>0;i--)
for(j=0;j<921;j++);
}
void main()
{
TMOD=0x01;
TH0=0x00;// 高八位时间初值
TL0=0x00;// 低八位时间初值

EA=1;// 中断总开关
ET0=1;//T0 定时器中断子开关

while(p32==1){delay(20);}
TR0=1; // 打开计时器
while(p32==0){delay(20);} // 等待电平由低变高
while(p32==1)
{
s=(n*65536+TH0*256+TL0)/1000;
qian=s/1000%10;
bai=s/100%10;
shi=s/10%10;
ge=s%10;

switch(i)
{
case 0:P0=0xff;p21=0;p22=1;p23=1;p24=1;P0=led[qian];i++;break;
case 1:P0=0xff;p21=1;p22=0;p23=1;p24=1;P0=led[bai];i++;break;
case 2:P0=0xff;p21=1;p22=1;p23=0;p24=1;P0=led[shi];i++;break;
case 3:P0=0xff;p21=1;p22=1;p23=1;p24=0;P0=led[ge];i=0;break;
default:break;
}

} // 等待电平由高变低
TR0=0; // 关闭计时器
while(1)
{
switch(i) // 同上
{
case 0:P0=0xff;p21=0;p22=1;p23=1;p24=1;P0=led[qian];i++;break;
case 1:P0=0xff;p21=1;p22=0;p23=1;p24=1;P0=led[bai];i++;break;
case 2:P0=0xff;p21=1;p22=1;p23=0;p24=0;P0=led[shi];i++;break;
case 3:P0=0xff;p21=1;p22=1;p23=1;p24=1;P0=led[ge];i=0;break;
default:break;
}
}
}
void Timer0() interrupt 1 using 0
{
n++;
TH0=0x00;// 高八位时间初值
TL0=0x00;// 低八位时间初值
}