使用中断功能,基于AT89s52单片机的计数器,单击按键使计数加一,单击另一个按键使计数减一,上限为99,并用数码管显示
时间: 2024-05-15 20:19:30 浏览: 184
以下是基于AT89s52单片机的计数器代码:
```C
#include <reg52.h>
sbit key_add = P1^0; // 定义加一按键
sbit key_minus = P1^1; // 定义减一按键
unsigned int count = 0; // 定义计数器初始值为0
unsigned char code seg[] = { // 数码管显示0-9的编码,共阴极数码管
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
void delay_ms(unsigned int t) { // 延时函数,单位毫秒
unsigned int i, j;
for(i=0; i<t; i++) {
for(j=0; j<120; j++);
}
}
void display(unsigned int num) { // 数码管显示函数
unsigned char a, b;
a = num / 10; // 十位数
b = num % 10; // 个位数
P2 = 0xff; // 关闭所有数码管
P0 = seg[a]; // 显示十位数
P2 = 0xfe; // 打开第一个数码管
delay_ms(5); // 稍微延时一下,避免闪烁
P2 = 0xff; // 关闭第一个数码管
P0 = seg[b]; // 显示个位数
P2 = 0xfd; // 打开第二个数码管
delay_ms(5);
P2 = 0xff; // 关闭第二个数码管
}
void main() {
while(1) {
if(key_add == 0) { // 如果按下加一按键
delay_ms(10); // 稍微延时一下,避免多次计数
if(key_add == 0) { // 确认按键按下
count++; // 计数器加一
if(count >= 100) { // 上限为99
count = 0;
}
}
while(key_add == 0); // 等待按键松开
}
if(key_minus == 0) { // 如果按下减一按键
delay_ms(10);
if(key_minus == 0) {
count--; // 计数器减一
if(count < 0) { // 下限为0
count = 99;
}
}
while(key_minus == 0);
}
display(count); // 显示计数器的值
}
}
```
在上面的代码中,使用了一个延时函数和一个数码管显示函数。延时函数用于让按键按下后稍微延时一下,避免多次计数。数码管显示函数将计数器的值分解为十位数和个位数,然后通过共阴极数码管的编码显示出来。
在主函数中,通过轮询的方式不断检测两个按键的状态,如果按下了加一按键,则计数器加一,如果按下了减一按键,则计数器减一。每次计数器的值发生变化时,都调用一次数码管显示函数显示出来。如果计数器超过了上限99,则将其重置为0;如果计数器小于下限0,则将其重置为99。这样就实现了一个基于AT89s52单片机的计数器。
阅读全文