at89c51生成加减计算器P1口连接两个BCD码的共阳极数码管,初始状态是“00”,要求用INT0和INT1实现加1和减1的功能,计数范围从0~99
时间: 2023-06-24 18:03:06 浏览: 99
好的,这是一个比较经典的基于 AT89C51 微控制器的数字加减计数器设计。下面是一个简单的代码实现,代码中包括了注释以帮助您理解。请注意,这只是一个简单的示例,您可能需要进行更多的调试和优化才能使其完全符合您的需求。
```
// AT89C51加减计数器
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 数码管的段选信号
uchar code duanxuan[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar num = 0; // 当前计数值
bit addFlag = 0; // 加1标志位
bit subFlag = 0; // 减1标志位
// 数码管显示函数
void display(uchar num) {
uchar shiwei, gewei;
shiwei = num / 10; // 十位数
gewei = num % 10; // 个位数
P1 = duanxuan[shiwei]; // 显示十位数
P2 = duanxuan[gewei]; // 显示个位数
}
// 加1函数
void add() interrupt 0 {
addFlag = 1; // 设置加1标志位
}
// 减1函数
void sub() interrupt 2 {
subFlag = 1; // 设置减1标志位
}
void main() {
IT0 = 1; // INT0下降沿触发
IT1 = 1; // INT1下降沿触发
EX0 = 1; // INT0开启中断
EX1 = 1; // INT1开启中断
EA = 1; // 总中断开启
while(1) {
if(addFlag) { // 判断是否需要加1
addFlag = 0; // 清除加1标志位
num++; // 加1
if(num > 99) { // 计数范围从0~99
num = 0;
}
display(num); // 显示当前计数值
}
if(subFlag) { // 判断是否需要减1
subFlag = 0; // 清除减1标志位
num--; // 减1
if(num < 0) { // 计数范围从0~99
num = 99;
}
display(num); // 显示当前计数值
}
}
}
```
在这个代码中,我们使用了 AT89C51 微控制器的 INT0 和 INT1 中断来实现加1和减1的功能。当按下加1按钮时,INT0触发中断,程序将设置一个加1标志位。然后在主程序循环中判断这个标志位是否被设置,如果是,则将标志位清除,将计数器加1,然后显示当前计数值。当按下减1按钮时,同样的流程也会发生,只是触发的是 INT1 中断。
这个代码中还包括了一个简单的数码管显示函数,用于将当前计数值显示在连接到 P1 和 P2 端口的两个共阳极数码管上。您可以根据您的具体硬件连接情况进行调整。
请注意,这个代码中没有包括输入检测和去抖动等功能,您可能需要根据实际情况进行调整。同时,由于这个代码使用了中断,您也需要注意在中断服务函数中尽可能减少时间开销,以避免影响主程序的正常运行。
阅读全文