stc89c52单片机电子秒表
时间: 2023-10-03 21:10:27 浏览: 74
STC89C52单片机可以实现电子秒表的功能。以下是一个简单的电子秒表程序:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P1^0; // 按键1
sbit key2 = P1^1; // 按键2
uchar time[4] = {0, 0, 0, 0}; // 计时器数组,分别存储:小时、分钟、秒、毫秒
void delay(uint ms) // 延时函数
{
uint i, j;
for (i = ms; i > 0; i--)
for (j = 114; j > 0; j--);
}
void display() // 数码管显示函数
{
uchar i;
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管0~9编码表
P2 = 0xff; // 关闭所有数码管
for (i = 0; i < 4; i++)
{
switch (i)
{
case 0: P0 = table[time[0] / 10]; break; // 显示小时的十位
case 1: P0 = table[time[0] % 10]; break; // 显示小时的个位
case 2: P0 = table[time[1] / 10] | 0x80; break; // 显示分钟的十位,并点亮小数点
case 3: P0 = table[time[1] % 10]; break; // 显示分钟的个位
}
P2 = ~(0x01 << i); // 打开相应数码管
delay(1); // 延时1ms
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位定时器)下
TH0 = 0x4c; // 定时1ms
TL0 = 0x00;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
while (1)
{
if (!key1) // 按键1按下
{
delay(20); // 延时去抖
if (!key1) // 再次判断按键1是否按下
{
time[0] = 0; // 将计时器清零
time[1] = 0;
time[2] = 0;
time[3] = 0;
}
}
if (!key2) // 按键2按下
{
delay(20); // 延时去抖
if (!key2) // 再次判断按键2是否按下
{
while (!key2); // 等待按键2松开
}
}
display(); // 显示计时器的值
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
static uchar cnt = 0;
static uchar flag = 0;
TH0 = 0x4c; // 定时1ms
TL0 = 0x00;
cnt++;
if (cnt == 10) // 每10ms更新一次计时器的值
{
cnt = 0;
time[3]++; // 每10ms增加1毫秒
if (time[3] == 100) // 如果毫秒数达到100
{
time[3] = 0;
time[2]++; // 秒数加1
if (time[2] == 60) // 如果秒数达到60
{
time[2] = 0;
time[1]++; // 分钟数加1
if (time[1] == 60) // 如果分钟数达到60
{
time[1] = 0;
time[0]++; // 小时数加1
if (time[0] == 24) // 如果小时数达到24
{
time[0] = 0;
}
}
}
}
flag = 1; // 标志位为1,表示需要更新数码管的值
}
if (flag) // 如果标志位为1
{
flag = 0;
display(); // 显示计时器的值
}
}
```
此程序使用定时器0控制计时,每10ms更新计时器的值。按键1用于清零计时器,按键2用于暂停计时器。数码管显示采用共阴数码管,使用了位选和段选的方式进行显示。
需要注意的是,此程序只是一个简单的电子秒表程序,还有很多需要改进的地方,如按键去抖、数码管扫描等。
阅读全文