单片机实验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
发布评论