一、实验要求
【实验内容】
1.用Proteus绘制硬件原理图,并设置元件参数。
2.用KeilC51软件编写点亮一个发光二极管的程序。
3.Keil C51与Proteus联调,仿真调试和硬件调试观察实验现象。
4.实现P2口连接的8只LED灯交替闪烁。
【硬件要求】
连接方法:P2.0-P2.7采用“拉电流”方式连接8只LED灯,LED的阴极通过保护电阻连接到地端。
【软件实现】
1.编程实现点亮一个发光二极管的程序。
2.编程实现P2口连接的8只LED灯交替闪烁。
二、分析
1、本实验是通过单片机的P2口做相关实验,P2口当作为输入接口时与P0、P1一样,要先向其锁存器写入1,其目的是使场效应管截止;作为输出接口时与P1口一样,因为其内部有上拉电阻即不需要另外外接上拉电阻。
2、画电路的工作原理是通过P2.0-P2.7八个口输出高低电平状态,由单片机控制8只发光二极管,使每只发光二极管点亮。因为发光二极管具有单向导通性,当加在发光二极管两端的电压超过其导通电压时,它就会导通;而超过一定的电流时,发光二极管点亮。通过单片机的I/O口连接,因为选择的是P2口,即P2.0-P2.7八个口与8只发光二极管连接,这里采用的是“拉电流”方式连接,即单片机P2各口的各引脚与发光二极管的阳极相连,而发光二极管的阴极接地,即通过保护电阻连接到地端。
三、利用Proteus仿真软件画原理图
四、Keil编程软件编写程序
本次实验是通过实现P2口连接的8只LED灯交替闪烁,且连接方法是通过单片机的并行输入/输出接口的P2端口P2.0-P2.7,其中各发光二极管的阴极通过保护电阻连接到地端。
通过循环依次点亮各发光二极管,且点亮一盏时其它发光二极管是熄灭的,通过一个for循环写一个可依次每一个发光二极管轮流的循环,然后该循环中通过取数组中的元素来对P2端口的P2.0-P2.7输出高低电平状态组成的十六进制数据,从而实现依次循环点亮各发光二极管,另外还要设置一个延时,即设置一个延时函数从而设置每次循环点亮的间隔时间,实现每隔一段时间点亮一盏灯,首先单片机P2口输出高电平1时对应的发光二极管点亮,而输出低电平0时对应的发光二极管熄灭,采用数组建立数组存储各端口输出高低电平状态组成的十六进制数据,且字节操作法,即unsigned char LED[]={0x01,0x02,0x04,0x08,0x10,
0x20,0x40,0x80},比如十六进制0x01表示的是二进制0000 0001,即此时点亮LED0,其它LED熄灭,十六进制0x02表示的是二进制0000 0010,即即此时点亮LED1,其它LED熄灭,依次进行下去,另外其中还要加上延时函数使各灯延时一段时间。
程序代码如下:
#include<reg51.h> void delay() { unsigned int i,j; for(i=0;i<1000;i++) for(j=0;j<125;j++); } void main() { unsigned char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//定义LED[]数组P2口输出数据 unsigned char a; while(1) { for(a=0;a<8;a++) { P2=LED[a]; delay(); } } }
如下:
通过for(a=0;a<8;a++)循环语句,即每次通过P2=LED[a]调用建立的LED[]数组,数组中的元素分别为8只发光二极管轮流点亮时,单片机P2口各个位输出高低电平状态组成的十六进制数据,并通过调用先前创建的delay()延时函数延时,下图生成.HEX可执行文件:
五、实验结果
将.HEX可执行文件导入到单片机内,并点击开始仿真,仿真结果如下,第一盏灯D1亮,而其它灯是熄灭的,随后,第一盏灯D1熄灭,第二盏灯D2亮,第二盏灯D2熄灭,第三盏灯D3亮……,第三盏灯D3熄灭,依次这样下去。
仿真结果如下:
由于程序中使用while(1)无限循环所以一直会这样循环下去:
按照电路图来连接实物,使用排线直接将P2.0-P2.7接口和LED&交通灯模块的D1-D8灯连在一起,接线如下图,要注意排线对应的各端口。
在烧录软件中设置单片机型号、串口号、最低最高波特率,然后点击“打开程序文件”,选择之前生成的可执行文件,然后打开开发板上的开关,然后点击“下载/编程”,然后右边框就会显示操作是否成功,此时就可以观察板子上LED&交通灯模块的D1-D8灯的情况: