计数器:外部脉冲计数。P3.2口接按键,P0/P2口接数显,两位BCD码方式显示。设置T0工作于方式2,通过控制字利用T0实现24进制计数,按键每按下一次数显显示数字加1代码
时间: 2024-03-14 14:43:03 浏览: 200
以下是外部脉冲计数器的代码实现,可以满足你的要求:
```c
#include <reg52.h> // 引入51单片机寄存器定义
#define uchar unsigned char // 定义unsigned char类型的别名uchar
sbit KEY = P3 ^ 2; // 按键连接在P3.2口
sbit LSA = P2 ^ 2; // 数码管P2.2~2.7段选控制
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;
sbit DULA = P2 ^ 5; // 数码管位选控制
sbit DULB = P2 ^ 6;
uchar code table[] = { // 数码管显示字符表
0x3f, // '0'
0x06, // '1'
0x5b, // '2'
0x4f, // '3'
0x66, // '4'
0x6d, // '5'
0x7d, // '6'
0x07, // '7'
0x7f, // '8'
0x6f, // '9'
};
uchar count = 0; // 计数器初始值为0
void delay(uchar xms) { // 延时函数,xms为延时时间
uchar i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
void display(uchar num) { // 数码管显示函数,num为要显示的数字
uchar temp = 0;
LSA = 0;
LSB = 0;
LSC = 0;
temp = num % 10; // 取个位
P0 = table[temp];
DULA = 1;
DULA = 0;
delay(5);
temp = num / 10; // 取十位
P0 = table[temp];
DULB = 1;
DULB = 0;
delay(5);
}
void init_timer() { // 初始化定时器T0
TMOD = 0x02; // 设置T0工作于方式2
TH0 = 0x3c; // 定时器初值,用于1ms计时
TL0 = 0xb0;
TR0 = 1; // 启动定时器
ET0 = 1; // 允许定时器中断
EA = 1; // 开启总中断
}
void main() {
init_timer(); // 初始化定时器
while (1) {
if (KEY == 0) { // 检测到按键按下
delay(10); // 延时去抖
if (KEY == 0) { // 再次检测按键状态
count++; // 计数器加1
if (count == 24) { // 24进制计数,最大值为23
count = 0;
}
while (!KEY)
; // 等待按键松开
}
}
display(count); // 显示计数器值
}
}
void timer0() interrupt 1 { // 定时器T0中断服务函数
TH0 = 0x3c;
TL0 = 0xb0;
}
```
这个程序实现了外部脉冲计数器,按键连接在P3.2口,数显连接在P0/P2口,以两位BCD码方式显示。计数器工作于24进制,最大值为23。定时器T0工作于方式2,每1ms触发一次中断服务函数,用于去抖。按键每按下一次,计数器加1,数显上的数字就会随之改变。
阅读全文