湖北民族学院课程设计报告数字时钟设计与仿真课程:电子线路课程设计专业:电子信息科学与技术班级: 0312409学号: 031240910学生姓名:谢加龙指导教师:易金桥2014年 06月 21日信息工程学院课程设计任务书2014-06-21摘要基于单片机AT89c51设计而成的简易数字电子时钟,其主要功能皆由对单片机编程即由软件完成,外围硬件电路只包括报时电路、键盘输入电路和显示电路三个模块。
具有外围硬件电路简单、运行功能可靠的优点。
关键词:单片机时钟键盘输入显示目录1、系统设计要求 (1)1.1 基本功能 (1)1.2扩展功能 (1)2、硬件设计 (2)2.1系统设计方案选择 (2)2.2系统原理框图 (2)2.3各单元的功能描述 (2)2.4电路连接图 (2)2.5元器件清单列表 (2)2.6所用芯片的管脚图 (2)3、软件设计 (3)3.1主程序的流程图 (3)3.2键盘扫描程序流程图 (3)3.3发声程序流程图 (3)3.4总程序 (3)4、调试 (4)4.1仿真调试 (4)4.2硬件调试 (4)5、总结 (5)参考文献 (6)1、系统设计要求1.1 基本功能(1)、要求准确显示“时”、“分”、“秒”,24 小时制;(2)、具有整点报时功能,在每小时59 分51 秒、53 秒、55 秒、57 秒发出低音,59秒整发出高音;(3)、系统工作符合一般时钟要求。
1.2扩展功能:(1)、具有校时功能,用户可修改“时”、“分”,且互不影响;(2)、可切换12 小时制和24 小时制。
2、 硬件总体设计方案2.1系统设计方案选择本次设计时钟电路,最初的设想方案是用AT89C51单片机芯片控制外围电路,用6位共阴数码管显示时间,用上拉电阻来驱动数码管的显示,用按键来调时和实现12小时制和24小时制的转换,用喇叭进行整点报时,单片机编程用汇编语言。
但由于在编程过程中,汇编语言指令多、编程难,因此改为用C 语言编程。
在用C 语言编程来实现用按键转换12小时制和24小时制的时候遇到了困难,因此又把按键改为开关。
另外学校只有4位和2位及1位的共阳数码管,因此又把6位共阴数码管换掉,同时接受老师的建议,把数码管的驱动电路改为数码管的段选用74LS245来驱动,位选用74LS04驱动。
最后在领元件的时候老师说单片机也不能驱动喇叭,把喇叭换成蜂鸣器。
因此我们最后的方案是:使用AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂;使用键盘键上的按键来调整时钟的时、分以及键盘上的开关实现12小时制和24小时制的转换;用一蜂鸣器来进行整点报时;同时使用C 语言编程,使得编程变得更容易;用一个4位和一个2位共阳数码管来显示时间,且数码管的段选用74LS245来驱动,位选用74LS04驱动。
这样通过四个模块:键盘、单片机芯片、蜂鸣器、数码管显示即可满足设计要求。
2.2系统原理框图此电路包括以下四个部分:单片机,键盘,报时电路及显示电路。
设计原理框图如图3-1所示图3-1 设计原理框图2.3各单元的功能描述(1)对单片机进行编程,使主要功能由软件控制实现,从而简化硬件电路。
(2)单片机通过程序控制输出各种电脉冲信号来驱动数码管以及报时电路的正常工作。
(3)单片机通过对端口高低电平的扫描从而判断键盘的工作情况,键盘通过单片机输出来影响显示电路和报时电路的工作。
整个电路的工作流程为:单片机内部计数器持续计数,得到的数据通过程序的控制转化成时间,并通过对输出端口输出不同的高低电平来控制数码管和蜂鸣器的工作。
与此同时,单片机还在不停地扫描连接键盘的输入端口,通过得到输入端口的不同电平来判断键盘的工作情况,再通过程序的控制来影响数码管和蜂鸣器的工作。
2.4电路连接图设计的电路主要由四模块构成:单片机控制电路,显示电路、报时电路以及调时电路。
详细电路功能图如图3-2:23图3-2 详细电路功能图该电路的单片机复位采用上电复位,即给电路一通电,电路就从程序最初设置的状态开始工作。
为了方便检测报时,我们把时钟的初始值设为00点59分48秒,当电路一通电,数码管就显示此值,三秒后蜂鸣器开始发音报时,并按59 分51 秒、53 秒、55 秒、57 秒发出低音,59秒整发出高音的规律发音。
图中三个按键开关从上到下一次为小时加1、分钟加1按键和12/24转换开关,即按一下小时加1或分钟加1按键则小时或分钟自动加1,按下进制转换开关为12进制,断开进制转换开关为24进制.2.5元器件清单列表2.6所用芯片的管脚图4位共阳数码管引脚图74LS04管脚图74LS245管脚最后实物图3、软件设计流程及描述3.1主程序的流程图程序设计的总体思路是:首先在主程序里初始化单片机的计数器,使单片机计数器一直计数,然后给主程序设定一个死循环,在这个死循环里,主程序在不断地调用键盘扫描、显示和发音三个子程序,而时钟功能在子程序中设计完成。
主程序的流程图如图4-1所示。
图4-1 主程序流程图3.2键盘扫描程序流程图小时加1按键定义在单片机的P3^0端口,分钟加1按键定义为P3^1端口,12/24转换开关定义为P3^2端口。
单片机端口默认输出为高电平,当按一下小时(分钟)加1键时,延时10ms,此时单片机端口与地相连,呈低电平,单片机检测到该电平时,对小时(分钟)加1。
同理,按下12/24转换键,延时10ms,P3^2端口为低电平,单片机检测到该电平时,把时间转化为12小时制并通过显示电路显示出来。
其流程图如图4-2所示。
Y Y Y图4-2键盘扫描流程图3.3发声程序流程图蜂鸣器低电位端通过三极管连接到单片机的P3^3端口,高电位端接一5v电压。
单片机端口默认输出为高电平,当单片机检测到已符合报时条件时,给P3^3端口取反,使其变为低电位,蜂鸣器导通,根据程序中定义的不同频率而发出不同的高低音。
其流程如图4-3所示。
3.4总程序#include<reg51.h>sbit BUZ =P3^3;sbit HOURADD=P3^0;//小时加1sbit MITADD=P3^1;//分钟加1sbit change=P3^2;//进制转换unsigned int tmcnt;//定时器计数unsigned int h=0,m=59,s=50;//h为小时,m为分钟,s为秒钟unsigned char code seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9码值unsigned char code disp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位扫描unsigned char data disdata[6];void Delayms(int ms) //延时函数{while(ms){unsigned char i;for (i=0; i<120; i++);ms--;}}void display()//扫描显示{ unsigned char i;disdata[0]=h/10;//数据处理,小时高位disdata[1]=h%10;//小时低位disdata[2]=m/10;//分钟高位disdata[3]=m%10;//分钟低位disdata[4]=s/10;//秒钟高位disdata[5]=s%10;//秒钟低位for(i=0;i<6;i++)//循环显示{P1=0xff;P1=seg7[disdata[i]];P2=disp[i];Delayms(2);//显示延时}}void time0(void)interrupt 1 using 0 //时间计数函数{TH0=0xfc;//计数器高八位赋初值TL0=0x18;//计数器低八位赋初值if(++tmcnt==1000)//计数1000次1秒{tmcnt=0;s++;if(s==60){s=0;m++;if(m==60){m=0;h++;if(change==0&&h==12)//按下进制转换键为12进制{h=0;}if(change==1&&h==24)//未按下进制转换键为24进制{h=0;}}}}}void voice()//发声函数{if((m==59)&&(s==51))//判断时间符合低音条件{BUZ =~BUZ;Delayms(80);}if((m==59)&&(s==53))//判断时间符合低音条件{BUZ =~BUZ;Delayms(80);}if((m==59)&&(s==55))//判断时间符合低音条件{BUZ =~BUZ;Delayms(80);}if((m==59)&&(s==57))//判断时间符合低音条件{BUZ =~BUZ;Delayms(80);}if((m==59)&&(s==59))//判断时间符合高音条件{BUZ =~BUZ;Delayms(55);}}void keyscan()//键盘扫描{if(change==0)//判断是否按下进制转换键,{Delayms(10);if(change==0&&h>=12)//若h>12,则执行h-12,转换成12进制{ h=h-12;}}if(HOURADD==0)//判断是否按下小时加1键{Delayms(10);if(HOURADD==0){while(HOURADD==0);h++;if(h==24){h=0;}}}if(MITADD==0)//判断是否按下分钟加1键{Delayms(10);if(MITADD==0){while(MITADD==0);m++;if(m==60){m=0;}}}}main(){ unsigned int time();TMOD=0x01;//软件启动计数器、工作方式为方式1 EA=1;ET0=1;//允许定时计数器中断TR0=1;//启动计数while(1){ keyscan();//扫描键盘display();//显示voice();//发声}}4、调试4.1仿真调试4.1.1共阳数码管的显示的调试我们最开始用的数码管是共阴数码管,由于所领元件为共阳,于是将程序中的共阴段选码改为共阳段选码,编译后重新仿真。
但共阳数码管不显示,我们怀疑位选也需要改变,但是通过查阅大量资料,我们组员一致认为跟位选无关。
通过多次试验性的调试无果之后,我们给单片机重新加载了一次程序,怀着不报任何希望的心情再次调试,这次居然成功了。
从共阳数码管的显示的调试中,我们认识到:每次修改了程序之后要重新加载一次程序,否则单片机运行的仍然是未修改之前的程序。