找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的电子时钟设计

  [复制链接]
跳转到指定楼层
楼主
ID:188271 发表于 2017-4-10 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


《单片机原理及应用》
课程设计报告






    业:
    级:
    名:
指导教师:

0一* 年 ** 月 ** 日


        课程设计任务书
一、设计题目
LED数字显示电子时钟
二、设计要求
1、方案论证,确定总体电路原理图。
2、元器件选择,设计PCB图(或用万能电路实验板搭线)。
3绘制程序流程图,编写C语言源程序。
4安装调试,实现数字时钟的基本功能,即能正确显示时、分、秒;可调整时间;秒闪功能。
三、设计报告内容
1写出设计方案(包括方案对比,方案确定),给出完整的电路原理图和设计程序流程图。
2、对所设计方案的实现进行全面分析。
3编程调试方法和程序清单。
4安装调试过程,出现的各种现象,总结经验和体会。
*5、进一步完善的设想。








        


.课程设计目的- 1 -
.课程设计题目描述和要求- 1 -
.课程设计报告内容- 1 -
3.1、设计思路        - 1 -
3.2、方案设计与论证        - 2 -
3.2.1数码管显示选择方案        - 2 -
3.2.2数码管驱动选择方案        - 3 -
3.3、 设计原理、程序及流程图        - 3 -
3.3.1流程图        - 3 -
3.3.2电路原理图        - 4 -
3.3.3 C语言程序及说明        - 4 -
3.4、protues仿真图,及作品成型图        - 12 -
3.4.1 protues 仿真图        - 12 -
3.4.2实践电路板照片        - 13 -
3.5安装与调试结果        - 14 -
3.5.1电路安装        - 14 -
3.5.2电路调试        - 15 -
3.5.3 软件调试        - 15 -
3.5.4 性能测试        - 15 -
.总结- 15 -
参考书目- 16 -



LED数字显示电子时钟

.课程设计目的:
1、巩固和加深对单片机原理知识的理解和运用;
2、进一步提高学生综合运用所学知识的能力;
3、培养学生综合分析问题、发现问题和解决问题的能力。

.课程设计题目描述和要求:
1、方案论证,确定总体电路原理图。
2、元器件选择,设计PCB图(或用万能电路实验板搭线)。
3、绘制程序流程图,编写C语言源程序。
4、安装调试,实现数字时钟的基本功能,即能正确显示时、分、秒;可调整时间;秒闪功能。

.课程设计报告内容:

3.1、设计思路:
3.1.1根据所需实现的功能画出程序流程图,如3.5所示。
3.1.2将电路按照3.6原理图焊接起来,定义开关K1,K2,K3分别接单片机的P3.2,P3.2,P3.5引脚。
3.1.3用软件延时对K1,K2,K3进行两级防抖。启动系统,中断初始化,定时器0只用来做计时,定时器1根据需要可选择进入定时模式或者计数模式。外部中断1,2用来等待外部按键的按下。
3.1.4当先按下K1时,进入外部中断0,主函数调用时间显示函数,定时器1处于计数工作模式,num=num+1,num为1时按K2,K3对小时进行加减来调整小时位,num=2按K2,K3对分进行调整,当num=3按K2,K3对秒进行调整,当num=4时就对num进行清零,跳出时间调节。
3.1.5当先按下K2时,进入外部中断1cmd=cmd+1,主函数调用秒表显示函数,进入秒表状态,此时将定时器1的工作模式改为计时,使其每10ms进行一次中断,并设定当cmd位偶数时进行秒表计时,当cmd为奇数时停止秒表计时。K1用来对秒表进行清零,在秒表处于00-00-00状态时,按K1退出秒表,进入时间显示状态。
3.2、方案设计与论证:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D48.tmp.png







1  系统整体框图

