用51设计一个定时器,实现正计时从0000开始最大到999.9,倒计时从设定时间开始,通过按键可设定正计时结束时间和倒计时开始时间,其中我只有4个按键,,用51写个程序给我
时间: 2024-03-26 10:38:10 浏览: 110
好的,这里提供一个基本的定时器程序,你可以根据需要进行修改:
```c
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
uchar code numTable[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示0-9数字对应的码表
uchar mode = 0; // 记录当前模式,0表示正计时,1表示倒计时
uchar count = 0; // 记录当前计数值
uchar minute = 0; // 倒计时起始时间,以分钟为单位
uchar second = 0; // 倒计时起始时间,以秒为单位
uchar flag = 0; // 记录是否需要重新设定倒计时时间
void delay(uint t) // 延时函数
{
uint i, j;
for(i = 0; i < t; i++)
{
for(j = 0; j < 110; j++);
}
}
void display(uint num) // 数码管显示函数
{
uchar i, j, k, temp;
for(i = 0; i < 4; i++) // 依次显示千位、百位、十位、个位
{
switch(i)
{
case 0: temp = num / 1000; break;
case 1: temp = num % 1000 / 100; break;
case 2: temp = num % 100 / 10; break;
case 3: temp = num % 10; break;
}
for(j = 0; j < 8; j++) // 依次点亮数码管的8个段
{
k = 1 << j; // 左移j位得到控制该段的位
P2 = k; // 先将该段的控制位清零
P0 = numTable[temp]; // 将码表中对应数字的码值送入P0口
delay(1); // 延时一段时间,使得数码管有足够的时间显示该段
}
P2 = 0; // 最后将控制数码管的位全部清零,以便下一次显示
}
}
void main()
{
TMOD = 0x01; // 设置定时器0为模式1,即16位定时器
TH0 = TL0 = 0; // 定时器0初值清零
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
while(1)
{
if(!key1) // 检测第一个按键,进入正计时模式
{
mode = 0;
count = 0;
minute = 0;
second = 0;
flag = 0;
}
else if(!key2) // 检测第二个按键,进入倒计时模式
{
mode = 1;
count = minute * 60 + second; // 计算倒计时的总秒数
flag = 1;
}
else if(!key3) // 检测第三个按键,设定正计时结束时间
{
count = 9999;
flag = 0;
}
else if(!key4) // 检测第四个按键,设定倒计时开始时间
{
minute = 3;
second = 0;
count = minute * 60 + second;
flag = 1;
}
if(mode == 0) // 正计时模式
{
if(count <= 9999) // 如果计数值不超过9999,就正常计数
{
display(count);
count++;
}
else // 如果计数值超过9999,就回到最开始的0
{
count = 0;
}
}
else // 倒计时模式
{
if(flag) // 如果需要重新设定倒计时时间,就重新计算总秒数
{
count = minute * 60 + second;
flag = 0;
}
if(count > 0) // 如果计数值大于0,就正常计数
{
display(count);
count--;
}
else // 如果计数值小于等于0,就停止计数
{
count = 0;
}
}
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC; // 重新赋值,使定时器0在每1ms时产生中断
TL0 = 0x67;
}
```
这个程序会根据按键的不同输入,进入正计时模式、倒计时模式或者设定正计时结束时间、设定倒计时开始时间。当进入正计时模式时,会从0000开始正计时,最多计数到9999;当进入倒计时模式时,会从设定的时间开始倒计时,直到计数值为0。同时,程序还会通过定时器中断,在每1ms时更新数码管的显示。
阅读全文