找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5301|回复: 0
打印 上一主题 下一主题
收起左侧

基于Proteus仿真的51单片机彩灯控制器源程序与详细的实验文档

[复制链接]
跳转到指定楼层
楼主


(1)按下KEY1按键的时候,节日彩灯开启(默认从上到下)并且数码管显示当前的模式和流转时间间隔,再次按下的时候彩灯关闭。

(2)KEY2按键的功能实进行彩灯流转模式的设置,彩灯总共有四种模式。模式一是从上到下移动着依次点亮,模式二是从下到到移动着依次点亮,模式三是先全部点亮,然后依次从上到下移动着依次熄灭,模式四是先全部点亮,然后依次从下到上移动着依次熄灭。

(3)当节日彩灯亮着的时候按下KEY3进行彩灯流转的时间间隔增加。初始值是0.5秒, 按一下增加0.5秒,加到最大值3秒就不能增加了。

(4)当节日彩灯亮着的时候按下KEY4进行彩灯流转的时间间隔减小。按一下KEY4减少0.5秒,减小到最小值0.5秒就不能减少了。

(5)数码管第一位显示当前的模式,第二位是符号“-”,第三位和第四位表示当前的流转时间间隔,单位是秒。

三、总体设计方案

1.硬件设计说明

节日彩灯控制器的硬件模块主要有四大部分组成:AT89C51单片机主控模块,LED灯模块,数码管模块、按键模块。

AT89C51单片机主控模块主要作用是通过控制小彩灯的点亮和熄灭,控制数码管的显示,采集按键的输入情况。利用单片机自带的定时器功能控制彩灯亮灭的时间。LED灯的作用就是亮和灭,各种颜色的小LED的亮灭就形成美丽的彩灯。按键的作用主要是控制小彩灯的流动的方向和流动的时间间隔。数码管的作用是为了显示当前流转的方向和流转的时间间隔。

图3.1仿真的电路图

(1)AT89C51单片机主控的设计

AT89C51是一种功能强、灵活性高且价格合理的单片机,可方便的应用于各种控制领域,并且它的设计也是比较简单的,只需要一个晶振电路和一个复位电路便就可以使AT89C51单片机工作了。单片机这里使用的晶振电路频率是12MHZ。单片机在这个频率下工作比较稳定、不容易出错误,下图是单片机的设计电路图。

图3.2单片机主控芯片设计仿真图

(2)LED灯的硬件设计

LED灯是一种低功耗、使用寿命高、亮度好,在生活中很多地方都能用到。

LED的本质是发光二极管,我们只要正负极接上电源便能够发光。单片机实现彩灯控制需要将LED的一端接到VCC5V电源,另一端接到单片机的管脚上面,单片机管脚是低电平的时候就能够点亮。为了控制电流我们还需要再加一个限流电阻,电阻大小为1000Ω。LED彩灯部分电路图如下所示:

图3.3LED彩灯设计仿真图

(3)按键的硬件设计

按键模块在生活中也很常见,它是一种机械结构,当按键按下的时候按键上方的金属片就会和下方的金属片接触,这样电路就形成了一种通路的状态。我们将按键电路和单片机管脚连到一起,并在另一端接负极,当按下按键的时候就会导通单片机管脚就会拉低。我们就判断单片机的管脚的高低电平就能够获取按键的按下。按键部分电路如下图所示:

图3.4独立按键彩灯设计仿真图

(4)数码管的硬件设计

数码管的也是生活中用的比较多的模块,它的设计电路也比较简单。数码管分为共阴和共阳两种,共阴的就是对应LED灯在低电平的时候会点亮,共阳的就是对应LED灯在高电平的时候会点亮。数码管分为段选控制和位选控制,段选就是控制LED的亮和灭组合出数字的图形,位选控制是控制那一个数码管点亮。数码管的设计电路如下所示:

.

   图3.5数码管设计仿真图

2.软件设计说明

