设计与开发

单片机奇偶灯 单片机节日彩灯控制器的设计Proteus仿真

小编 2024-10-06 设计与开发 23 0

单片机节日彩灯控制器的设计Proteus仿真

节日彩灯控制器的设计

一、设计要求:

以单片机为核心,设计一个节日彩灯控制器:

K1—开始,按此键则灯开始流动(由上而下)。K2—停止,按此键则停止流动,所有灯为暗。K3—下,按此键则灯由下向上流动。K4—交替闪烁,按此键则奇数序号灯与偶数序号灯交替闪烁。

二、方案论证:

通过查阅大量相关技术资料,并结合自己的实际知识,我提出课两种技术方案来实现该公能。下面我将首先对这两种方案的组成框图和实现原理分别进行说明,并分析比较它们的特点,然后阐述我最终选择方案的原因。

1 方案比较

彩灯控制器课分为两种方案实现。一种是利用数字逻辑电路装置控制,另一种是采用单片机控制。

1.1 方案一

根据任务要求介绍的彩灯控制电路的基本组成,可以确定彩灯控制器应由振荡器、计数/时序分配电路、移位寄存器和彩灯显示五部分组成。其框图如图所示。

1.2 方案二

本方案主要是通过对基于单片机的多控制、多闪烁方式的LED彩灯循环系统的设计,来达到本设计的要求、其硬件构成框图如图所示,以单片机为核心控制,由单片机最小系统(时钟电路、复位电路、电源)、按键控制电路、LED发光二极管和5V直流电源组成。

2 方案论证

如果采用方案一,利用数字逻辑电路装置控制,其电路不是很复杂,制作相对较容易,成本也相对较低,但可调性差,亮灯模式少而且样式单调,达不到设计任务要求或实现困难。而采用方案二,以单片机控制其优点是电路集成度高,工作原理简单,清晰明了,自定义编程,控制的图案花样多,移植性好等。

3 方案选择

综上,显然方案二各方面优于方案一,以及为了体现专业优势,本次设计采用方案二。

三、理论设计:

1、主程序设计

程序启动时跳转到键盘判断模块程序中,此程序里面包含K1—K4的按键情况判断,循环检测直到有按键按下的时候,程序转去相对应的按键的彩灯显示的模块。

2、键盘扫描程序

四、电路仿真和仿真结果分析

1 仿真电路

1.1 时钟电路和复位电路

1.2 按键控制电路

1.3 LED显示电路

2 仿真结果分析:

此次系统设计结果较好,经Proteus软件仿真系统的调试,可检测出仿真电路正常;对应按键按下,彩灯出现不同花型,实现了多控制、多闪烁的LED彩灯循环;经以上仿真测试证实,本设计能实现设计系统要求的预期功能。

五、心得体会:

本次作业设计以C51单片机为核心,控制电路、LED显示电路、以及单片机最小系统等模块组成的核心主控制电路,实现了由单片机对LED灯的控制。

通过对软件的仿真调试,对彩灯控制器的运行成果满意,实现了题目的要求,同时此设计具有电路简单、易操作、成本小、体积小、耗能低等优点。

但是在设计中也出现了一些问题,在程序编写过程中发现自己有的知识模块模糊,导致实验速度减缓,通过c程序的编写实验就发现自己很多地方的不足,在查阅资料和同学的帮助下才解决了困难,这都是以后要多学习的地方。单片机源程序如下:

#include <reg52.h>#define uchar unsigned char //宏定义#define uint unsigned intsbit k1=P1^2; //位定义sbit k2=P1^3;sbit k3=P1^4;sbit k4=P1^5;uchar a=0; //定义所需变量uchar b;uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //从上到下流水数组uchar code table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //从下到上流水数组void delay_ms(uint xms) //延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void key_scan(uchar b) //按键扫描{if(b==1) //若K1按下{while(k2==1&&k3==1&&k4==1){for(a=0;a<8;a++) //执行从上到下流水操作{P0=table1[a];delay_ms(100);}a=0;}}if(b==2) //若K2按下{while(k1==1&&k3==1&&k4==1){ //P0全部输出高电平,关闭LEDP0=0xff;}}if(b==3) //若K3按下{while(k1==1&&k2==1&&k4==1){for(a=0;a<8;a++) //执行从下到上流水操作{P0=table2[a];delay_ms(100);}a=0;}}if(b==4) //若K4按下{while(k1==1&&k2==1&&k3==1){P0=0xaa; //奇偶位分别点亮delay_ms(100);P0=0x55;delay_ms(100);}}}void main(void) //主函数{TMOD=0X01; //定时器中断初始化TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;while(1);}void T0_time() interrupt 1 //中断服务函数{TH0=(65536-1000)/256;TL0=(65536-1000)%256;if(k1==0)b=1;if(k2==0)b=2;if(k3==0)b=3;if(k4==0)b=4;key_scan(b);}

复制代码

单片机之路—流水灯的N种花式

上一次文章中我们讲解了怎样新建一个单片机keil工程、怎样写程序点亮LED灯。今天我们来通过程序让LED灯闪烁出更多的花式。

在点亮LED灯的程序中我们知道开发板上的LED灯是接到高电平的,如果单片机引脚输出电平,LED导通发亮。如果单片机引脚输出高电平,LED截止熄灭。知道这个原理后我们把单片机的P0端口的8个引脚都按照同样的方法接上8个LED灯,这样我们就能玩出更多的花样啦。

