stc89c51单片机使用C语言编程实现使用计数器显示0~59秒的两位秒表
时间: 2023-07-14 16:13:33 浏览: 159
下面是使用STC89C51单片机和C语言编写的秒表程序,它可以在数码管上显示0~59秒的计时器:
```c
#include <reg51.h>
// 数码管段选引脚定义
sbit seg_a = P1^0;
sbit seg_b = P1^1;
sbit seg_c = P1^2;
sbit seg_d = P1^3;
sbit seg_e = P1^4;
sbit seg_f = P1^5;
sbit seg_g = P1^6;
sbit seg_dp = P1^7;
// 数码管位选引脚定义
sbit dig_1 = P2^0;
sbit dig_2 = P2^1;
// 定义计数器变量
unsigned int counter = 0;
// 延时函数
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
// 数码管显示函数
void display(unsigned int num)
{
// 数码管0~9对应的段选信号
unsigned char table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
// 将个位和十位分别取出
unsigned char ones = num % 10;
unsigned char tens = num / 10 % 10;
// 数码管位选
dig_1 = 0;
dig_2 = 1;
// 数码管段选
seg_dp = 1;
seg_a = table[ones] & 0x01;
seg_b = table[ones] & 0x02;
seg_c = table[ones] & 0x04;
seg_d = table[ones] & 0x08;
seg_e = table[ones] & 0x10;
seg_f = table[ones] & 0x20;
seg_g = table[ones] & 0x40;
delay(1);
// 数码管位选
dig_1 = 1;
dig_2 = 0;
// 数码管段选
seg_dp = 0;
seg_a = table[tens] & 0x01;
seg_b = table[tens] & 0x02;
seg_c = table[tens] & 0x04;
seg_d = table[tens] & 0x08;
seg_e = table[tens] & 0x10;
seg_f = table[tens] & 0x20;
seg_g = table[tens] & 0x40;
delay(1);
}
void main()
{
// 设置定时器0工作方式
TMOD &= 0xF0;
TMOD |= 0x01;
// 设置定时器初值
TH0 = 0xFC;
TL0 = 0x67;
// 启动定时器0
TR0 = 1;
while(1)
{
// 判断定时器是否溢出
if(TF0)
{
TF0 = 0;
// 计数器加1
counter++;
// 如果计数器大于等于60,则归零
if(counter >= 60)
counter = 0;
// 在数码管上显示计数器的值
display(counter);
}
}
}
```
该程序使用定时器0来进行计时,每1秒钟定时器就会溢出一次,此时计数器加1,并在数码管上显示计数器的值。当计数器的值大于等于60时,将其归零。数码管的显示函数通过控制段选和位选信号来实现。
需要注意的是,该程序中的延时函数只是简单地进行了一个粗略的延时,如果需要更精确的延时可以使用定时器或其他方法。另外,由于定时器0的计时精度较低,因此在长时间计时时可能会有一定的误差。
阅读全文