外部脉冲计数。P3.2口接按键,P0/P2口接数显,两位BCD码方式显示。设置T0工作于方式2,通过控制字利用T0实现24进制计数,按键每按下一次数显显示数字加1
时间: 2024-03-10 20:48:04 浏览: 27
根据您的需求,这里提供一个基于STC89C52单片机的C语言代码,实现外部脉冲计数、按键控制和24进制计数:
```
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^2; // 按键连接到P3.2口
sbit disp1=P2^0; // 数显第一位连接到P2.0口
sbit disp2=P2^1; // 数显第二位连接到P2.1口
uint cnt=0; // 计数器初值为0
void delay(uint ms) // 延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<125;j++);
}
void init_timer0() // 初始化定时器0
{
TMOD &= 0xF0; // 清零T0工作方式
TMOD |= 0x02; // 设置T0为方式2
TH0 = 0x3C; // 设置重载值,时钟频率为11.0592MHz,计数1ms,TH0=0x3C
TL0 = 0xAF;
ET0 = 1; // 开启T0中断
TR0 = 1; // 启动T0
EA = 1; // 开启总中断
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0x3C; // 重新设置重载值
TL0 = 0xAF;
cnt++; // 计数器自增
}
void main()
{
uchar bcd1,bcd2; // 存放BCD码的两个数
init_timer0(); // 初始化定时器0
while(1)
{
if(key == 0) // 检测按键是否按下
{
delay(10); // 延时去抖
if(key == 0) // 确认按键按下
{
while(!key); // 等待按键释放
cnt++; // 计数器自增
}
}
if(cnt > 86399) // 计数器达到86399时自动清零,实现24进制计数
cnt = 0;
bcd1 = cnt/3600; // 计算小时数的BCD码
bcd2 = (cnt%3600)/60*10 + (cnt%3600)%60/10; // 计算分钟数的BCD码
disp1 = 1; // 显示第一位数
P0 = bcd1; // 输出第一位数的BCD码
delay(5); // 显示延时
disp1 = 0; // 关闭第一位数的显示
disp2 = 1; // 显示第二位数
P0 = bcd2; // 输出第二位数的BCD码
delay(5); // 显示延时
disp2 = 0; // 关闭第二位数的显示
}
}
```
代码中通过定时器0实现了1ms的计数,按键检测和24进制计数。按键每按下一次,计数器自增1,当计数器达到86399时自动清零,实现24进制计数。数显使用两个BCD码数码管,通过P0口输出BCD码,P2口控制数码管的显示。