at89s51数码管秒表c语言程序,基于AT89C51单片机的一个2位的LED数码显示作为“秒表”设计【基于单片机系统的00-99s的定时器】...
时间: 2024-02-12 12:02:53 浏览: 25
以下是基于AT89S51单片机的数码管秒表C语言程序:
```
#include <reg52.h> // AT89S51单片机寄存器头文件
sbit D1=P2^0; // 数码管1引脚定义
sbit D2=P2^1; // 数码管2引脚定义
sbit D3=P2^2; // 数码管3引脚定义
sbit D4=P2^3; // 数码管4引脚定义
sbit KEY1=P3^0; // 按键1引脚定义
sbit KEY2=P3^1; // 按键2引脚定义
sbit KEY3=P3^2; // 按键3引脚定义
sbit KEY4=P3^3; // 按键4引脚定义
int time_counter=0; // 计时器变量
int sec=0; // 秒变量
unsigned char code num[]={ // 数码管显示数字对应的码表
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
void delay(int t) // 延时函数
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void display(int n) // 数码管显示函数
{
D1=1;D2=1;D3=1;D4=1; // 所有数码管关闭
switch(n/100) // 显示百位数
{
case 0:D1=0;break;
default:D1=1;break;
}
D2=0;P0=num[n/10%10];delay(5);D2=1; // 显示十位数
D3=0;P0=num[n%10];delay(5);D3=1; // 显示个位数
}
void timer() interrupt 1 // 定时器中断函数
{
TH0=(65536-45872)/256; // 预装初值
TL0=(65536-45872)%256;
time_counter++; // 计时器加1
if(time_counter>=20) // 每20次中断为1秒
{
time_counter=0;
sec++; // 秒加1
if(sec>=100) // 到达100秒时清零
sec=0;
}
}
void main()
{
TMOD=0x01; // 定时器0工作模式1
TH0=(65536-45872)/256; // 预装初值
TL0=(65536-45872)%256;
EA=1; // 开总中断
ET0=1; // 开定时器0中断
TR0=1; // 启动定时器0
while(1)
{
if(KEY1==0) // 按键1按下,计时器清零
{
delay(10); // 延时去抖动
if(KEY1==0)
{
sec=0;
time_counter=0;
while(KEY1==0); // 等待按键松开
}
}
if(KEY2==0) // 按键2按下,计时器暂停
{
delay(10); // 延时去抖动
if(KEY2==0)
{
TR0=~TR0; // 启动或停止定时器
while(KEY2==0); // 等待按键松开
}
}
if(KEY3==0) // 按键3按下,计时器减1秒
{
delay(10); // 延时去抖动
if(KEY3==0)
{
if(sec>0)
sec--;
while(KEY3==0); // 等待按键松开
}
}
if(KEY4==0) // 按键4按下,计时器加1秒
{
delay(10); // 延时去抖动
if(KEY4==0)
{
if(sec<99)
sec++;
while(KEY4==0); // 等待按键松开
}
}
display(sec); // 数码管显示秒数
}
}
```
程序实现了一个2位的LED数码显示作为“秒表”,基于单片机系统的00-99s的定时器,可以通过按键控制计时器的开始、暂停、清零、加1秒、减1秒等功能。