软件设计的功能主要有:按键1控制彩灯开启和关闭,按键2控制彩灯的流转模式,按键3是增加彩灯的流转时间间隔的,按键4是减少彩灯的流转时间间隔的。彩灯开启的时候数码管第一位显示当前的流转模式,第三位和第四位显示当前彩灯的流转时间间隔。彩灯控制器软件功能总流程图如下所示:

图3.6软件功能总流程图

(1)按键获取的实现

按键的IO 接在单片机的P1^0~P1^4上,我们实时的扫描这四个端口,当有一个端口电平被拉低了就延时10ms,再次判断这个端口有没有被拉低,如果还被拉低就可以确定按键按下了。按键获取的流程图如下:

图3.7按键获取流程图

代码如下所示


  1. uchar KeyScanf()
  2. {
  3. uchar keyvalue = 0;   //第几个按键被按下的值
  4. if(KEY1 == 0)       //判断按键有没有被按下
  5. {
  6. Delay1ms(10);    //延时一段时间
  7. if(KEY1 == 0)    //再次判断按键优美按下
  8. {
  9. keyvalue = 1;
  10. }
  11. while(!KEY1);  //按键有没有松开
  12. }
  13. return keyvalue;   //返回按键按下的值
  14. }
复制代码


(2)彩灯开启和关闭的软件设计

彩灯的IO口接在了单片机的P2^0~P2^7管脚,所以在控制彩灯的时候我们可以直接对单片机的P2口进行操作,当按键1被安下的时候彩灯开关标志置1,然后对P2口P2口写入P2=0x00;彩灯关闭操作是彩灯开关标志置0,对P2口写入P2=0xff;这样就关闭了彩灯。彩灯开启和关闭流程图如下所示

图3.8彩灯开启和关闭流程图

代码如下所示:


  1. if(keyvalue == 1)            //按键1控制开关灯
  2. LEDSwitch = !LEDSwitch;  //开关灯标志位改变
  3. if(LEDSwitch == 1){
  4. P2 = 0x00;   //点亮全部彩灯}
  5. else{
  6. P2 = 0xff;  //熄灭全部彩灯
  7. }
复制代码


(3)彩灯模式控制软件设计

彩灯有四种模式进行变化,我设计的时候定义了一个彩灯流转方式的标志位LEDMode有0到3四种模式,当灯开启并且按键2被按下那LEDMode就加1,加到4重新置为0。彩灯实现从上到下,从下到上的步骤是通过对0x01进行右移实现的,从上到下就右移0位,1位,2位然后取反对应的位置就是0其他位置上都是1就实现了从上到下依次点亮,从下到上实现是和这一样的,不过顺序变成了7位,6位等等。彩灯模式控制流程图如下所示:

图3.9彩灯模式变化流程图

实现代码如下所示:

temp = 0x01;    //用于右移控制LED灯
if(LEDSwitch == 1)
{
if(LEDMode == 0)  //模式0 从上到下依次点亮
{
LED = ~(temp<<i); //点亮LED灯
i++;
if(i>8) i=0;      //控制移动的位数
}
if(LEDMode == 1)  //模式1 从下到上依次点亮
{
LED = ~(temp<<i); //点亮LED灯
i--;
if(i<0) i=8; //控制移动的位数
}

if(LEDMode == 2) //模式2 从上到下依次熄灭

{
LED = (temp<<i);
i++;
if(i>8) i=0;
}
if(LEDMode == 3) //模式2 从下到上依次熄灭
{
LED = (temp<<i);
i--;
if(i<0) i=8;
}
}


(4)彩灯间隔时间设置

间隔时间是设置了一个全局变量LEDTime,然后通过控制定时器来控制流转时间的间隔。时间流转默认是0.5秒,按一下按键3加0.5秒,按一下按键4减0.5秒。最小时间间隔是0.5秒,最大是3秒。彩灯间隔时间设置流程图如下图所示:

图3.10彩灯间隔时间设置流程图

代码如下所示:

//定时器是 10ms的定时器,一次10ms,加0.5s需要50次
if(keyvalue == 3)     //增加时间按键
{
LEDTime += 50;   //增加0.5秒
if(LEDTime >= 300); //最大3秒
LEDTime = 300;
}
else if(keyvalue == 4) // 减时间按键
{
LEDTime -= 50;  //减少0.5秒
if(LEDTime <=50) //最小0.5秒
LEDTime = 50;
}

(4)数码管显示的软件实现
本文中的数码管采用的是4位把段LED数码管,数码管第一位显示的是当前的模式,第二位显示的是分隔符“-”,第三位和第四位一起组成当前的彩灯流转的间隔时间,流转的间隔时间是以秒为单位最小是0.5秒。当彩灯的模式和流转时间改变了,数码管的显示也会随着改变。数码管的显示原理是通过逐位扫描的方式,从第一位到第四位依次延时2ms,通过一个视觉的暂留,实现四个数码管全部都亮的效果。数码管显示代码如下所示:
if(LEDSwitch == 1)  //小彩灯打开
{
display(0,LEDMode);  //第一位显示模式                           
display(1,13);       //显示 -
display(2,LEDTime/100);  //显示小点数 整数位
display(3,LEDTime/10%10);   //显示小点数小数位
}
#define seg P3
//0-9 全亮 全灭 C
unsigned char code seg_wei[]  = {0x01,0x02,0x04,0x08};//位选表
//段选表
unsigned char code seg_duan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0xff,0xc6,0xbf};
/*数码管显示函数*/
//flag:表示显示的是哪一位
void display(uchar flag,uchar number)
{
seg = seg_wei[flag];
if(flag == 2)   //第三位显示 出小点数
P0  = (seg_duan[number]&0x7f);
    else
P0  = seg_duan[number];  //其他正常正常显示
    Delay1ms(2);    //延时2ms
}


