资源预览内容
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Proteus 仿真大赛 电 子 时 钟 仿 真 第一章电子时钟总体设计 1.1电子时钟简介 电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟 相比,它具有走时准确、 显示直观、无机械传动装置等优点, 因而得到广泛应用。 随着人们生活环境的不断改善和美化,在许多场合都用到电子时钟。 很多单片机产品具有实时时钟的功能,例如智能化仪器仪表、 工业过程系统 及家用电器等。这里要现一个具有实时时钟显示和闹钟控制功能的数字钟。 通过数字钟的设计与制作,将前面所学的单片机部定时资源、I/O 端口、键盘和 显示接口等知识融会贯通, 锻炼独立设计、 制作和调试应用系统的能力,深入领 会单片机应用系统的硬件设计、 模块化程序设计及软硬件调试方法等,并掌握单 片机应用系统的开发过程。 1.2 电子钟设计要求 设计并制作具有如下功能的数字钟: (1) 自动计时,由 6 位 LED 先四起显示时、分、秒。 (2) 具备校准功能,可以设置当前时间。 (3) 具备定时启动功能,可以设置闹钟时间,启闹10s后自动关闭闹铃。 1.3 电子钟计时方案 (1)采用实时时钟芯片。针对应用系统对实时功能的普遍需求,各大芯片生产 厂家陆续推出了一系列实时时钟集成电路,如DS1287、DS12887、DS1302、 PCF8563、S35190等。这些实时时钟芯片具备年、月、日、时、分、秒、计时功 能和多点定时功能, 计时数据每秒自动更新一次,不需程序干预。 单片机可通过 中断或查询方式读取计时数据。实时时钟芯片的计时功能无须占用CPU 时间, 功能完善, 精度高,软件程序设计相对简单, 在实时工业测控系统中多采用这一 类专用芯片来实现。 (2) 软件控制。利用 AT89S51 部定时 /计数器进行中断定时, 配合软件延时、 分、 秒的计时。该方案节省硬件成本,且能够使读者对前面所学知识进行综合运用, 因此,本系统设计采用这一方案。 1.4 电子钟显示方案 (1)利用串行口扩展LED,实现 LED 静态显示。 该方案占用单片机资源少,且静态显示亮度高,但硬件开销大,电路复杂,信息 刷新速度慢,比适用于单片机并行口资源较少的场合。 (2)利用单片机并行I/O 端口,实现 LED 动态显示。 该方案直接使用单片机并行口作为显示接口,无须外扩接口芯片, 但占用资源较 多,且动态扫描显示方式需占用CPU 时间。在非实时测控或单片机具有足够并 行口资源的情况下可以采用。 这里采用动态显示方案。 第二章硬件描述及系统设计构思 2.1 电子时钟功能模块 2.2 系统硬件描述 1控制器用 AT89S51 , 12M 晶振 2数码管动态扫描驱动P2口 3数码管段码驱动 P1口 4闹铃驱动 P1.0 5调整键 K1P3.2(外部中断 0, 正常、调时、调分、调秒 ) 6定时 /正常切换键 K2P3.3 7时间参数低位加1 键 K3P3.4 8时间参数高位加1 键 K4P3.5 2.3 系统设计构思 1主流程是取时间参数,显示时间参数。 主程序 函数 LED 显示 函数 键盘 检测 函数 查值 函数 加 1 修改 功能 函数 闹钟 设置 函数 时钟 设置 函数 定时 器中 断函 数 闹钟 判断 启动 函数 2利用 T0 中断来完成计时、比较定时时间、驱动闹铃。 3利用 T1 中断完成动态显示中,调整时间闪烁效果的定时。 4利用外部中断 0 来完成调整选择功能。 5利用外部中断 1 完成定时显示,当前时间显示的切换 6K3、K4 键完成时间参数的循环加1 操作 如图为电子时钟电路原理图 2.4 电子时钟电路原理图 第三章电子钟硬件介绍 3.1 单片机的介绍 单片机也被称为微控制器(Microcontroller Unit) ,常用英文字母的 缩写 MCU 表示单片机,它最早是被用在工业控制领域。它不是完成某一个 逻辑功能的芯片, 而是把一个计算机系统集成到一个芯片上。相当于一个微 型的计算机,和计算机相比,单片机只缺少了I/O 设备。概括的讲:一块 芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用 和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构 的最佳选择。 单片机芯片 单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的 功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能 做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用 美国 50 年代开发的74 系列,或者60 年代的 CD4000系列这些纯硬件来搞 定的话,电路一定是一块大PCB板!但是如果要是用美国70 年代成功投放 市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的 程序可以实现高智能,高效率,以及高可靠性! 3.2 数码管的工作原理 a.七段数码管分共阳管和共阴管,使用时要注意区分,本项目使用共阳数码管。 即公共端接正极。数码管引脚示意图如下: b.该电路使用芯片74LS244来驱动发光两极管, 74LS244 芯片说明书如下,使用 时注意判断芯片的引脚号,引脚示意图如下: c.人眼的视觉暂停时间大约是0.02 秒,当画面每秒变化超过24 帧时, 人眼会将这些快速变动的画面视作连续画面。数码管动态显示正是利用了人的 这一特性。 34 a bf c g d e d p d p c 79 af 8 3 g 1 0 c o m 6 b 45 c o m 21 d e 第四章控制系统的软件设计 4.1 程序设计 本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、 闹钟设置程序四大模块。在程序设计过程中,加强了部分软件抗干扰措施,下 面对部分模块作介绍。 /*数字钟程序 */ #include #define uchar unsigned char sbit buzzer=P27; /定义蜂鸣器控制端口 /*函数声明 */ void display(uchar *p); uchar keyscan(); /扫描键盘有无键按下 uchar search(); /按键识别 void alarm(); /闹钟判断启动 void ftion0(); /时钟修改 void ftion1(); /闹钟修改 void cum(); /加 1 修改 /*全局变量定义*/ uchar clockbuf3=0,0,0;/存放时钟时分秒的十进制数 uchar bellbuf3=0,0,0;/存放闹钟时分秒的十进制数 uchar msec1; /10ms 中断次数 uchar msec2; /1s 循环次数 uchar timdata,rtimdata; /时钟和闹钟修改位置标志 uchar count; /闹钟启动后10s计时单元 uchar *dis_p; /显示缓冲区指针 bit armbit;/ 闹钟标志,为0 闹钟未设定,为1 已设定 bit rtimbit;/ 闹钟是否启动标志,为1已启动 bit rhourbit;/ 闹钟小时修改标志,为1 正在修改闹钟小时 bit rminbit;/ 闹钟分修改标志,为1 正在修改闹钟分 bit hourbit;/ 时钟小时修改标志,为1 正在修改时钟小时 bit minbit;/ 时钟分修改标志,为1 正在修改时钟分 bit secbit;/ 时钟秒修改标志,为1 正在修改时钟秒 /*主函数 */ void main() uchar a; armbit=0; /清零闹钟标志位 msec1=0; /设置 10ms 中断次数初值 msec2=0; /设置 1s 中断次数初值 timdata=0; / 时钟容修改位置记忆单元清零 rtimdata=0;/ 闹钟容修改位置记忆单元清零 count=0; /闹钟启动后保持10s 计时单元清零 TMOD=0 x02; / 定时器 T0 为工作方式2 TL0=0 x06; /定时初始值为250us TH0=0 x06; EA=1; /中断总允许位开启 ET0=1; /定时器 1 开中断 TR0=1; /启动定时器T0 dis_p=clockbuf;/ 将时钟值所在地址送入显示指针 P1=0 x00;buzzer=0; while(1) a=keyscan(); /调用键盘扫描子程序 if(a=0 x07) display(dis_p);/ 无键输入调用显示程序 if(armbit=1)alarm();/ 判断闹钟设定否,若设定则调用闹钟启动函数 else display(dis_p);/ 调用显示子函数作为延时去抖动 a=keyscan(); if(a!=0 x07) /没有抖动,表示有键按下 a=search(); /调用查键值子函数 switch(a) case 0 x00:ftion0();break;/ 是时钟参数修改功能键,调用时钟设置子函数 case 0 x01:ftion1();break;/ 是闹钟参数修改功能键,调用闹钟设置子函数 case 0 x02:cum();break;/是加 1 功能键,调用加1 修改功能子函数 default:break; /*6位 LED 显示函数 */ void display(uchar *p) uchar buffer6=0,0,0,0,0,0; uchar k,i,j,m,temp; uchar led=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f; buffer0=p0/10; buffer1=p0%10; buffer2=p1/10; buffer3=p1%10; buffer4=p2/10; buffer5=p2%10; for(k=0;k2;k+) temp=0 x01; for(i=0;i6;i+) j=bufferi; P0=temp; P1=ledj; /P1 送断码 temp=1; for(m=0;m100;m+);/ 每一位显示延时 P1=0 x00; /关显示 /*键盘扫描函数*/ uchar keyscan() uchar c; P0=0 xf0; c=P2; c=c/ 按键行输入为P2.0-P2.2,屏蔽无关位 return(c); /*查键值函数 */ uchar search() uchar a,b,c,d,e; /P2=0 xfe; c=0 xfe; /首列扫描字送变量c a=0; /首列号送a while(1) P0=c; /列扫描字送P0 口 d=P2; /读入 P2口的行状态 if(dbreak;/第 0 行有键按下,第0 行行首号送b else if(dbreak;/第 1 行有键按下,第1 行行首号送b else if(dbreak;/第 2 行有键按下,第2 行行首号送b a+; /扫描列号加1 c=1; /修改列扫描字,扫描下一列 e=a+b; /将行首号与列号相加,求键号 dodisplay(dis_p); while(d=keyscan()!=0 x07);/等待释放按键 return(e); /*闹钟判断启动函数*
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号