51单片机实验2-花样流水灯的设计(花样流水灯,倒车警示灯)

实训目的:

1、编写程序通过控制51单片机引脚控制8个LED灯,完成“从左向右”“从右向左”“两边向中间”“中间向两边”的显示效果。

2、用按键模拟倒车开关,2个led灯作为汽车尾部倒车警示灯,用一个蜂鸣器作为倒车警示音。“倒车开关”闭合后,蜂鸣器发出警示、LED灯不停闪烁。

实训步骤:

(一)“流水灯”的实现

电路连接如下:

51单片机实验2-花样流水灯的设计(花样流水灯,倒车警示灯)_第1张图片

 主要器件:AT89C51、RES、LED-GREEN

程序代码如下:

#include
#include
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));         // 将按指定偏移量后得到的新二进制值写入输出端口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 灯进行不同的动画效果展示,包括从左到右移动、从右到左移动、从两侧向中间汇聚、从中间向两侧散开等。

(二)倒车警示电路

电路连接:

51单片机实验2-花样流水灯的设计(花样流水灯,倒车警示灯)_第2张图片程序代码如下:

#include
#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 蜂鸣器发出报警声音。

你可能感兴趣的:(51单片机实训,51单片机,嵌入式硬件,单片机)