整个系统用单片机作为中央控制器,由单片机执行采集芯片内部时钟信号,时钟信号通过单片机I/O口传给单片机,单片机模块控制驱动模块驱动显示模块,通过显示模块来实现信号的输出、LED的显示及相关的控制功能。系统设有按键模块用于对时间进行调整及扩展多个小键盘。
3.2.1数码管显示选择方案
方案一:静态显示。静态显示,即当显示器显示某一字符时,相应的发光二极管恒定导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小电流能获得较高的亮度,且字符不闪烁。但因当所需显示的位数较多时,静态显示所需的I/O口数较大,造成资源的浪费。
方案二:动态显示。动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。利用人的视觉暂留功能可以看到整个显示,但须保证扫描速度足够快,人的视觉暂留功能才可察觉不到字符闪烁。显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。
从节省单片机芯片I/O口和降低能耗角度出发,本数字电子钟数码管显示选择设计采用方案二。
3.2.2数码管驱动选择方案
方案一:上拉电阻驱动方式。数码管段码与接有上拉电阻的单片机芯片I/O口相连,通过编程,单片机芯片即控制段码电平的高低。该方式经费低,但实物制作较复杂。
方案二:7407芯片驱动方式。数码管段码与7407芯片B口相连,7407芯片A口与单片机芯片I/O口,通过编程,单片机芯片即可控制段码电平的高低。该方式实物制作简单,增强驱动数码管段码能力。
    从实物制作简易程度与驱动数码管段码能力角度出发,本数字电子钟数码管驱动选择设计采用方案二。

3.3、 设计原理、程序及流程图:

3.3.1流程图
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D68.tmp.png

3.3.2电路原理图
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D69.tmp.png
3.3.3 C语言程序及说明
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0,num=0,temp=0,cmd=0;
sbit LED=P1^0;
sbit H=P3^2;
sbit M=P3^3;

uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar sec=11,min=11,hour=11,a=0,b=0,c=0;         //定义时钟的时 分 秒 以及秒表的 分 秒 10ms;

void delay(uint i)                                 //延时 2i ms;
{
   uint j;
   for(;i>0;i--)
   for(j=124;j>0;j--);
}

void init()                                                 //中断初始化
{
   ET0=1;
   TMOD=0x51;
   TH0=(65536-25000)/256;
   TL0=(65536-25000)%256;

   ET1=1;
   TH1=0xff;
   TL1=0xff;

   IT0=1;
   IT1=1;

   TR0=1;
   TR1=1;
   EA=1;
}

void Bss()                                                 //两级防抖
{
   H=1;M=1;                                        //调时按钮防抖
   if(H==0)
   {
      delay(20);
          H=1;
          if(H==0)
          {
             delay(20);
                 H=1;
                 if(H==0)
                 {
                   EX0=1;                  
                  }
           }
        }
   if(M==0)                                                   //调分按钮防抖
   {
      delay(20);
          M=1;
          if(M==0)
          {
             delay(20);
                 M=1;
                 if(M==0)
                 {
                   EX1=1;
                  }
           }
        }
}

void display()                                   //时钟显示
{
        P0=tab[hour/10%10];
        if(num==1 && temp==1)        P2=0xff;
        else        P2=0xfe;
        delay(1);
        P0=tab[hour%10];
        if(num==1 && temp==1)        P2=0xff;
        else        P2=0xfd;
        delay(1);
        P0=tab[min/10%10];
        if(num==2 && temp==1)        P2=0xff;
        else        P2=0xfb;
        delay(1);
        P0=tab[min%10];
        if(num==2 && temp==1)        P2=0xff;
        else        P2=0xf7;
        delay(1);
        P0=tab[sec/10%10];
        if(num==3 && temp==1)        P2=0xff;
        else        P2=0xef;
        delay(1);
        P0=tab[sec%10];
        if(num==3 && temp==1)        P2=0xff;
        else        P2=0xdf;
        delay(1);
}

void displaym()                                         //秒表显示
{
    P0=tab[a/10%10];
        P2=0xfe;
        delay(1);
        P0=tab[a%10];
        P2=0xfd;
        delay(1);
        P0=tab[b/10%10];
        P2=0xfb;
        delay(1);
        P0=tab[b%10];
        P2=0xf7;
        delay(1);
        P0=tab[c/10%10];
        P2=0xef;
        delay(1);
        P0=tab[c%10];
        P2=0xdf;
        delay(1);
}

void T0_int() interrupt 1 using 1                        //中断T0 用于计时
{
   TH0=(65536-25000)/256;
   TL0=(65536-25000)%256;
   count++;
   if((num != 0) && (count % 10 == 0))                //用于调时 数字闪烁
   temp=~temp;
   if(count%10==0)
   LED=~LED;
   if(count==20)
   {
      count=0;         
      sec=sec+1;
          if(sec==60)
          {
             sec=0;
                 min=min+1;
                 if(min==60)
                 {
                    min=0;
                        hour=hour+1;
                        if(hour==24)
                        hour=0;
                  }
           }
        }
}

