我的89c51单片机数码管使用的是共阴极。请修改上述代码
时间: 2024-03-20 08:44:35 浏览: 13
好的,如您所要求,我已经修改了代码,用于适配共阴极数码管,修改后的代码如下:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
}; //共阴数码管显示0~9
uchar cnt = 0; //计数器
uchar time = 0; //倒计时时间(秒)
uchar pause = 0; //暂停标志
uchar reset = 0; //复位标志
uint t = 0; //定时器计数器
uint cnt_ms = 0; //计数器计时器
uchar beep = 0; //蜂鸣器标志
void delay(uint t);
void timer0_init();
void key_scan();
void main()
{
EA = 1; //总中断开关
timer0_init(); //定时器0初始化
while (1)
{
key_scan(); //按键扫描
if (reset) //复位
{
cnt = 0;
time = 0;
pause = 0;
reset = 0;
}
if (!pause) //未暂停
{
if (cnt_ms >= 100) //1秒钟计数结束
{
cnt_ms = 0;
time--;
if (time <= 5) //倒计时结束前5秒,蜂鸣器发出声音警告
beep = 1;
if (time == 0) //时间到
pause = 1;
}
}
P0 = 0x00; //关闭数码管显示
P2 = 0x80; //选择第一位数码管
P0 = table[time / 10]; //显示十位
delay(5); //延时5毫秒
P0 = 0x00; //关闭数码管显示
P2 = 0x40; //选择第二位数码管
P0 = table[time % 10] + (beep ? 0x80 : 0x00); //显示个位和蜂鸣器
}
}
void delay(uint t)
{
uint i;
while (t--)
for (i = 0; i < 1000; i++);
}
void timer0_init()
{
TMOD |= 0x01; //定时器0工作在模式1
TH0 = 0xfc;
TL0 = 0x18; //定时器0初值为65536-5000=60536,即5000us
ET0 = 1; //定时器0中断允许
TR0 = 1; //启动定时器0
}
void key_scan()
{
if (P1 != 0xff) //有按键按下
{
delay(5); //延时5毫秒
if (P1 != 0xff) //再次判断按键是否按下
{
switch (P1)
{
case 0xfe: //按键1(倒计时时间增加1秒)
time++;
if (time >= 99)
time = 99;
cnt = 0;
pause = 1;
break;
case 0xfd: //按键2(倒计时时间减少1秒)
time--;
if (time <= 0)
time = 0;
cnt = 0;
pause = 1;
break;
case 0xfb: //按键3(倒计时开始/暂停)
pause = !pause;
break;
case 0xf7: //按键4(倒计时复位)
reset = 1;
break;
default:
break;
}
while (P1 != 0xff); //等待按键释放
}
}
}
void timer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x18; //重新赋初值
t++;
if (t >= 500) //5000us*500=2500000us=2500ms=2.5s
{
t = 0;
cnt_ms++;
if (beep) //蜂鸣器响1秒
{
cnt++;
if (cnt >= 100) //1秒钟计数结束
{
cnt = 0;
beep = 0;
}
P3 = 0x00; //蜂鸣器发声
}
else
P3 = 0xff; //蜂鸣器不发声
}
}
```
该代码在共阴数码管的显示方式上,仅需要将数码管的显示码表改为共阴数码管的显示码表即可。