流水灯电路原理图

1、所有LED灯亮灭闪烁

先来一个简单的,先全部点亮和全部熄灭,间隔500ms,上次我们点亮LED灯的程序中我们只操作了P0端口的一位P0.0,现在只需要将原来操作一个端口的一位更改为操作操作整个端口即可。

将P0口定义为一个宏定义,方便后续理解。

#define LED P0

将原来的LED操作函数

void LedDisplay(unsigned char num)

{

Led0 = num;

}

更改为:

void LedDisplay(unsigned char num)

{

LED = num;

}

该函数传入的形参刚好是8bit的无符号整型数据,对应P0口的8个bit,P0.0为最低位。也就是说我们只需要改变LED操作函数传入的形参,P0口对应的8个LED灯状态就能对应改变。所以,我们需要实现全部LED灯的亮灭操作,全都LED点亮,形参传入16进制的0X00,P0口所有引脚置为低电平,延时后熄灭所有的LED灯,LED灯操作函数传入形参0XFF,P0端口所有引脚置为高电平。需要将主函数中对应做如下修改。

void main()

{

for(;;)

{

LedDisplay(0x00);

delay_ms(500);

LedDisplay(0xFF);

delay_ms(500);

}

}

2、间隔一个LED交替闪烁

根据上面我们实现所有LED亮灭的操作方法,如果要实现间隔一个LED交替闪烁,我们只需要更改传入的LED形参即可。对应为8bit的二进制数据为1010 1010为奇数的LED灯点亮,对应二进制为0101 0101为偶数的LED点亮。转化为16进制就是0xAA和0x55。我们对应修改主函数程序如下。编译下载到单片机,你会神奇地发现这时候已经有流水的效果了。

void main()

{

for(;;)

{

LedDisplay(0xAA);

delay_ms(500);

LedDisplay(0x55);

delay_ms(500);

}

}

3、从低位到高位依次点亮

从上面我们已经知道原理了,一次点亮的话我们需要给P0口依次赋值0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。那我们有没有更简单一下的方法呢,有的,我们发现上面的数据取反后是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80。然后0x02等于0x01向左移动一位,也就是说上面所有的数据可以用0x01通过移位和取反两个操作得到。

我们先定义一个全局变量并且初始值赋值0x01

unsigned char dat = 0x01;

在主函数中循环操作,循环一次移位一次。过更改延时函数的传入的形参大小可以调节流水的速度

void main()

{

unsigned char i;

for(;;)

{

dat = 0x01;

for(i=0;i<8;i++)

{

LedDisplay(~dat);

delay_ms(500);

dat = dat<<1;

}

}

}

给大家讲解了一下LED流水灯的原理和一些基本的操作方法,可以通过更改传入的数据和延时的时间,实现更多的流水灯样式。请关注我,我们一起学单片机写程序,感受DIY带来的乐趣。

相关问答

单片机 中的P是什么?

单片机中单独的P指的是奇偶标标志位,是程序状态字PSW中的最低位。P1口和P2口以及P3口都可以做普通的I/O使用!其中P3口具有第二功能:P3.0RXD(串行输入口)...

51串口mcu如何区分两个sbuf?

单片机通过串口发送与接收单个字节的数据,只能使用奇偶校验,多字节数据包可以用异或校验的方法判断接收是否正确。单片机通过串口发送与接...

51 单片机 串口号是什么?

51单片机串口号,主要用于单片机与外部设备的通信。51单片机自身有圈双工的异步通信串口。串口通信的通信方式:串口通信基本通信方式有两种:并行通信和串行通...

51是什么意思?

1、51是51单片机的简称,是对所有兼容Intel8031指令系统的单片机的统称。2、51指每年的五月一日,是国际劳动节,人们习惯简称为5·1。3、一个香烟的牌子,薄荷...

SCON=0x52;具体是什么意思?

楼主,你好。SCON是单片机的串行口控制寄存器,可直接寻址的宏变量。楼主想问的是0x52给它是什么意思?0x52代表的二进制为:01100010,各位代表的意思为:(高位...

labview中visa函数读取为什么要加一个读取缓冲区?

波特率,比特位,奇偶校验位,停止位都设置成和单片机统一、读取visa放while循环里,要不停的读,每次读取缓冲区的所有字节波特率,比特位,奇偶校验位,停止位都设...

USART与UART有什么区别?

[回答]一般而言,单片机中,名称为UART的接口一般只能用于异步串行通讯,而名称为USART的接口既可以用于同步串行通讯,也能用于异步串行通讯。扩展资料:1、...

怎么用万用表测量三相电机是是否烧坏或击穿-ZOL问答

同样是高级语言为什么C语言可以编写51单片机程序,JAVA却不能编写?1868浏览6回答请问高手,如何用万用表判断电路板焊接点与另一个焊点的通断,该用什么档位?...

主板时钟晶振肿么判断好坏-ZOL问答

传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件...

windows终端怎么用?

然后设置好名称,选择好端口(如COM1),波特率(即每秒位数),数据位(通常选择8位),奇偶校验(一般选择无),停止位,数据流控制(一般选择无),然...用键盘直接...

猜你喜欢