1.基于proteus的51单片机开发实例(6)--花样流水灯1.1.实验目的本实例的电路图如图1所示。
图1花样流水灯电路
本实例通过单片机P3端口控制8个LED实现多种方式的流水灯,从而了解51单片机的P3端口的内部结构及原理。同时学习51单片机程序设计中如何使用左移、右移运算实现设定功能。
1.2.设计思路利用51单片机P3端口的8个引脚,分别连接8个LED,使用“灌电流”的方式驱动LED。程序设计中通过编写移位程序,使单片机的P3口按照正向流水灯、反向流水灯、花样流水灯的设计思路控制8个LED花
1.3.基础知识通过前面的实例,我们已经了解了51单片机的P0,P1,P2这三个端口的内部结构和工作原理,本实例中我们来继续学习P3端口的内部结构。
P3口的内部结构如图2所示。
图2P3口内部结构
51单片机的P3端口同样有~共8个引脚。P3口除了可用作通用输入输出端口(I/O端口)外,还具有第二功能。
1、P3口用作I/O端口的工作原理
当需要将P3口用作I/O端口时,单片机内部相关电路会送出“1”到与非门的一个输入端(第二功能输出端),打开与非门。
如果P3端口用作输出口,CPU给锁存器的CL端发送写锁存器信号,内部总线送来的数据通过D端进入锁存器并从Q端输出,再通过与非门和晶体管的两次反相后从P3端口引脚输出。
如果P3端口用作输入口,CPU先给锁存器写“1”,让Q=1,与非门输出0,晶体管截止,从而关闭P3端口的输出电路,然后CPU向三态门控制端送一个读引脚控制信号,输入三态门打开,从P3端口引脚输入的信号经过输入缓冲器和输入三态门送到内部总线。
2、P3端口用作第二功能时
P3端口用作第二功能时,实际上也是在该端口输入或者输出信号,只不过输入或者输出的是一些特殊功能的信号。
当51单片机需要将P3端口用作第二功能输出信号时,CPU会先向锁存器写“1”,Q=1,它送到与非门的一个输入端,与非门打开,内部的第二功能输出信号送到与非门的另一个输入端,反相后输出到晶体管的栅极,经过晶体管的再次反相后从相应引脚输出。
当51单片机需要将P3端口用作第二功能输出信号时,CPU会先向锁存器写“1”,Q=1,它送到与非门的一个输入端,与非门打开,内部的第二功能输出信号输出“1”,送到与非门的另一个输入端,这样与非门的输出为0,晶体管截止,关闭输出电流。P3端口引脚输入的第二功能信号经过输入缓冲器送到特定的电路(例如计数器T0)。
1.4.电路设计本实例的电路如图1所示。
单片机的P3口的8位分别连接8个LED的负极,8个LED的正极分别通过限流电阻连接到电源正极。限流电阻的作用是限制流过LED的电流,防止因为电流过大烧坏单片机端口。
1.5.程序设计本示例的程序代码如下。
#//头文件调用,头文件对单片机的各种中寄存器地址进行预定义//全局变量定义,code表示该变量所定义的数据将被放在程序代码区(ROM区),从而不会占用RAM空间unsignedcharcodetable[]={0x1f,0x45,0x3e,0x68,0xa7,0xf3,0x46,0x33,0xff,0xaa,0x08,0x60,0x88,0x11,0xa5,0xda};//声明一个延时函数,函数声明后,函数的定义部分可以放在调用它的函数的后面voidDelay(unsignedintDelayCouter);//主程序,单片机程序中只能有一个主函数,名字必须是main,并且只能有一个。voidmain(void){unsignedchari;//局部变量定义while(1){P3=0xfe;//输出低电平,点亮第一个发光二极管for(i=0;i8;i++)//循环8次,LED从上到下逐个点亮,最后全亮{Delay(60000);P3=1;}P3=0x7f;//输出低电平,点亮第8个发光二极管for(i=0;i8;i++)//循环8次,LED从下到上逐个点亮,最后全亮{Delay(60000);P3=1;}P3=0xfe;//输出低电平,点亮第一个发光二极管for(i=0;i8;i++)//循环8次,LED从上到下依次点亮,每次只亮一个{Delay(60000);P3=1;P3|=0x01;}P3=0x7f;//输出低电平,点亮第8个发光二极管for(i=0;i8;i++)//循环8次,LED从下到上依次点亮,每次只亮一个{Delay(60000);P3=1;P3|=0x01;}for(i=0;i16;i++)//循环16次,依次将数组table中的16个数据送到p3端口,点亮对应LED{Delay(20000);P3=table[i];}}}//延时函数,DelayCouter为输入参数,可以修改DelayCouter的值来调整延时时间长短voidDelay(unsignedintDelayCouter){while(--DelayCounter)}程序的第一个for语句将LED从上到下依次点亮,直至最后8个LED全部点亮;第二个for语句将LED从下到上依次点亮,直至最后8个LED全部点亮。第三、第四个for语句先将一个LED下移点亮再上移点亮(上移、下移时,始终只有一个LED点亮)。第五个for语句以查表方式点亮P3端口的8个LED。
1.6.实例仿真单片机的P3口连接8个LED。程序开始运行后,8个LED按照D1~D8的顺序逐个点亮,8个LED全部点亮后。然后8个LED开始从D8~D1的顺序逐个点亮,全部点亮后,开始按顺序点亮单个LED,然后是反方向点亮单个LED。之后8个LED按照16种形式变化。
1.7.总结通过前面的实例和本实例,我们已经全部了解和学习了51单片机的4个I/O端口P0~P3(每个端口8位,总计4*8=32个引脚)。的、51单片机所有的输出控制及输入检测都是通过这些端口实现的。掌握了端口的原理,在后续的学习中,就会很容易实现各种功能。