在51单片机实验板上,用C语言编程实现秒表计时器的设计。51单片机外接晶振频率为12MHz,使用单片机定时/计数器的工作方式1产生周期为50ms的方波,由此产生秒表计时器的1秒时钟信号。 1.该秒表计时器在0~59秒范围内循环计时,每次增加1秒。 2.当复位键有效时,该计时器清零后停止计时。 3.在复位键无效的前提下,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时。 4.使用两位数码管动态显示计时值。使用138译码器
时间: 2023-05-22 19:05:47 浏览: 199
下面是C语言编程实现秒表计时器的设计:
```c
#include <reg51.h>
sbit SWITCH_EN = P3^0; // 使能键,低电平有效
sbit SWITCH_RST = P3^1; // 复位键,低电平有效
sbit LED_D1 = P2^4; // 数码管D1,低电平亮
sbit LED_D2 = P2^5; // 数码管D2,低电平亮
sbit LED_COM = P2^6; // 数码管公共端,高电平亮
unsigned char count = 0; // 计时器计数值,0-59
unsigned char second = 0; // 秒表计时器秒数,0-59
bit enable_flag = 0; // 使能标志位,1-启用计时器,0-暂停计时器
void delay_ms(unsigned int); // 延时函数
void display(unsigned char); // 数码管显示函数
void timer_init(); // 定时器初始化函数
void timer_interrupt() // 定时器中断服务函数
void main()
{
timer_init(); // 定时器初始化
while (1) {
if (!SWITCH_RST) { // 复位键有效,清零计数器,停止计时
count = 0;
enable_flag = 0;
} else if (SWITCH_EN) { // 使能键有效,启用计时器
enable_flag = 1;
} else { // 使能键无效,暂停计时器
enable_flag = 0;
}
if (count == 0) { // 计数值为0时,秒数+1
second++;
if (second >= 60) second = 0; // 秒数循环计数
}
display(second); // 显示秒数值
}
}
void delay_ms(unsigned int n)
{
unsigned int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
void display(unsigned char n)
{
unsigned char a, b;
a = n / 10; // 十位数码管显示值
b = n % 10; // 个位数码管显示值
LED_COM = 1; // 点亮数码管公共端
LED_D1 = 1; // 点亮数码管D1
LED_D2 = 0;
P0 = a; // 显示十位数码管值
delay_ms(2); // 延时2ms,进行动态扫描
LED_COM = 1; // 点亮数码管公共端
LED_D1 = 0;
LED_D2 = 1; // 点亮数码管D2
P0 = b; // 显示个位数码管值
delay_ms(2); // 延时2ms,进行动态扫描
}
void timer_init()
{
TMOD &= 0xF0; // 将定时器/计数器的控制模式寄存器低4位清0
TMOD |= 0x01; // 定时器模式1,16位自动重载计数器
TH0 = (65536 - 50000) >> 8; // 定时器初值,1秒钟(50ms*20)
TL0 = (65536 - 50000) & 0xFF;
TR0 = 1; // 启动定时器/计数器0
ET0 = 1; // 允许T0中断
EA = 1; // 打开总中断开关
}
void timer_interrupt() interrupt 1 using 1
{
TH0 = (65536 - 50000) >> 8; // 定时器1秒钟(50ms*20)自动重载初值
TL0 = (65536 - 50000) & 0xFF;
if (enable_flag) { // 使能标志位为1,则计数器计数
count++;
if (count >= 60) count = 0; // 计数值循环计数
}
}
```
其中,delay_ms()函数为延时函数,用于动态扫描数码管时进行延时;display()函数为数码管显示函数,用于动态显示秒表计时器的值;timer_init()为定时器初始化函数,用于初始化定时器/计数器和中断服务函数,并开启总中断;timer_interrupt()为定时器中断服务函数,用于计数器计数、秒数累加等操作。注意:二位数码管的输出需要使用138译码器进行驱动,本文没有涉及到具体的连线方法。
阅读全文