第一、设置按键1,秒表开始/暂停计时;设置按键2,秒表清零; 第二、在等待计时的过程中,LED1-8以0.5秒的周期闪烁;在计时的过程中,每过1秒,蜂鸣器响两声并在四位共阳数码管上显示; 第三、四位共阳数码管上前2位显示秒,后2位显示分,中间用小数点分隔;计时长度到59分59秒后,自动清零。帮我设计基于单片机开发板完整代码
时间: 2024-03-13 21:47:30 浏览: 291
好的,下面是基于STC89C52单片机开发板的完整代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^1; // 按键1
sbit KEY2 = P3^0; // 按键2
sbit BEEP = P2^3; // 蜂鸣器
sbit LED1 = P1^0; // LED1
sbit LED2 = P1^1; // LED2
sbit LED3 = P1^2; // LED3
sbit LED4 = P1^3; // LED4
sbit LED5 = P1^4; // LED5
sbit LED6 = P1^5; // LED6
sbit LED7 = P1^6; // LED7
sbit LED8 = P1^7; // LED8
uint ms = 0; // 毫秒计数器
uint sec = 0; // 秒计数器
uint min = 0; // 分计数器
uchar flag = 0; // 计时开始/暂停标志位
uchar reset = 0; // 计时清零标志位
// 毫秒延时函数
void DelayMs(uint ms) {
uint i, j;
for (i = ms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
// 毫秒计数器中断服务函数
void Timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
ms++;
if (ms == 1000) {
ms = 0;
sec++;
if (sec == 60) {
sec = 0;
min++;
if (min == 60) {
min = 0;
}
}
}
}
// 显示秒分函数
void Display() {
uchar sec_high, sec_low, min_high, min_low;
sec_high = sec / 10;
sec_low = sec % 10;
min_high = min / 10;
min_low = min % 10;
P0 = 0x01; // 选择第一位数码管
P2 = 0x7F; // 显示秒的十位
P0 = sec_high;
DelayMs(5);
P0 = 0x02; // 选择第二位数码管
P2 = 0xBF; // 显示秒的个位
P0 = sec_low;
DelayMs(5);
P0 = 0x04; // 选择第三位数码管
P2 = 0xDF; // 显示分的十位
P0 = min_high;
DelayMs(5);
P0 = 0x08; // 选择第四位数码管
P2 = 0xEF; // 显示分的个位
P0 = min_low;
DelayMs(5);
}
// 按键扫描函数
void KeyScan() {
if (KEY1 == 0) { // 按键1按下
DelayMs(10); // 延时去抖
if (KEY1 == 0) {
flag = ~flag; // 翻转标志位
while (!KEY1); // 等待按键释放
}
}
if (KEY2 == 0) { // 按键2按下
DelayMs(10); // 延时去抖
if (KEY2 == 0) {
reset = 1; // 置清零标志位
while (!KEY2); // 等待按键释放
}
}
}
// LED闪烁函数
void LEDBlink() {
if (flag == 0) { // 等待计时
LED1 = ~LED1;
LED2 = ~LED2;
LED3 = ~LED3;
LED4 = ~LED4;
LED5 = ~LED5;
LED6 = ~LED6;
LED7 = ~LED7;
LED8 = ~LED8;
DelayMs(500);
}
}
// 蜂鸣器响两声函数
void Beep() {
if (flag == 1 && ms == 0) { // 计时中每过1秒响两声
BEEP = 1;
DelayMs(50);
BEEP = 0;
DelayMs(50);
BEEP = 1;
DelayMs(50);
BEEP = 0;
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1下
TH0 = 0xFC; // 定时器初值
TL0 = 0x67;
EA = 1; // 打开总中断
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
while (1) {
KeyScan(); // 按键扫描
LEDBlink(); // LED闪烁
Beep(); // 蜂鸣器响两声
if (reset == 1) { // 按键2清零
ms = 0;
sec = 0;
min = 0;
reset = 0; // 清零标志位复位
}
if (flag == 1) { // 计时开始/暂停
Display(); // 显示秒分
}
}
}
```
这个代码实现了按键1开始/暂停计时、按键2清零、LED1-8闪烁、蜂鸣器每过1秒响两声并在四位共阳数码管上显示秒分。计时长度到59分59秒后自动清零。
阅读全文