51单片机实验2

编程入门 行业动态 更新时间:2024-10-06 23:28:49

51<a href=https://www.elefans.com/category/jswz/34/1769836.html style=单片机实验2"/>

51单片机实验2

实训目的:

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位作为bc=p&0x0f;                    // 取p低4位作为cP1=~((b<<i)|(c>>i));         // 将按指定偏移量后得到的新二进制值写入输出端口P1,用于控制LED灯亮灭}
}
void main()
{	while(1){	move_l(0xfe);               // 将LED灯组向左平移,并亮起最右侧的灯        0xfe = 11111110move_r(0x7f);               // 将LED灯组向右平移,并亮起最左侧的灯        0x7f = 01111111move_to_m(0x7e);            // 将LED灯组向中间移动,并亮起左右两侧的灯    0x7e = 01111110move_from_m(0xe7);           // 从中间恢复LED灯初始状态,将所有灯熄灭     0xe7 = 11100111delayms(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 蜂鸣器发出报警声音。

更多推荐

51单片机实验2

本文发布于:2024-02-28 11:14:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769468.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单片机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!