能不能把我原来的代码修正成,能分成八种模式的灯,数码管显示调换的模式的序号,然后蜂鸣器根据灯闪烁发声
时间: 2024-03-12 07:45:11 浏览: 72
好的,以下是我为你修改后的代码,实现了八种模式的灯,数码管显示模式序号,以及蜂鸣器根据灯闪烁发声的功能:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char byte;
typedef unsigned int word;
// 定义数码管和蜂鸣器的引脚
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P1^5;
// 定义 LED 灯的引脚
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^6;
sbit led7 = P1^7;
byte code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0x40,0x00
};
byte code mode[] = {
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
void delay(word n) // 延时函数
{
while(n--);
}
void display(byte dat) // 数码管显示函数
{
wela = 1; // 打开位选锁存器
P0 = 0xff; // 清空数码管
wela = 0; // 关闭位选锁存器
dula = 1; // 打开段选锁存器
P0 = table[dat]; // 显示数据
dula = 0; // 关闭段选锁存器
}
void beep_on() // 打开蜂鸣器
{
beep = 0;
}
void beep_off() // 关闭蜂鸣器
{
beep = 1;
}
void mode1() // 模式1:所有灯同时闪烁
{
byte i;
for(i = 0; i < 8; i++) {
led1 = led2 = led3 = led4 = led5 = led6 = led7 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode2() // 模式2:左右两侧的灯闪烁
{
byte i;
for(i = 0; i < 8; i++) {
led1 = led7 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode3() // 模式3:中间的灯闪烁
{
byte i;
for(i = 0; i < 8; i++) {
led3 = led4 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode4() // 模式4:交替闪烁
{
byte i;
for(i = 0; i < 8; i++) {
led1 = led3 = led5 = led7 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode5() // 模式5:左侧向右移动
{
byte i;
for(i = 0; i < 8; i++) {
led1 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode6() // 模式6:右侧向左移动
{
byte i;
for(i = 0; i < 8; i++) {
led7 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode7() // 模式7:从左往右依次亮起
{
byte i;
for(i = 0; i < 8; i++) {
led1 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void mode8() // 模式8:从右往左依次亮起
{
byte i;
for(i = 0; i < 8; i++) {
led7 = mode[i];
beep_on();
delay(100);
beep_off();
delay(100);
}
}
void main()
{
byte i = 1;
while(1) {
switch(i) {
case 1: mode1(); break;
case 2: mode2(); break;
case 3: mode3(); break;
case 4: mode4(); break;
case 5: mode5(); break;
case 6: mode6(); break;
case 7: mode7(); break;
case 8: mode8(); break;
}
display(i); // 在数码管上显示模式序号
i = (i + 1) % 9; // 更新模式序号
}
}
```
这段代码主要是在原来的基础上增加了八种闪烁模式,并且根据当前模式序号在数码管上显示对应的数字。同时,当灯闪烁的时候,蜂鸣器也会跟着发声,让整个闪烁过程更加有趣。
需要注意的是,这段代码中的模式序号从1开始编号,而不是从0开始。另外,数码管和蜂鸣器的引脚需要根据具体的硬件连接进行调整。
阅读全文