您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 项目4单片机控制LED灯的设计
电子工业出版社单片机控制技术项目式教程(C语言版)电子工业出版社项目4单片机控制LED灯的设计l能了解51单片机I/O口的结构;l能掌握51单片机I/O口的特点及应用;l能掌握51单片机控制LED灯的硬件设计方法;l能熟练编写单片机控制LED灯闪烁的程序。Ø学习目标Ø工作任务l叙述51单片机I/O口的结构和特点;l设计单片机控制单个LED灯闪烁的电路和工作软件;l设计单片机控制多个循环LED灯的电路和工作软件。任务4.1单片机控制单个LED灯任务4.2单片机控制多个循环LED灯项目拓展实验板彩灯的花式控制项目小结思考与训练项目4单片机控制LED灯的设计任务4.1单片机控制单个LED灯4.1.1MCS-51单片机的I/O口介绍MCS-51系列单片机有4个8位的并行I/O接口:P0、P1、P2和P3口。它们是特殊功能寄存器中的4个。这4个口,既可以作输入,也可以作输出,既可按8位处理,也可按位方式使用。输出时具有锁存能力,输入时具有缓冲功能。1.P0口P0口是一个三态双向口,包括一个输出锁存器、两个三态缓冲器、输出驱动电路和输出控制电路组成,它的一位结构如图:输出驱动器控制电路P0口功能1、通用I/O接口:不需要外部扩展时,内部控制信号将使MUX开关接通到锁存器。此时,由于P0口没有内部上拉电阻,通常要在外部加一个上拉电阻来提高驱动能力。2、地址/数据分时复用:需要进行外部扩展时,内部控制信号将使MUX开关接通到内部地址/数据线。此时,P0口在ALE信号的控制下,分时输出低8位地址和8位数据信号。P0口的工作原理(1)通用I/O口①用作输入口(端口外数据内部寄存器)方式1(读锁存器):Q缓冲器2D内部总线,适于“读—修改—写”方式2(读引脚):P0.x缓冲器1D内部总线。作为通用I/O使用,是一个准双向口:“在输入数据时应先把口置1,使V1、V2都截止,引脚处于悬浮状态,可作高阻抗输入”②用作输出口(片内数据端口)数据锁存MUXP0.x(2)地址/数据总线口①输出:地址/数据为1,P0·x——高地址/数据为0,P0·x——低②输入:经缓冲器1读入(1)P0口既可作地址/数据总线使用,也可作通用I/O口使用。当P0口作地址/数据总线使用时,就不能再作通用I/O口使用了。(2)P0口作输出口使用时,输出级属漏极开路,必须外接上拉电阻,才有高电平输出。(3)P0口作输入口读引脚时,应先向锁存器写1,使V1、V2截止,不影响输入电平。P0口特点2.P1口P1口是准双向口,它只能作通用I/O接口使用。结构与P0口不同,它的输出只由一个场效应管V1与内部上拉电阻组成。(1)P1口是唯一的单功能口,仅能作为通用I/O口使用。因在其输出端接有上拉电阻,可以直接输出而无需外接上拉电阻。(2)同P0口一样,当作输入口时,必须先向锁存器写“1”,使场效应管V1截止。P1口特点3.P2口P2口也是准双向口,它有两种用途:通用I/O接口和高8位地址线。P2口作I/O端口使用时:内部控制信号使MUX开关接通到锁存器,此时P2口的用法与P1口相同。P2口作外部地址总线使用时:内部控制信号使MUX开关接通到内部地址线,此时P2口的引脚状态由所输出的地址决定。需要特别指出的是,由于对片外地址的操作是连续不断的,只要进行了外部系统扩展,此时P0口和P2口就不能再用作I/O端口了。4.P3口•P3口用作通用I/O口时,其工作原理同P1口类似。•此外,它的每一根线还具有第二种功能。☆在真正的应用电路中,P3口的第二功能显得更为重要。引脚第二功能信号名称P3.0RXD串行数据接收P3.1TXD串行数据发送P3.20INT外部中断0申请P3.31INT外部中断1申请P3.4T0定时/计数器0的外部输入P3.5T1定时/计数器1的外部输入P3.6WR外部RAM写选通P3.7RD外部RAM读选通4.1.2单片机控制单个LED灯闪烁的设计1.任务要求设计一个电路,AT89C52单片机的P1.7引脚连接一个LED灯,控制LED闪烁。2.任务分析以单片机为核心的电子设计硬件设计软件设计单片机最小系统加上最简单的输出电路来驱动LED编程控制P1.7引脚的电平状态,使其持续一段时间的高电平,再持续一段时间的低电平3.任务设计(1)器件的选择①发光二极管发光二极管:单向导电性,通过5mA左右电流即可发光,电流越大,亮度越强,但若电流过大会烧毁二极管,一般控制在3~20mA。工作电压:红色发光二极管1.7-2.5V绿色发光二极管2.0-2.4V黄色发光二极管1.9-2.4V蓝/白色发光二极管3.0-3.8V②限流电阻二极管串联电阻的目的是为了防止发光二极管和P1.7引脚流过的电流过大,烧毁二极管或单片机,所以该电阻也称为“限流电阻”。限流电阻的选择:假设电源电压为VCC,发光二极管的导通压降为VDD,导通时流过二极管的电流为I,则限流电阻R为:R=(VCC-VDD)/I例如,若二极管的导通压降为2.2V,导通时流过的电流为5mA,则限流电阻为560Ω。③器件清单器件名称数量(只)AT89C52112MHz晶体122pF瓷片电容222uF电解电容110kΩ电阻1560Ω电阻1发光二极管LED1(2)硬件原理图设计再次强调:图中的单片机元件没有“VCC”和“GND”引脚,这是因为Proteus软件中,元件模型中的“电源”和“地”已经进行了连接,“VCC”接到了“+5V”电源,“GND”接到了“地”,所以隐藏了这两个引脚。(3)软件程序设计#includereg52.h//宏定义sbitled=P1^7;//用sbit关键字定义P1.7引脚//延时子函数voidDelay(unsignedintt){while(--t);}//主函数,控制P1.7引脚的LED灯闪烁voidmain(void){while(1)//主循环{led=0;//将P1.7引脚置0,对外输出低电平Delay(20000);//调用延时程序led=1;//将P1.7引脚置1,对外输出高电平Delay(20000);//调用延时程序}}²在软件编程中,通常使用空循环来达到延时的效果。延时时间的长短可以在KeilC51的调试状态下分析。(4)软硬件联合调试1.任务要求设计一个电路,AT89C52单片机的P1口连接8只LED灯,按以下顺序点亮,形成流水灯的效果:①从P1.0到P1.7连接的8只LED灯逐个点亮;②从P1.0到P1.7连接的8只LED依次全部点亮;③从P1.7到P1.0连接的8只LED灯逐个点亮;④从P1.7到P1.0连接的8只LED依次全部点亮。任务4.2单片机控制多个LED灯2.任务分析任务要求单片机控制8个LED灯,当需要对某个I/O口的八位一起操作时,一般采用整体操作的方式,即总线的方式。在软件设计时可以定义一个变量来给P1口赋值,赋的值不同点亮的LED灯不同。由于8只LED灯要按一定规律点亮,这就要求对给P1口赋的变量进行移位,移位操作既可以用标准C中的左移、右移运算符来实现,也可以用C51库自带的函数来实现。移位运算符循环移位函数注意:循环移位函数_crol_()和_cror_()包含在intrins.h头文件中,因此如果在程序中要用到这类函数,就必须在程序的开头处包含intrins.h这个头文件。intx;x=_cror_(0x7f,1);表示将01111111循环右移一位之后赋给x将字符c循环右移b位_cror_(unsignedcharc,unsignedcharb)intx;x=_crol_(0xfe,1);表示将11111110循环左移一位之后赋给x将字符c循环左移b位_crol_(unsignedcharc,unsignedcharb)示例功能函数intx;x=_cror_(0x7f,1);表示将01111111循环右移一位之后赋给x将字符c循环右移b位_cror_(unsignedcharc,unsignedcharb)intx;x=_crol_(0xfe,1);表示将11111110循环左移一位之后赋给x将字符c循环左移b位_crol_(unsignedcharc,unsignedcharb)示例功能函数intx;x=31;表示将0011右移一位之后赋给x按位右移intx;x=31;表示将0011左移一位之后赋给x按位左移示例功能符号intx;x=31;表示将0011右移一位之后赋给x按位右移intx;x=31;表示将0011左移一位之后赋给x按位左移示例功能符号由于用到的发光二极管较多,每个发光二极管都需要限流电阻,硬件电路会显得比较复杂,所以这里使用了排阻。排阻,就是若干个参数完全相同的电阻,它们的一个引脚都连到一起,作为公共引脚,其余引脚正常引出。如果一个排阻是由n个电阻构成的,那么它就有n+1个引脚,一般来说最左边的那个是公共引脚。它在排阻上一般用一个色点标出来。直插式排阻贴片式排阻☆排阻一般用在数字电路上,比如作为某个并行口的上拉或者下拉电阻用。使用排阻比用若干只固定电阻更方便。3.任务设计(1)器件的选择器件清单器件名称数量(只)AT89C52112MHz晶体122pF瓷片电容222uF电解电容110kΩ电阻1560Ω×8排阻1发光二极管LED8(2)硬件原理图设计(3)软件程序设计#includereg52.h//宏定义,52单片机头文件#includeintrins.h//包含_crol_、_cror_函数所在的头文件#defineuintunsignedint#defineucharunsignedchar//延时子函数voidDelay(unsignedintt){while(--t);}//主函数,循环点亮LED灯voidmain(){uchark,recy;while(1)//大循环{recy=0xfe;for(k=1;k=8;k++)//8只LED灯从P1.0到P1.7逐个点亮{P1=recy;//先点亮P1.0的LED灯Delay(50000);//延时一段时间recy=_crol_(recy,1);//将recy循环左移1位后再赋给recy}recy=0xfe;for(k=1;k=8;k++)//8只LED灯从P1.0到P1.7依次全部点亮{P1=recy;Delay(50000);recy=recy1;//将recy左移1位后再赋给recy}P1=0xff;//全部熄灭Delay(50000);recy=0x7f;for(k=1;k=8;k++)//8只LED灯从P1.7到P1.0逐个点亮{P1=recy;//先点亮P1.7的LED灯Delay(50000);recy=_cror_(recy,1);//将recy循环右移1位后再赋给recy}recy=0x7f;for(k=1;k=8;k++)//8只LED灯从P1.7到P1.0依次全部点亮{P1=recy;Delay(50000);recy=recy1;//将recy右移1位后再赋给recy}P1=0xff;//全部熄灭Delay(50000);}}(4)软硬件联合调试将编写的程序在KeilC51中编译成*.hex后调入Proteus硬件电路图的AT89C52中运行,八只LED灯从P1.0到P1.7逐个点亮,接下来再从P1.0到P1.7依次全部点亮,然后全部熄灭后又从P1.7到P1.0逐个点亮,最后再从P1.7到P1.0依次全部点亮,如此反复形成流水灯。项目拓展实验板彩灯的花式控制在任务4.2中设计的流水灯为八个LED按一个方向循环点亮,此外我们还可以通过编程控制LED灯,使它以我们想要的各种方式点亮,而且LED灯点亮频率可以通过改变延时时间来实现。下面编写程序控制实验板上的八个LED灯按照不同花式循环点亮。(1)实验板8个LED灯电路如图所示。RP1为390欧姆排阻;J9为插针,用于连接需要使用的I/O口,此处用杜邦线连接单片机的P1口。(2)编写程序,控制八个LED灯使其以1s左右的时间间隔按不同形式循环点
本文标题:项目4单片机控制LED灯的设计
链接地址:https://www.777doc.com/doc-4720039 .html