51单片机6个共阳极LED数码管,最左边3个数码管动态显示个人学号后3位数字。最右边一个数码管显示剩余时间(9秒开始倒计时),中间2个数码管显示“—”。一个开关控制倒计时开始,计时到0,数码显示0,蜂鸣器响起
时间: 2023-08-05 15:04:46 浏览: 119
这个问题需要编写51单片机的程序,以下是一个简单的程序示例:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P1^0; // 数码管位选引脚1
sbit D2 = P1^1; // 数码管位选引脚2
sbit D3 = P1^2; // 数码管位选引脚3
sbit D4 = P1^3; // 数码管位选引脚4
sbit D5 = P1^4; // 数码管位选引脚5
sbit D6 = P1^5; // 数码管位选引脚6
sbit A = P2^2; // 共阳极LED数码管的A引脚
sbit B = P2^3; // 共阳极LED数码管的B引脚
sbit C = P2^4; // 共阳极LED数码管的C引脚
sbit D = P2^5; // 共阳极LED数码管的D引脚
sbit E = P2^6; // 共阳极LED数码管的E引脚
sbit F = P2^7; // 共阳极LED数码管的F引脚
sbit G = P3^0; // 共阳极LED数码管的G引脚
sbit beep = P3^1; // 蜂鸣器引脚
sbit key = P3^2; // 开关引脚
uint cnt = 9; // 倒计时计数器
uchar code table[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示表
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uint num) { // 数码管显示函数
uchar a, b, c, d, e, f, g;
a = table[num / 1000];
b = table[num % 1000 / 100];
c = table[num % 100 / 10];
d = table[num % 10];
e = table[0];
f = table[0];
g = table[0];
D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1;
switch (cnt % 6) {
case 0: D1 = 0; P2 = a; break;
case 1: D2 = 0; P2 = b; break;
case 2: D3 = 0; P2 = c; break;
case 3: D4 = 0; P2 = d; break;
case 4: D5 = 0; P2 = e; break;
case 5: D6 = 0; P2 = f; break;
}
if (cnt == 0) P2 = g; // 倒计时结束时显示0
}
void main() {
while (1) {
if (!key) { // 开关按下时开始倒计时
delay(10); // 延时消抖
if (!key) {
beep = 1; // 蜂鸣器响起
while (cnt >= 0) {
display(1234); // 显示学号后3位数字
delay(1000); // 延时1秒
cnt--; // 计数器减1
}
beep = 0; // 蜂鸣器停止
cnt = 9; // 重置计数器
}
} else {
P2 = table[10]; // 数码管显示“-”
}
}
}
```
这个程序中,通过 `table` 数组存储了数码管显示的表格,其中 0~9 分别对应不同的 LED 灯亮灭情况。在 `display()` 函数中,根据要显示的数值计算出需要点亮的 LED 灯,并通过 `D1`~`D6` 引脚控制数码管的位选,通过 `P2` 引脚控制数码管的 A~G 引脚。在主函数中,通过判断开关是否按下来决定是否开始倒计时,并在倒计时结束时响起蜂鸣器。
阅读全文