void T1_int() interrupt 3 using 2        //中断T1 用于 可在时间校准的减 与计时 之间 进行切换
{
   if(cmd != 0)                                //满足条件  T1进入计时功能
   {
      TH1=(65536-5000)/256;
          TL1=(65536-5000)%256;
          if(cmd%2 == 0)
          {
            c=c+1;
            if(c==100)
            {
               c=0;
                   b=b+1;
                   if(b==60)
                   {
                      b=0;
                          a=a+1;
                    }
             }
           }         
        }
   else                                                //不满足秒表条件,进入计数功能
   {
      TH1=0xff;
      TL1=0xff;
      switch(num)
      {
         case 1:hour=hour-1;if(hour<=0) hour=23;break;
             case 2:min=min-1;if(min<=0) min=59;break;
             case 3:sec=sec-1;if(sec<=0) sec=59;break;
             default:break;
           }
        }
}

void I1_int() interrupt 2 using 3                        //外部中断1 用于调时的加  跟秒表的控制
{
   EX1=0;
   switch(num)
   {
      case 0:TMOD=0x11;cmd=cmd+1;break;         //当外部中断未被启用时 进入秒表
      case 1:hour=hour+1;if(hour>=24) hour=0;break;
          case 2:min=min+1;if(min>=60) min=0;break;
          case 3:sec=sec+1;if(sec>=60) sec=0;break;
          default:break;
        }
}

void I0_int() interrupt 0 using 3         //外部中断0 用于校准时间在时、分、秒之间进行切换
{  
   EX0=0;
   if(cmd != 0 &&(a!=0 || b!=0 || c!=0))                //对秒表进行清零
   {
      a=0;b=0;c=0;
        }
   else        if(cmd != 0 &&(a*b*c==0))                                //清零后 退出秒表
   {
      cmd=0;
          TMOD=0x51;
          TH1=0xff;
          TL1=0xff;
        }
   else if(cmd==0)                                                                //调时切换
   {
     temp=1;                                        //启动数字闪烁
     num=num+1;
     if(num==4)
     {
        temp=0;                                        //关闭字符闪烁
        num=0;                                        //推出调时功能
          }
        }
}

void main()                                                                 //主函数
{
        init();
        LED=0;
        while(1)
        {
           if(cmd==0)                                         //如不满足秒表条件 就进入时间显示
           display();
           else
           displaym();
           Bss();
        }                  
}                    

3.4、protues仿真图,及作品成型图

3.4.1 protues 仿真图

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9D89.tmp.jpg

3.4.2实践电路板照片

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DB9.tmp.png
LED数字显示电子时钟正面(关闭)

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DBA.tmp.png
LED数字显示电子时钟正面(开启)

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps9DCB.tmp.png
LED数字显示秒表状态

3.5安装与调试结果:
3.5.1电路安装
    安照电路原理图把元器件安装到已打好的铜板对应的位置,把个元器件固定在铜板后,用导线把对应的元器件的引脚相连接,再用焊锡焊接好即可。注意事项:
   1)元器件的布局应尽量集中,且各个元器件间引脚的连线应尽量短、不弯 曲,跳线尽量少。
   2)各个元器件引脚的焊接不要虚焊。
3.5.2电路调试
    把相应编译好的目标程序代码加载到单片机芯片AT89S51,可接上5V电压源即开始进行硬件电路的调试工作。如果显示结果不符合设计要求,即检查电路各连接点是否正确连接,再次进行硬件电路的调试工作,或是检查代码程序是否符合硬件电路的设计,若有错即进行相应的修改,编译后,再进行硬件电路的调试工作。如此反复操作,直到调试出正确结果。
3.5.3 软件调试
1) 在计算机上运行程序调试软件Keil,进行程序调试。
2)利用Proteus 软件进行仿真模拟。
3)加载程序代码到单片机芯片AT89S51中,进行模拟仿真。若出现错误,查看错误后进行相应修改再进行调试与模拟仿真,直到调试出正确结果。
3.5.4 性能测试
系统上电后进行功能的测试,通过测试观察到,系统上电后数码管上显示时间:11-11-11。通过测试,本作品设计实现了数字电子钟的基本功能,且系统工作稳定。经过全组组员一起调试及验证,计时误差为1.0秒。

