51单片机电子记分牌编程代码示例 - 详细解析及代码实现
#include <reg52.h> #include <intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit beep = P2^3; // 蜂鸣器控制引脚 sbit addBtn = P3^0; // 加分按钮 sbit subBtn = P3^1; // 减分按钮 sbit resetBtn = P3^2; // 复位按钮
uchar code segCode[] = { // 数码管显示段码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
uchar score = 50; // 初始分数
void delay(uint ms) { uint i, j; for (i = ms; i > 0; i--) for (j = 110; j > 0; j--); }
void displayScore(uchar num) { P0 = segCode[num / 10]; // 显示十位 P1 = 0xfe; // 打开第一个数码管 nop(); nop(); P1 = 0xff; // 关闭所有数码管 P0 = segCode[num % 10]; // 显示个位 P1 = 0xfd; // 打开第二个数码管 nop(); nop(); P1 = 0xff; // 关闭所有数码管 }
void main() { EA = 1; // 允许中断 ET0 = 1; // 允许定时器0中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xfc; // 定时器0初始值,12MHz晶振,50ms定时
TL0 = 0x18;
TR0 = 1; // 启动定时器0
while (1) {
if (addBtn == 0) { // 检测加分按钮是否按下
delay(10); // 延时去抖动
if (addBtn == 0) {
while (addBtn == 0); // 等待按钮释放
if (score < 99) {
score++; // 加分
beep = 0; // 发出提示音
delay(100);
beep = 1;
}
}
}
if (subBtn == 0) { // 检测减分按钮是否按下
delay(10); // 延时去抖动
if (subBtn == 0) {
while (subBtn == 0); // 等待按钮释放
if (score > 0) {
score--; // 减分
beep = 0; // 发出提示音
delay(100);
beep = 1;
}
}
}
if (resetBtn == 0) { // 检测复位按钮是否按下
delay(10); // 延时去抖动
if (resetBtn == 0) {
while (resetBtn == 0); // 等待按钮释放
score = 50; // 复位分数为50
beep = 0; // 发出提示音
delay(100);
beep = 1;
}
}
displayScore(score); // 显示当前分数
}
}
void timer0_isr() interrupt 1 { TH0 = 0xfc; // 定时器0初始值,12MHz晶振,50ms定时 TL0 = 0x18; displayScore(score); // 定时刷新分数显示 }
void external0_isr() interrupt 0 { if (score < 99) { score++; // 加分 beep = 0; // 发出提示音 delay(100); beep = 1; } }
该代码使用51单片机实现了一个简单的电子记分牌,主要功能包括:
- 初始化: 设置晶振频率、初始分数、定时器和中断配置。
- 加分: 通过加分按钮按下触发,分数增加1,并发出提示音。
- 减分: 通过减分按钮按下触发,分数减少1,并发出提示音。
- 复位: 通过复位按钮按下触发,分数重置为50,并发出提示音。
- 分数显示: 使用定时器0每50ms刷新一次数码管显示当前分数。
- 提示音: 使用蜂鸣器在按钮按下时发出提示音。
代码使用中断机制实现按钮的检测和分数更新,使用定时器0定时刷新数码管的显示。
注意: 以上代码仅为示例,具体硬件电路和外设连接方式需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/pAVf 著作权归作者所有。请勿转载和采集!