要求用AT89S52为核心,最小应用系统,时钟电路和复位电路,用8位数码管显示,HH,MM,SS,要求按下S2显示专业班级姓名,2秒后,自动返回时钟显示状态,需要程序(汇编或者c51)和proteus求帮助

要求用AT89S52为核心,最小应用系统,时钟电路和复位电路,用8位数码管显示,HH,MM,SS,要求按下S2显示专业班级姓名,2秒后,自动返回时钟显示状态,需要程序(汇编或者c51)和proteus求帮助

晚上好🌙🌙🌙
本答案参考通义千问
根据你的要求,我们使用 AT89S52 单片机作为核心,设计一个最小系统,包括时钟电路、复位电路,并通过8位数码管显示时间(HH:MM:SS)。同时,按下 S2 按键 后,可以显示“专业班级姓名”,2秒后自动返回时钟显示状态。
HH:MM:SS#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; // S2按键
uchar code disp_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 0~9的段码
uchar code name[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}; // “专业班级姓名”的ASCII码(示例)
uchar time[6] = {0, 0, 0, 0, 0, 0}; // [H1, H2, M1, M2, S1, S2]
uchar display_mode = 0; // 0: 时间显示, 1: 名字显示
uint delay_count = 0;
// 数码管显示函数
void display(uchar *data) {
uchar i;
for (i = 0; i < 6; i++) {
P0 = disp_code[data[i]]; // 段选
P2 = 0x01 << i; // 位选
delay_us(5); // 短暂延时
}
}
// 延时函数(单位:ms)
void delay_ms(uint ms) {
uint i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
// 定时器初始化
void timer_init() {
TMOD = 0x01; // T0方式1
TH0 = 0xFC; // 1ms中断
TL0 = 0x18;
ET0 = 1; // 开T0中断
EA = 1; // 开总中断
TR0 = 1; // 启动T0
}
// 定时器中断服务函数(每1ms一次)
void timer0_isr() interrupt 1 {
static uint count = 0;
TH0 = 0xFC;
TL0 = 0x18;
count++;
if (count == 1000) { // 1秒
time[5]++; // 秒
if (time[5] == 60) {
time[5] = 0;
time[3]++; // 分
if (time[3] == 60) {
time[3] = 0;
time[1]++; // 时
if (time[1] == 24) {
time[1] = 0;
}
}
}
count = 0;
}
// 判断是否显示名字
if (display_mode == 1) {
delay_count++;
if (delay_count >= 2000) { // 2秒
display_mode = 0;
delay_count = 0;
}
}
}
// 主函数
void main() {
timer_init();
while (1) {
if (key == 0) { // 检测按键
delay_ms(10); // 消抖
if (key == 0) {
display_mode = 1;
while (key == 0); // 等待按键释放
}
}
if (display_mode == 0) {
// 显示时间
display(time);
} else {
// 显示名字
display(name);
}
}
}
.hex 文件加载到 AT89S52 中time[0] 和 time[1] 表示小时的十位和个位time[2] 和 time[3] 表示分钟time[4] 和 time[5] 表示秒display_mode 控制当前显示模式如果你希望使用 动态扫描 方式显示数码管,可以添加以下优化:
void display(uchar *data) {
uchar i;
for (i = 0; i < 6; i++) {
P0 = disp_code[data[i]];
P2 = 0x01 << i;
delay_us(5);
P2 = 0x00; // 关闭当前位
}
}
| 功能 | 实现方式 |
|------|----------|
| 最小系统 | 晶振 + 复位电路 |
| 数码管显示 | P0/P2口驱动 |
| 按键控制 | P3.2检测 |
| 时间计数 | 定时器 T0 |
| 显示切换 | display_mode 控制 |
如果你需要我帮你生成 Proteus 的仿真图文件或进一步调试,请告诉我你使用的 Proteus 版本和具体需求。我可以提供更详细的配置方案。