龙空技术网

基于proteus的51单片机开发实例(6)--花样流水灯

老马识途单片机 470

前言:

当前咱们对“单片机流水灯程序c语言分析”可能比较珍视,大家都想要学习一些“单片机流水灯程序c语言分析”的相关资讯。那么小编在网络上搜集了一些有关“单片机流水灯程序c语言分析””的相关内容,希望各位老铁们能喜欢,姐妹们快快来学习一下吧!

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所示。

图2 P3口内部结构

51单片机的P3端口同样有P3.0~P3.7共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. 程序设计

本示例的程序代码如下。

 #include <AT89X52.h>  //头文件调用,头文件对单片机的各种中寄存器地址进行预定义//全局变量定义,code表示该变量所定义的数据将被放在程序代码区(ROM区),从而不会占用RAM空间unsigned char code table[] = {0x1f,0x45,0x3e,0x68,                              0xa7,0xf3,0x46,0x33,															0xff,0xaa,0x08,0x60,															0x88,0x11,0xa5,0xda};//声明一个延时函数,函数声明后,函数的定义部分可以放在调用它的函数的后面void Delay(unsigned int DelayCouter);//主程序,单片机程序中只能有一个主函数,名字必须是main,并且只能有一个。void main(void){	unsigned char i;//局部变量定义		while(1)	{		P3=0xfe;//P3.0输出低电平,点亮第一个发光二极管		for(i = 0;i < 8;i++)//循环8次,LED从上到下逐个点亮,最后全亮		{			Delay(60000);			P3 <<= 1;		}				P3=0x7f;//P3.7输出低电平,点亮第8个发光二极管		for(i = 0;i < 8;i++)//循环8次,LED从下到上逐个点亮,最后全亮		{			Delay(60000);			P3 >>= 1;		}				P3=0xfe;//P3.0输出低电平,点亮第一个发光二极管		for(i = 0;i < 8;i++)//循环8次,LED从上到下依次点亮,每次只亮一个		{			Delay(60000);			P3 <<= 1;			P3 |= 0x01;		}				P3=0x7f;//P3.7输出低电平,点亮第8个发光二极管		for(i = 0;i < 8;i++)//循环8次,LED从下到上依次点亮,每次只亮一个		{			Delay(60000);			P3 >>= 1;			P3 |= 0x01;		}						for(i = 0;i < 16;i++)//循环16次,依次将数组table中的16个数据送到p3端口,点亮对应LED		{			Delay(20000);			P3 = table[i];		}	}}//延时函数,DelayCouter为输入参数,可以修改DelayCouter的值来调整延时时间长短void Delay(unsigned int DelayCouter){	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单片机所有的输出控制及输入检测都是通过这些端口实现的。掌握了端口的原理,在后续的学习中,就会很容易实现各种功能。

标签: #单片机流水灯程序c语言分析 #c语言proteus的操作顺序 #51单片机c语言实例