四、成果展示图

(1)彩灯的开启和关闭

点击按键1LED灯开始流转,数码管显示当前的模式和流动的时间。

          

图4.1彩灯开启LED灯变化

     

图4.2彩灯开启数码管的变化

(2)彩灯流转模式的改变

彩灯有四个模式,模式1是从上到下依次移动点亮,模式2是从下到上依次移动点亮,模式3是从上到下依次移动熄灭,模式4是从下到上依次移动熄灭。

        

图4.3彩灯模式0变化

       

图4.4彩灯模式1变化

        

图4.5彩灯模式2的变化

        

图4.6彩灯模式3的变化

(3)彩灯时间间隔

时间间隔的调整,按键3增加时间间隔一次0.5秒,按键4减少时间间隔一次0.5秒。最大时间间隔3秒,最小时间间隔0.5秒。

      

图4.7流转时间间隔变化

总结

在不断学习中,终于完成了设计任务。通过本设计锻炼了我们的实践能力,也是对以后我们实际工作能力的训练和考察过程。现在是一个高科技的时代,单片机的应用无处不在,这更坚定了我要学好单片机的决心。

本设计本身就比较简单,整个设计的过程中每一步都是自己亲自做过的,在经过遇到问题,思索问题到解决问题的过程中,就连向别人请教的过程也是一种收获,收获是最多的。以往没有注意到的问题,都在这一次的设计中得以体现,这培养了我的细心,耐心和专心。我觉得能够在这次的设计中学到很多的东西,以往不注意的细节,在这一次中是必须让自己去注意的。也是我这所学到知识的一个体现。我深深知道,每一次的学习实践环节都是那么的来之不易,都是通过老师的深思熟虑后,才给我们定下目标。然后让我们在知识的海洋里翱翔,让我们随着年龄的增长不断的扩充自己的知识领域,也逐渐成熟


全部资料51hei下载地址:

基于单片机的彩灯控制器.zip (1.59 MB, 下载次数: 73)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表