基于51单片机,7SEG-MPX6-CC共阴极LED数码管,最左边3个数码管动态显示个人学号后3位数字。最右边一个数码管显示剩余时间(9秒开始倒计时),中间2个数码管显示“—”。一个开关控制倒计时开始,计时到0,数码显示0,蜂鸣器响起的keil代码如何编写
时间: 2023-12-01 16:04:02 浏览: 128
以下是基于51单片机,7SEG-MPX6-CC共阴极LED数码管的计时器倒计时程序,代码如下:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit beep = P2^3;
uchar code NUM[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管显示数字的编码
uchar time = 9; // 倒计时时间
bit flag = 0; // 计时器开关标志
void delay(uint x) // 延时函数
{
uint i, j;
for(i = x; i > 0; i--)
{
for(j = 110; j > 0; j--);
}
}
void display(uint num) // 数码管动态显示函数
{
uchar i;
for(i = 1; i <= 4; i++)
{
switch(i)
{
case 1:
D1 = 0;
P0 = NUM[num / 100];
delay(1);
D1 = 1;
break;
case 2:
D2 = 0;
P0 = NUM[(num % 100) / 10];
delay(1);
D2 = 1;
break;
case 3:
D3 = 0;
P0 = NUM[num % 10];
delay(1);
D3 = 1;
break;
case 4:
D4 = 0;
P0 = NUM[time];
delay(1);
D4 = 1;
break;
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器0初始值
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
TR0 = 0; // 关闭定时器0
while(1)
{
if(flag) // 计时器开关标志为1,倒计时开始
{
display(999); // 数码管显示个人学号后3位数字
delay(500);
display(888); // 数码管显示“—”
delay(500);
display(888);
delay(500);
time--;
if(time == 0) // 倒计时结束
{
flag = 0; // 关闭计时器开关标志
beep = 0; // 蜂鸣器响起
while(1);
}
}
else // 计时器开关标志为0,倒计时暂停
{
display(888); // 数码管显示“—”
}
}
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0xFC; // 定时器0初始值
TL0 = 0x67;
display(888); // 数码管显示“—”
if(flag) // 计时器开关标志为1,倒计时开始
{
time--;
if(time == 0) // 倒计时结束
{
flag = 0; // 关闭计时器开关标志
beep = 0; // 蜂鸣器响起
while(1);
}
}
}
void key() interrupt 0 // 外部中断0函数,开关控制倒计时开始
{
delay(10); // 延时去抖
if(!P3_2) // 检测到按键按下
{
flag = ~flag; // 计时器开关标志取反
if(flag) // 计时器开关标志为1,倒计时开始
{
time = 9; // 倒计时时间重新设定为9
}
}
}
```
其中,定时器0用于数码管动态显示,外部中断0用于开关控制倒计时开始。在定时器0中断函数中,每次中断时倒计时时间减1,当倒计时时间为0时,关闭计时器开关标志,蜂鸣器响起并停留在死循环中。在主函数中,根据计时器开关标志判断倒计时是否开始,并根据倒计时时间动态显示数码管。在开关按下时,计时器开关标志取反,并根据计时器开关标志重新设定倒计时时间。