请用STC89C51制作一份简易秒表,要求用到独立按键,数码管,流水灯,蜂鸣器。实验代码请详细解释
时间: 2023-08-08 09:05:45 浏览: 137
好的,下面是使用STC89C51制作的简易秒表代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^3; // 蜂鸣器控制引脚
sbit key1 = P3^0; // 按键1
sbit key2 = P3^1; // 按键2
sbit key3 = P3^2; // 按键3
sbit key4 = P3^3; // 按键4
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(uint t) { // 延时函数
uint i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 125; j++);
}
}
void display(uint num) { // 数码管显示函数
uchar ge, shi, bai;
ge = num % 10;
shi = num / 10 % 10;
bai = num / 100 % 10;
P0 = 0xff; // 关闭所有数码管
P2 = 0xfe; // 打开第一位数码管
P0 = table[bai]; // 显示百位
delay(1); // 延时1ms
P0 = 0xff; // 关闭所有数码管
P2 = 0xfd; // 打开第二位数码管
P0 = table[shi]; // 显示十位
delay(1); // 延时1ms
P0 = 0xff; // 关闭所有数码管
P2 = 0xfb; // 打开第三位数码管
P0 = table[ge]; // 显示个位
delay(1); // 延时1ms
}
void main(void) {
uint time = 0; // 秒表计时变量
uchar state = 0; // 秒表状态变量,0表示停止,1表示计时,2表示暂停
while (1) {
if (key1 == 0) { // 按键1被按下,开始计时
state = 1;
time = 0;
}
if (key2 == 0) { // 按键2被按下,停止计时
state = 0;
time = 0;
P1 = 0xff; // 关闭所有流水灯
beep = 0; // 关闭蜂鸣器
}
if (key3 == 0) { // 按键3被按下,暂停计时
state = 2;
}
if (key4 == 0) { // 按键4被按下,继续计时
state = 1;
}
if (state == 1) { // 计时状态
display(time); // 显示当前时间
time++; // 时间加1秒
if (time == 1000) { // 时间达到1000秒,停止计时
state = 0;
P1 = 0xff; // 关闭所有流水灯
beep = 1; // 开启蜂鸣器
delay(100); // 延时100ms
beep = 0; // 关闭蜂鸣器
}
if (time % 100 == 0) { // 每隔100秒,流水灯翻转一次
P1 = ~P1;
}
}
if (state == 2) { // 暂停状态
display(time); // 显示当前时间
}
}
}
```
该代码使用了STC89C51单片机和独立按键、数码管、流水灯、蜂鸣器等外设,实现了一个简易秒表。当按下按键1时,秒表开始计时;按下按键2时,秒表停止计时;按下按键3时,秒表暂停计时;按下按键4时,秒表继续计时。同时,秒表会显示当前计时时间,并且每隔100秒,流水灯会翻转一次。当时间达到1000秒时,蜂鸣器会响起一声。
阅读全文