C51单片机数码管正常进行0到999累加,独立按键按下中断后,执行倒数计时6个数字,6,5,4,3,2,1,完成后继续累加的代码
时间: 2024-01-04 17:03:15 浏览: 150
好的,下面是实现该功能的C51单片机代码,您参考:
```
#include <reg52.h>
sbit LED = P10; // 数码管位选引脚
sbit DIO = P2^0; // 数码管数据引脚
sbit CLK P2^1; // 数码管时钟引脚
sbit KEY = P3^2; // 独立按键引脚
unsigned int count = 0; // 计数器变量,初始化为0
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(unsigned int num) // 数码管显示函数
{
unsigned char code table[] = { // 数码管显示表
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90, // 9
};
unsigned char digit[3]; // 数码管位数数组
digit[0] = num % 10; // 个位数
digit[1] = num / 10 % 10; // 十位数
digit[2] = num / 100 % 10; // 百位数
unsigned char i;
for (i = 0; i < 3; i++) // 依次显示每个数码管
{
LED = 0x01 << i; // 选择当前位的数码管
DIO = table[digit[i]]; // 显示当前位的数字
CLK = 1; // 上升沿锁存数据
CLK = 0;
}
}
void countdown() // 倒数计时函数
{
unsigned char i;
for (i = 6; i > 0; i--) // 依次倒数6个数字
{
display(i); // 显示当前数字
delay(500); // 等待一段时间
}
}
void key_isr() interrupt 0 // 中断服务函数
{
countdown(); // 执行倒数计时功能
}
void main()
{
EA = 1; // 允许中断
EX0 = 1; // 外部中断0允许
IT0 = 1; // 下降沿触发
while (1) // 循环执行累加功能
{
count++; // 累加计数器
if (count > 999) // 计数器达到999后清零
count = 0;
display(count); // 显示当前计数器的值
delay(500); // 等待一段时间
}
}
```
在这个代码中,我们首先定义了数码管和独立按键的IO口,然后定义了计数器变量和延时函数。接着,我们实现了数码管显示函数,使用循环扫描的方式依次控制每个数码管段的亮灭来显示数字。然后,我们实现了倒数计时函数,使用一个循环来依次显示倒数的数字,并等待一段时间后再显示下一个数字。最后,我们在主程序中初始化IO口和中断,并循环执行累加功能。当独立按键按下时,中断服务函数会被触发执行倒数计时功能,倒数结束后再继续执行累加功能。
阅读全文