用89C51单片机设计一款按键计数系统,要求用两位数码管进行00~99的循环计数,每按键一次,计数值加1,当计数值超过99时从0重新开始,计数初始值为95,按键用中断方式识别
1个回答
关注
展开全部
硬件设计
按键计数系统的硬件设计包括如下几个部分:
1. 89C51单片机:作为系统的控制中心,负责按键输入的检测、计数值的加减、数码管显示、中断服务等功能。
2. 按键开关:用于触发中断,启动计数器计数。
3. 74HC595芯片:通过串行通信方式实现对两位数码管的控制。
4. 共阴数码管:用于显示0~99之间的数字。
软件设计
软件设计方面,需要实现以下功能:
1. 按键输入检测:通过外部中断的方式对按键进行检测,每次按键产生一个中断信号。
2. 计数器计数:中断服务程序中对计数值进行加1和判断是否超过99的操作,并将结果存储。
3. 数码管显示:将计数器计算所得结果转换为BCD码,通过74HC595芯片输出到数码管中进行显示。
4. 循环计数:当计数值超过99时,将计数值重新设为0,重新开始循环计数。
咨询记录 · 回答于2024-01-02
用89C51单片机设计一款按键计数系统,要求用两位数码管进行00~99的循环计数,每按键一次,计数值加1,当计数值超过99时从0重新开始,计数初始值为95,按键用中断方式识别
硬件设计
按键计数系统的硬件设计包括以下几个部分:
1. 89C51单片机:作为系统的控制中心,负责按键输入的检测、计数值的加减、数码管显示、中断服务等功能。
2. 按键开关:用于触发中断,启动计数器计数。
3. 74HC595芯片:通过串行通信方式实现对两位数码管的控制。
4. 共阴数码管:用于显示0~99之间的数字。
软件设计
软件设计方面,需要实现以下功能:
1. 按键输入检测:通过外部中断的方式对按键进行检测,每次按键产生一个中断信号。
2. 计数器计数:中断服务程序中对计数值进行加1和判断是否超过99的操作,并将结果存储。
3. 数码管显示:将计数器计算所得结果转换为BCD码,通过74HC595芯片输出到数码管中进行显示。
4. 循环计数:当计数值超过99时,将计数值重新设为0,重新开始循环计数。
代码如下
#include
#define uchar unsigned char
uchar code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 };
uchar count = 95; // 计数变量,初始值为95
sbit key = P2^0; // 按键输入口,连接外部中断0
sbit SCK = P1^0; // 74HC595串行时钟输入
sbit RCLK = P1^1; // 74HC595锁存器时钟
sbit SRCLK = P1^2; // 74HC595串行数据输入
sbit duan = P2^6; // 段选端口
sbit wei = P2^7; // 位选端口
void delay(uchar i) { // 基础延迟函数,约延迟1ms
uchar j, k;
for (j = i; j > 0; j--)
for (k = 125; k > 0; k--);
void send_byte(uchar dat) { // 发送一个字节的函数
uchar a;
SRCLK = 0;
for (a = 0; a < 8; a++) {
SCK = 0;
SRCLK = 1;
if(dat & 0x80) { SRCLK = 1; } else { SRCLK = 0; }
dat // 数据发送函数
RCLK = 0;
send_byte(address);
send_byte(dat);
RCLK = 1; // 锁存数据
void display(uchar num) { // 数码管显示函数
P0 = table[num / 10]; // 发送高位数码
duan = 1; // 选择高位显示段
delay(1); // 延迟一定时间
duan = 0;
send(1, table[num % 10]); // 发送低位数码
P0 = 0x00;
duan = 2;
delay(1);
duan = 0;
void key_isr() interrupt 0 { // 按键中断服务程序
key = 1; // 重置中断标志位
count++; // 计数器加1
if(count > 99) { count = 0; // 超过99时,重新从0开始计数 }
display(count); // 更新计数器显示值
void main() {
// 在这里添加主函数代码
已赞过
评论
收起
你对这个回答的评价是?