.总结:
本次课程设计的题目是LED数字显示电子时钟。经过本组同学的共同努力,终于调试成功,并经过测试数据显示, 系统的可靠性已经基本能够达到实际电子钟的设计要求,同时本单片机数字电子钟系统具有扩展性。
本设计从经济实用的角度出发,采用美国Atmel公司的单片机AT89S51与显示驱动芯片7407作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、电源输入等电路并用C语言编写主控芯片的控制程序,研制了一款可以调时并带有秒表功能的电子时钟。使用单片机制作的电子时钟具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于体育赛事和车站、办公室及家庭等场所,有一定的实用性。此电子时钟严格按照要求设计,基本达到了预期效果,能够正确的显示时分秒的计时,算上是一次比较成功的设计了。
实验中遇到了不少问题,但我们一起改进和综合了如下。
    1.按键问题。此设计中,很多功能选择是通过按键开关实现的。在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间很不方便。于是用软件延时将按键进行两级防抖,从而大大提高了按钮的可操作性。
    2.添加功能问题。此设计中,除了基本的功能外,我们发现没有突出的亮点,于是想到添加一个秒表计时的功能,我们将定时器1进行时分复用,通过按键按下的先后顺序对定时器1的计时或计数进行功能选择,此程序是在调时进行后由开关1控制,进行复位和控制,可以实现叠加计时和清零。
    课程设计是培养学生综合运用所学知识,发现实际问题、提出实际问题、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际学习能力、动手能力的具体训练和考察过程。
在此次数字钟设计过程中, 在学习新知识的同时,把在课程中学到的理论知识运用到实际作品设计、操作中,更进一步地熟悉了单片机芯片的结构及掌握了其工作原理和具体的使用方法与相关元器件的参数计算方法、使用方法,了解了电路的开发和制作及课程设计报告的编写。加深了对相关理论知识及专业知识的掌握度,增强自身的动手能力,锻炼及提高了理解问题、分析问题、解决问题的能力,更深刻的体会到了理论联系实际的重要性。
最后,我们组通过此次单片机课程设计不仅仅将我们一学期在单片机课程上的所学很好的应用到了实际设计中,更是将理论知识应用到了实践中,这才是真正的学习,不仅仅是读万卷书,更要行万里路,讲知识与实践有机的结合。也十分感谢老师为我们提供了这次单片机课程设计的机会,我们也通过此次课程设计,更清晰更实际的接触到了单片机。

参考书目
[1] 蒋辉平,《单片机原理与应用设计》,北京,北京航空航天大学出版社,2007年
[2] 李鸿等,《单片机原理及应用》,长沙,湖南大学出版社,2004年
[3] 楼然苗,李光飞,《单片机课程设计指导》,北京,北京航空航天出版社,2007年
4]  Kenneth A.Reek,《C和指针》,北京,人民邮电出版社,2008年

评分

参与人数 2黑币 +9 收起 理由
小健2333 + 4 很给力!
咩咩杨Ada + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:308885 发表于 2018-4-15 22:06 | 只看该作者
大佬,那个ISIS 软件的电路图有木有呀。菜鸟看不懂程序,猜不到图。
回复

使用道具 举报

板凳
ID:339938 发表于 2018-5-29 07:49 来自手机 | 只看该作者
老哥666666
回复

使用道具 举报

地板
ID:351956 发表于 2018-6-14 20:08 | 只看该作者
大佬还是牛批
回复

使用道具 举报

5#
ID:353236 发表于 2018-6-17 14:25 | 只看该作者
感谢大佬分享
回复

使用道具 举报

6#
ID:363253 发表于 2018-7-2 15:48 | 只看该作者
电路图怎么看?
回复

使用道具 举报

7#
ID:436447 发表于 2018-11-30 12:37 | 只看该作者
大佬,有图吗
回复

使用道具 举报

8#
ID:452824 发表于 2018-12-23 19:47 | 只看该作者
有没有仿真图,Proteus文件
回复

使用道具 举报

9#
ID:454710 发表于 2018-12-25 18:22 | 只看该作者
Proteus仿真图有没有啊大佬,江湖救急
回复

使用道具 举报

10#
ID:446422 发表于 2018-12-26 16:25 来自手机 | 只看该作者
对啊,为什么图片加载不出来????
回复

使用道具 举报

11#
ID:461371 发表于 2019-1-3 22:05 | 只看该作者
学习了,抱拳
回复

使用道具 举报

12#
ID:485191 发表于 2019-3-5 22:08 | 只看该作者
厉害了666
回复

使用道具 举报

13#
ID:617792 发表于 2019-9-29 13:36 | 只看该作者
很给力
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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