基于proteus单片机数字钟论文电子版.docx
- 文档编号:9908678
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:20
- 大小:233.36KB
基于proteus单片机数字钟论文电子版.docx
《基于proteus单片机数字钟论文电子版.docx》由会员分享,可在线阅读,更多相关《基于proteus单片机数字钟论文电子版.docx(20页珍藏版)》请在冰豆网上搜索。
基于proteus单片机数字钟论文电子版
《单片机原理及接口》
课程设计报告
题目:
单片机数字时钟
专业名称:
通信工程
班级:
091
学号:
姓名:
单片机数字时钟
摘要:
设计利用单片机AT89C51为基础,结合proteus和keil软件进行设计此系统,通过七个按键用于调整走时时间和定时时间,三个用于调整走时时间,三个用于调整闹钟闹铃时间,一个用于走时和闹钟的切换。
设计利用内部定时器0进行定时10ms,后通过变量累加到一秒,之后进行秒、分、时的累加。
同时设计利用LED数码管显示时间,P0、P2口做为LED数码管的段选端和位选端。
程序利用C语言进行编写,结合单片机的引脚的以及相关知识完成程序的编写。
运行仿真后,可以显示时钟走时时间,通过按键可以修改时间,以及可以进行手动设置闹钟闹铃时间,同时通过蜂鸣器进行闹铃的效果。
关键字:
单片机;LED数码管;按键;定时;
1设计的基本内容
1.1设计目的
利用所学过的知识,初步分析单片计算机控制系统的能力;综合运用本专业方向所学知识,构成以单片机为核心控制系统的能力;单片计算机具体控制系统软件的设计、编制与调试的能力;单片计算机控制系统综合调整及性能测试的能力;实验结果分析、总结及撰写技术报告的能力。
1.2设计内容
运用所学单片机知识,使用proteus仿真软件和keil软件设计一个数字时钟系统,功能如下:
●能够显示时分秒:
用8位数码管显示6位时分秒和两位“—”符号;
●能够调整时分秒:
利用三个按键调整时分秒的修改;
●能够调到合适的时间:
可以准确修改时间;
●能够手动设置闹钟时间:
利用三个按键调节闹钟闹铃时间;
●能够准确的闹铃设置的时间:
当时钟时间与闹钟设定时间一样时闹铃响;
1.3设计基本环境条件
环境条件:
电脑、软件(keil)、硬件(proteus)组合设计系统
Proteus:
它是目前最好的仿真单片机及外围器件的工具。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。
Keil:
它是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
2设计方案和论证
本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用七个按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易。
主要由四个模块:
键盘、芯片、扬声器、LED显示即可满足设计要求。
2.1方案论证选择
●计时方案
方案1:
采用现成实时时钟芯片
使用一些实时时钟集成电路,如DS1287、DS12887、DS1302等。
这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时等功能,计时数据的更新每秒自动进行一次,不需要程序干预。
因此,在工业实时测控系统中多采用这类专用芯片来实现实时时钟功能。
方案2:
使用单片机内部的可编程定时器。
利用单片机内部的定时计数器进行中断定时,配合软件延时实现时、分、秒的计时。
该方案优点是节省硬件成本,可以利用程序代替。
缺点是程序设计相对较为复杂,精确度不高,同时还可能会和延时冲突,导致显示效果不佳。
●显示方案
对于实时时钟显示有液晶,数码管等显示,因设计要求使用LED数码管显示时钟时间因此选择LED数码管作为显示,。
通常LED数码管显示有两种方式:
动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。
缺点是占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。
适用于电路比较简单,LED数量较少的场合。
LED显示器是由发光二极管显示字段的显示器件。
多位七段LED数码管与单片机连接时将所有LED的段选线并联在一起,由一个八位I/O口控制,而位选线分别由相应的I/O口线控制。
由于所有位的段选码皆由一个I/O控制,因此,在每个瞬间,多位LED只可能显示相同的字符。
要想每位显示不同的字符,必须采用动态扫描显示方式。
即在每一瞬间只使某一位显示相应字符。
在此瞬间,位选控制I/O口在该显示位送入选通电平以保证该位显示相应字符,段选控制I/O口输出相应字符段选码。
如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。
不断循环送出相应的段选码、位选码,就可以获得视觉稳定的显示状态。
其优点是节省I/O口,电路简单。
缺点是程序编写复杂,理解起来比较难。
适合于电路比较复杂,用到I/O比较多的场合。
综上所述,本系统使用单片机本身的定时器进行中断定时,同时显示需要采用8位LED数码管来分别显示时、分、秒,因设计所需要数码管个数较多,如果静态显示时,电路复杂,故本系统选择动态显示方式。
2.2设计原理
设计利用AT89C51单片机为核心,其是一种8位cpu,片内含存储器用于存放程序,2个16位定时计数器用于设定定时时间、32根I/O线用于外设的接口连接。
单片机含有五个中断源,本设计利用定时器0中断源还含有两个优先级、属于一个全双工串行口等,由这些构成一个完整的微型计算机。
其管脚图如图1所示。
图1AT89C51单片机管脚内部结构图
P0口:
可以作为输入/输出口,常作为地址/数据总线口,即低8位地址与数据线分时使用P0口,而高8位地址由P2口输出。
当P0口作I/O使用时要接上拉电阻。
设计用于数码管的段选口。
P1口:
P1口每一位都能作为可编程的输入或输出口线。
设计用于外接按键端口。
P2口:
P2口可以作为输入口或输出口使用,外接存储器和I/O接口时,又作为扩展系统的地址总线,输出高8位地址,与P0口一起组成16位地址总线。
设计用于数码管的位选口。
P3口:
P3口为双功能口。
作为第一功能使用时,功能与P1口相同。
当作为第二功能使用时。
这四个作为输入使用时,均应先对其写“1”,避免误读。
中断是指,单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收事件及外部事件等进行自动的检测判断,当有某个事件产生时,中断管理系统会置位相应标志通知CPU,请求CPU迅速去处理。
CPU检测到某个标志时,会停止当前正在处理的程序流程,转去处理发生的事件,处理完后,再回到原来被中断的地方,继续执行原来的程序。
这个过程称为中断。
C51的中断服务程序是一种特殊的函数,它的说明形式为:
void函数名(void)interruptnusingm
{函数体语句}
这里,interrupt和using是为编写C51中断服务程序而引入的关键字,interrupt表示该函数是一个中断服务函数,interrupt后的整数n表示该中断服务函数是对应哪一个中断源。
通过以上原理介绍,设计使用了P0、P1、P2分别用于外部控制和显示的端口,即为LED数码管显示和按键调整的连接。
同时利用中断源定时器0定时10ms,在定义中断函数时,中断函数的n要写“1”。
3硬件部分设计
3.1硬件总体设计
本次系统设计P0口做LED数码管的段选口,P2口做LED数码管的位选口,P1口做按键的端口P3口的第一位TXD接蜂鸣器。
总体框图如图2所示。
图2设计总框图
3.2RST按键复位电路
本设计采用上电按钮复位电路:
首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位。
EA端接高电平时,先执行片内存储器,超出片内存储器最大值后执行片外存储器。
具体电路如图3所示。
图3按键复位电路
3.3XTAL1、XTAL2构成晶振电路
单片机的时钟信号通常有两种电路形式:
内部振荡方式和外部振荡方式,一般使用内部振荡方式。
在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振),本设计晶振电路采用12M的晶振。
晶振的作用是给单片机正常工作提供稳定的时钟信号。
在准许的范围内,晶振越大,单片机运行越快,电容范围在20-40pF之间,这里连接的是22pF的电容。
具体电路如图4所示。
图4晶振电路
3.4LED显示电路
在本设计方案中,运用了6个LED数码管来显示数字时钟的时分秒,P0口用于接LED数码管的段选端,P2接LED数码管的位选端,P0用于送要显示的内容,P2用于要亮的LED数码管的个数。
利用动态显示方式不断循环送出相应的段选码、位选码,就可以获得视觉稳定的显示状态。
具体电路如图5所示。
图5数码管显示
3.5按键控制电路
键盘部分采用普通的按键进行设计,有7个按键控制电路,三个用于数字中的调时,三个用于闹钟设置,一个用于走时与闹钟设置的切换开关。
各个键的功能见表1和硬件电路见图6。
表1S1~S7功能表
按键
功能
S1
LED数码管显示走时时间时,调整走时按键,进行秒加1。
S2
LED数码管显示走时时间时,调整走时按键,进行分加1。
S3
LED数码管显示走时时间时,调整走时按键,进行时加1。
S4
LED数码管显示闹钟时间时,调整闹钟时间按键,进行秒加1。
S5
LED数码管显示闹钟时间时,调整闹钟时间按键,进行分加1。
S6
LED数码管显示闹钟时间时,调整闹钟时间按键,进行时加1。
S7
功能切换键,LED显示时钟正常行走与闹钟显示之间的切换。
图6按键控制电路
3.6蜂鸣器电路
电路接法:
三极管选定PNP型,基极B连接P30口,电源连接蜂鸣器后接到三极管的C极。
单片机在复位后的个I/O口是低电平,此时三极管是截止的,编写程序使选定的I/O为高电平,此时三极管导通,导通后蜂鸣器与电源正极连通,构成一个工作回路,从而发出滴滴的响声,PNP
三极管起到模拟开关的作用。
具体见图7所示。
图7报警器电路
3.7总体电路设计
通过以上的各个电路的组合后,设计出数字时钟的总体电路框图结构如图8所示。
图8数字时钟的总体电路
4软件流程说明
4.1总体程序流程图
单片机定时闹钟系统由多个函数构成,其中包括主函数,中断函数,显示函数,延时函数,按键扫描函数和闹钟闹铃函数等。
首先是定义所用到的I/O端口名,以及定义时钟的hour、minute、second变量和闹钟的hour1、minute1、second1变量,之后是定义延时函数,用于按键消抖和动态显示的。
显示函数用到动态显示,主要是送位选和段选码,之后进行延时,达到动态显示。
按键扫描函数主要由if函数组成,通过不断判断按键是否按下来确实按键的开断。
中断函数用于当中断触发后对定时器时间进行累加到秒后,再对时钟分和时的累加。
闹钟闹铃函数是当设置闹钟时间到后去控制蜂鸣器的响。
主函数由开中断开关和定时开关,之后是不断循环显示函数和按键扫描函数的判断,最后是闹钟闹铃函数组成。
显示函数要放在中断函数里面,因为程序的执行需要时间,当放在主函数时候会和定时时间冲突,会影响效果,所以放到中断函数里面。
图9单片机定时闹钟软件系统程序框图。
图9总体程序流程图
4.2定时程序设计
本次设计实验使用T0计时器,首先,设定TR0=1,启动T0开始计时。
由于单片机所定时间最长为100ms(频率fosc为12MHz,工作方式1时),为了达到一秒效果后进行时钟正常行走,应定义一个变量,累加后进行秒加。
设计通过单片机内部定时器0定时10ms后,通过设置变量加加,累加100次后,刚好产生1秒,然后进行秒加加,当加到60秒后,秒清零,分加加,当分加到60时,分清零,时加加,当时加到24时,时清零,之后秒加加,以此循环。
图10定时程序设计
4.3按键扫描设置
本设计设计了7个控制开关,分别是控制走时的秒、分、时和闹钟的秒、分、时,以及切换是设置走时还是闹钟的开关,当S7按下后,调节S4、S5、S6用于设置闹钟的时间,否则调节S1、S2、S3用于设置走时的时间。
图11按键设计流程图
5过程设计仿真调试
5.1调试过程
本系统在proteus中进行仿真,选择了led数字显示器,I/O接控制调节的开关,然后选择80C51CPU进行代码程序编辑。
将所编程序在KEIL软件里进行编译,编译正确后生成HEX文件。
在AT89C51芯片中加载此文件后,进行仿真调试。
具体步骤为:
新建一个keil项目首先打开uVision4,在Project下点击NewuVisionproject,跳出一个窗口,输入文件名保存后跳出
窗口,选择Atmel下的AT89C51,之后点击界面左上角
新建一个文件,出现一个Text1界面,代码输入后点击
保存,在
中的SourceGroup1右击出现
将文件名命名,注意文件名后缀必须是.c。
打开Target的OptionforTarget,选择
,将XTAL里面改为12.0MHZ,同时将CreateHEXFile打钩,点击OK,这样才能产生.hex文件。
最后分别点击
这三个,检查程序是否有误,并进行编译,生成hex文件。
打开
就可以打开proteus仿真电路软件界面。
在界面的左上角
单击,跳出一个选择元器件的窗口,选择所需要的器件连接后,点击左上角的
将文件保存,完成proteus电路图的连接。
在电路图中双击AT89C51,弹出一个
界面,单击
将上面生成的hex文件添加到AT89C51芯片中,之后点击界面左下方的按钮
,这样之后进行仿真,可以对程序进行调试以及看调试效果图。
5.2调试结果
系统运行后,能准确的显示时间,开始时时钟时间为12-12-12,可以通过S1、S2、S3三个按键对时间进行修改,具体显示见下图12所示。
初始值显示时间按键调整后时间
图12走时初始值和调整后对比
当S7按下后,初始值显示为00-00-00,可以通过S4、S5、S6三个按键对闹钟时间进行调整,具体显示见下图13所示。
初始值显示时间调整后闹铃时间
图13闹钟初始值和调整后对比
当设置的闹钟时间和走时时间相同时,蜂鸣器响铃,具体见图14所示。
图14走时时间和设定闹钟时间一样
6设计总结与体会
6.1该系统的优点
●时钟的运行不因切换至闹铃,闹钟调时时钟正常走时。
●按键功能清楚,各个按键功能都有效。
●数字时钟走时跟实际走时基本接近,精确度高。
●能够准确闹铃,且响铃声音跟时间闹铃声相似。
6.2该系统主要缺陷
●程序中大量的应用if语句,显得程序较长,不过用if就是理解起来比较容易。
●按键用了多了点,其实可以把控制显示时钟,闹钟,秒表的三个按键合并成一个,用状态变量标识。
6.3实验中遇到的问题及解决方法
设计过程中遇到了较多的小问题,其中下面几个小问题困扰了较久。
●开始时数码显示的闪烁很严重,原因是在主函数里用了太长的延时了,而又把扫描放在主函数里。
解决方法是把扫描的程序放到中断函数中,因为中断时间定的很短,所以每次扫描的间隔时间很短,就能消除闪烁的现象。
●按键按下后调时的时间调的太快了,根本不是按一次加一次的。
解决方法是把延时时间变小点,且把定时时间设小点,这样按键就能正常按下了。
6.4设计心得
回顾起此次单片机课程设计,从选题到定稿,从理论到实践,可以说得是有苦有甜,但是从中却学到很多很多的的东西,不但巩固了以前所学过的知识,而且对单片机原理课外知识也得到了拓展。
做的过程中,开始的确遇到了不少困难的问题,比如说按键按下后显示会抖动,以及按键按下后次数加了太快了等,同时在这过程中也发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
通过单片机设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我们还学会了如何去培养创新精神和严谨的科学作风,学会了自己去找出错问题的原因,以及查阅资料,从而不断地战胜自己,超越自己。
更重要的是,我在这一设计过程中,学会了坚持不懈,绝不放弃,相信坚持下去就能成功。
参考文献:
[1]李群芳,张士军,黄建.单片微型计算机[M].北京:
北京出版社,2008.
[2]杨居义.单片机课程设计指导[M].北京:
清华大学出版社,2009.
附录:
#include"reg52.h"
#defineucharunsignedchar
sbitP10=P1^0;//定义开关S1
sbitP11=P1^1;//定义开关S2
sbitP12=P1^2;//定义开关S3
sbitP13=P1^3;//定义开关S4
sbitP14=P1^4;//定义开关S5
sbitP15=P1^5;//定义开关S6
sbitP16=P1^6;//定义开关S7
sbitP30=P3^0;//定义蜂鸣器
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,//定义0~9和“-”的代码
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
ucharaa[]={0,0,0,0,0,0,0,0};//位选显示数组
ucharsecond=12,minute=12,hour=12;//初始时钟显示
ucharsecond1=00,minute1=00,hour1=00;//初始闹钟显示
uchartemp;//用于位选移位变量
ucharnum=0;
inta=-10000;//定时10ms初始值
voiddelay(unsignedintz)//延时1ms函数
{unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
voidkeyscan();
voidxianshi();
voidtimer0()interrupt1//中断函数
{TH0=a/256;//定时器高位
TL0=a%256;//定时器低位
xianshi();
num++;//变量累加
if(num==100)//定10ms,变量累加,加到20后1s时,秒计数。
{num=0;
second++;}
if(second==60)//秒到60清零,分累加
{second=0;
minute++;
if(minute==60)//分到60清零,时累加
{minute=0;
hour++;
if(hour==24)//时到24清零
{hour=0;}}}}
voidkeyscan()//按键扫描函数
{if(P10==0)//判断S1开关
{delay
(1);//延时防抖动
if(P10==0)
{second++;}
if(second==60)//当秒到60时,清零,分加加
{second=0;
minute++;}
while(P10==0);}
if(P11==0)//判断S2开关
{delay
(1);
if(P11==0)
{minute++;}
if(minute==60)//当分到60时,清零,时加加
{minute=0;
hour++;}
while(P11==0);}
if(P12==0)//判断S3开关
{delay
(1);
if(P12==0)
{hour++;}
if(hour==24)当时到24时清零
{hour=0;}
while(P12==0);}
if(P13==0)//判断S4开关
{delay
(1);//延时防抖动
if(P13==0)
{second1++;}
if(second1==60)//当闹钟秒到60后清零,分加加。
{second1=0;
minute1++;}
while(P13==0);}
if(P14==0)//判断S5开关
{delay
(1);
if(P14==0)
{minute1++;}
if(minute1==60)//当闹钟分到60后清零,时加加。
{minute1=0;
hour1++;}
while(P14==0);}
if(P15==0)//判断S5开关
{delay
(1);
if(P15==0)
{hour1++;}
if(hour1==24)//当闹钟时到24后清零
{hour1=0;}
while(P15==0);}}
voidxianshi()//时钟显示函数
ucharz;
{if(P16==1)//闹钟设置开关没按下时
{temp=0xfe;//第一个亮
aa[0]=hour/10;//用于显示时高位
aa[1]=hour%10;//用于显示时低位
aa[2]=10;//用于显示“—”
aa[3]=minute/10;//用于显示分高位
aa[4]=minute%10;//用于显示分低位
aa[5]=10;//用于显示“—”
aa[6]=second/10;//用于显示秒高位
aa[7]=second%10;}//用于显示秒低位
else
{temp=0xfe;
aa[0]=hour1/10;//用于显示闹钟时高位
aa[1]=hour1%10;//用于显示闹钟时低位
aa[2]=10;//用于显示“—”
aa[3]=minute1/10;//用于显示闹钟分高位
aa[4]=minute1%10;//用于显示闹钟分低位
aa[5]=10;//用于显示“—”
aa[6]=second1/10;//用于显示闹钟秒高位
aa[7]=second1%10;}//用于显示闹钟秒高位
for(z=0;z<8;z++)//循环8次
{P2=temp;//送位码
P0=table[aa[z]];//送段码
delay
(1);
temp=P2<<1|0x01;}}//位码左移一位,逐个显示
voiddingshi()//闹钟闹铃函数
{if(num<30&&minute==minute1&&hour==hour1)
{P30=1;}//蜂鸣器响
elseP30=0;}
voidmain()//主函数
{TMOD=0x01;//定时方式1
TH0=a/256;//定时器高位
TL0=a%256;//定时器低位
EA=1;//开总中断
ET0=1;//开定时0中断
TR0=1;//启动定时器
while
(1)
{xianshi();//调用显示函数
keyscan();//调用按键扫描函数
dingshi();}}//调用闹铃函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 proteus 单片机 数字 论文 电子版