实训目的:
1、编写程序通过控制51单片机引脚控制8个LED灯,完成“从左向右”“从右向左”“两边向中间”“中间向两边”的显示效果。
2、用按键模拟倒车开关,2个led灯作为汽车尾部倒车警示灯,用一个蜂鸣器作为倒车警示音。“倒车开关”闭合后,蜂鸣器发出警示、LED灯不停闪烁。
实训步骤:
(一)“流水灯”的实现
电路连接如下:
主要器件:AT89C51、RES、LED-GREEN
程序代码如下:
#include<reg51.h>
#include<intrins.h>
void delayms(unsigned char i) //延时函数
{ unsigned int j;
while(i--)
{ for(j=0;j<333;j++);
}
}
void move_l(unsigned char p) // 向左移动LED灯
{ unsigned char i;
P1=p;
for(i=0;i<8;i++) // 循环8次
{ delayms(50);
P1=_crol_(P1,1);//使用_crol_函数实现循环左移,即将P1的二进制值整体左移一位。
}
}
void move_r(unsigned char p) // 向右移动LED灯
{ unsigned char i;
P1=p;
for(i=0;i<8;i++)
{ delayms(50);
P1=_cror_(P1,1); // 使用_cror_函数实现循环右移,即将P1的二进制值整体右移一位。
}
}
void move_to_m(unsigned char p) // 向中间移动LED灯并停止, p为控制LED亮灭的初始状态
{ unsigned char i,b,c;
P1=p; // P1口输出p,以给LED灯做控制信号
b=c=p;
for(i=0;i<4;i++) // 循环4次将LED向中间移动
{ delayms(500);
b=~(~b<<1); // 将b左移一位,然后取反,再取反,
b=b&0x0f; // 取一个掩码0x0f,将b中除了最低位四位以外的数全部清零
c=~(~c>>1); // 将c右移一位,然后取反,再取反,
c=c&0xf0; // 取0xf0的掩码,将c中除了最高位四位以外的数全部清零
P1=b|c; // 将b和c按位或,得到的结果即为向中间移动后LED灯的控制信号
}
}
void move_from_m(unsigned char p) // 从中间恢复LED灯初始状态
{ unsigned char i,b,c;
P1=p;
p=p^0xff; // 使用异或运算将p取反,相当于将p的二进制数码进行反转
for(i=0;i<4;i++)
{ delayms(500);
b=p&0xf0; // 取p高4位作为b
c=p&0x0f; // 取p低4位作为c
P1=~((b<<i)|(c>>i)); // 将按指定偏移量后得到的新二进制值写入输出端口P1,用于控制LED灯亮灭
}
}
void main()
{ while(1)
{ move_l(0xfe); // 将LED灯组向左平移,并亮起最右侧的灯 0xfe = 11111110
move_r(0x7f); // 将LED灯组向右平移,并亮起最左侧的灯 0x7f = 01111111
move_to_m(0x7e); // 将LED灯组向中间移动,并亮起左右两侧的灯 0x7e = 01111110
move_from_m(0xe7); // 从中间恢复LED灯初始状态,将所有灯熄灭 0xe7 = 11100111
delayms(500);
}
}
//主要功能是控制51单片机的端口P1上连着的8个 LED 灯进行不同的动画效果展示,包括从左到右移动、从右到左移动、从两侧向中间汇聚、从中间向两侧散开等。
(二)倒车警示电路
电路连接:
程序代码如下:
#include<reg51.h>
#define ON 0 // 定义开关状态为0,即低电位
#define OFF 1 // 定义开关状态为1,即高电位
sbit BEEP=P1^0; // 定义可编程输出端口P1^0对应的变量BEEP;
sbit LED1=P1^1; // 定义可编程输出端口P1^1对应的变量LED1;
sbit LED2=P1^2; // 定义可编程输出端口P1^2对应的变量LED2;
sbit SW=P0^0; // 定义可编程输入端口P0^0对应的变量SW;
void delay(unsigned int n) // 延时函数声明,参数n为延时时间.
{ while(n--);
}
void light_alarm() // 函数声明:触发闪灯函数
{ LED1=~LED1; // LED1取反(即打开或关闭LED1灯)
LED2=~LED2; // LED2取反(即打开或关闭LED2灯)
}
void beep_alarm() // 函数声明:触发蜂鸣器报警函数
{ unsigned int i;
for(i=0;i<100;i++)
{ BEEP=~BEEP; // 控制BEEP输出电平变为高或低
delay(100); // 延时100ms
}
for(i=0;i<100;i++)
{ BEEP=OFF;
delay(100);
}
}
void main() //主函数
{ while(1)
{ if(SW==ON) // 如果SW输入端口接收到ON信号
{ light_alarm(); // 触发闪灯函数
beep_alarm();} // 触发蜂鸣器报警函数
}
}
//当开关SW状态变为1时(即ON),启动系统报警功能,同时 LED1 和 LED2 会交替闪烁,BEEP 蜂鸣器发出报警声音。