在51单片机实验板上,用C语言编程实现秒表计时器的设计。51单片机外接晶振频率为12MHz,使用单片机定时/计数器的工作方式1产生周期为50ms的方波,由此产生秒表计时器的1秒时钟信号。 1.该秒表计时器在0~59秒范围内循环计时,每次增加1秒。 2.当复位键有效时,该计时器清零后停止计时。 3.在复位键无效的前提下,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时。 4.使用两位数码管动态显示计时值。
时间: 2023-05-24 22:01:24 浏览: 461
可以使用C语言编写以下代码实现秒表计时器的设计:
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit en=P2^0; // 使能键
sbit rst=P2^1; // 复位键
sbit dula=P2^6; // 两位数码管段选1
sbit wela=P2^7; // 两位数码管段选2
uchar code table[]={
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
}; // 数码管显示表
uint cnt=0; // 计数器
bit flag=0; // 标志位,表示计时器是否在计时
void delay(uint x) // 延时函数,x为延时时间
{
uint i,j;
for(i=x; i>0; i--)
for(j=110; j>0; j--);
}
void display(uchar num) // 数码管显示函数,num为要显示的数字
{
wela=1; // 打开第二位数码管的段选
P0=table[num/10]; // 显示十位
wela=0;
dula=1; // 打开第一位数码管的段选
P0=table[num%10]; // 显示个位
dula=0;
}
void Timer0() interrupt 1 // 定时器0中断服务函数
{
TH0=(65536-50000)/256; // 定时器0初值
TL0=(65536-50000)%256;
cnt++; // 计数器加1
if(cnt==20) // 如果计数器达到20,表示1秒钟已经过去
{
cnt=0; // 计数器清零
flag=1; // 标志位置1,表示计时器可以加一秒钟
}
}
void main()
{
TMOD=0x01; // 定时器0工作方式为模式1
TH0=(65536-50000)/256; // 定时器0初值
TL0=(65536-50000)%256;
EA=1; // 打开总中断
ET0=1; // 打开定时器0中断
TR0=1; // 启动定时器0
while(1)
{
if(rst==0) // 复位键有效
{
cnt=0; // 计数器清零
flag=0; // 标志位清零,表示计时器不能计时
display(cnt); // 数码管显示0
}
if(en==0) // 使能键有效
{
if(flag) // 标志位为1,表示计时器可以加一秒钟
{
flag=0; // 标志位清零
cnt++; // 计数器加1
if(cnt>=60) // 如果计数器达到60,表示一分钟已经过去
cnt=0; // 计数器回到0,重新开始计时
display(cnt); // 数码管显示计时结果
delay(5); // 延时5毫秒,避免数码管显示闪烁
}
}
else // 使能键无效
flag=0; // 标志位清零,表示计时器不能计时
}
}
```
在51单片机实验板上外接晶振频率为12MHz,使用单片机定时/计数器的工作方式1产生周期为50ms的方波,由此产生秒表计时器的1秒时钟信号,实现了秒表计时器在0~59秒范围内循环计时,每次增加1秒,当复位键有效时该计时器清零后停止计时,在复位键无效的前提下,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时,使用两位数码管动态显示计时值。
阅读全文