51单片机课程设计数字时钟设计

上传人:m**** 文档编号:447942516 上传时间:2022-11-02 格式:DOC 页数:36 大小:142.02KB
返回 下载 相关 举报
51单片机课程设计数字时钟设计_第1页
第1页 / 共36页
51单片机课程设计数字时钟设计_第2页
第2页 / 共36页
51单片机课程设计数字时钟设计_第3页
第3页 / 共36页
51单片机课程设计数字时钟设计_第4页
第4页 / 共36页
51单片机课程设计数字时钟设计_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《51单片机课程设计数字时钟设计》由会员分享,可在线阅读,更多相关《51单片机课程设计数字时钟设计(36页珍藏版)》请在金锄头文库上搜索。

1、福州大学MCS-51单片机课程设计题 目: 数字时钟 姓 名: 学 号: 学 院: 电气工程与自动化学院 专 业: 电机电器 年 级: 2009 起讫日期: 2012.04.10 2012.5.8 指导教师: 蔡逢煌 目 录1、课程设计目的22、课程设计题目和实现目标23、设计方案34、Proteus仿真原理图55、程序流程图56、程序代码57、调试总结358、设计心得体会359、参考文献351、课程设计目的MCS-51单片机课程设计是与MCS51单片机课程相配套的实践教学环节。MCS51单片机是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培

2、养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。通过课程设计,掌握以下知识和技能:1 单片机应用系统的总体方案的设计;2 单片机应用系统的硬件设计;3 单片机应用系统的软件程序设计;4 单片机开发系统的应用和调试能力 2、课程设计题目和实现目标 2.1课程设计题目.智能电子钟设计 要求:1.能正确显示日期、时间,并且可修该; 2.具有闹铃的功能; 3、秒表功能; 4、数码显示当前温度; 2.2实现目标使用时钟芯片ds1302实现对时间、日期的计时功能。使用lcd1602液晶显示屏来显示时钟

3、芯片内部的计时情况。同时闹钟、温度显示、秒表功能也使用液晶屏显示。最终实现的效果是显示屏第一行显示年月日和星期,第二行显示小时、分钟、秒,以及温度值。在经行闹钟设置时,闹钟显示在显示屏第二行,同样秒表功能也显示在第二行。正常时间、闹钟和秒表三个功能通过按键切换,分别显示于显示屏第二行。闹钟通过闹钟程序实现,当所设闹钟与计时时间相同时,蜂鸣器发出滴滴声。秒表的设计是通过使用芯片内部定时器0作为计时时基,结合中断程序和按键实现秒表启动、停止和清零的效果。温度测量使用芯片ds18b20,读出的温度在lcd上显示,且具有实时显示测量的功能。能实现显示两位的正温度,并可以在程序内部设置一个温度最大值,当

4、所测温度超过最大值时,LED小灯闪亮以作为报警提示。3、设计方案设计的总体思路是时钟芯片1302的数据采集出来以后送入单片机,经过转码以后再送入lcd液晶屏显示。同理18b20所测量的温度通过但数据线送入单片机,经过转码以后送入显示屏,与时间日期同时显示在显示屏上。具体的设计方案如下:1602由两行每行十六个显示点阵组成,有八根数据传输线,三根控制线分别为选通位RS,使能位E,读状态位WR。另外还需外接电源线和地线。在操作过程中首先要注意的一点是由于只有一根指令传输的接线,因此指令数据是一位一位经行传输的。在对显示屏经行操作时,首先要对显示屏经行初始化,设置基本参数。之后再程序中经行操作就可以

5、只写控制字和数据。每显示一个数据都需要先给出数据要显示的地址,之后再传输数据。对显示屏经行写指令操作时要保持RS低电平RW低电平、E高脉冲。而在写入数据时要保持RS高电平、RW低电平、E高脉冲。将时钟芯片里的每一位数据送入单片机内部寄存器ACC中的地位,然后每取一位数据ACC左移一位,这样去除一个八位数据为一次读取时间。同样向时钟芯片送数据时也是通过将要写入的内容先存入ACC然后每次写入地位数据,写完一位就右移一位。初始化完成后,每次与时钟芯片通信都先写入要通信的地址,再读写数据。从时钟芯片中读出或者写入的数据是BCD码,因此需要有一个转码过程。这里我在写入数据时设计了一个十六进制数转为BCD

6、码的程序“bcd()”,转码完成后可以使用一个传输写入的程序writeto1302来写入数据,而读出时,在读出程序readfrom1302中直接加入了BCD转十六进制的语句。转码结束后数据存入数组time以便经行进一步的处理。因为lcd显示的是ASC码,且每一位显示一个数字,因此这里要对十六进制数分离并变成ASC码的相应值。与上述过程相对的是,在每次修改时间的时候,因为此时始终芯片还在工作,因此这个时候需要先停止读入时钟值,我在程序中通过设置一个标志位flag来实现控制,判断标志位的值来控制时间数据的读入。同时在更改数据结束后需要先将更改的结果送入到时钟芯片中,此过程相当于对时钟芯片再次赋值,

7、然后时钟芯片就会在所赋值的基础上继续工作,这样就达到了我们想要的修改时间的效果。对于温度的处理类似于时间的处理。温度芯片18b20也只有一条数据线,因此使用时间传输时同样的方式,每次读写八位数据组成一字节的数据。通过阅读温度测量芯片的数据手册,可以发现温度转化完成后从芯片中读出两个字节的数据,两字节数据组成了十六位的温度数字值。该值中高五位表示温度的正负,第四位表示温度的小数值。因为在我设计的程序中我只要求显示两位的正温度值,因此这里我将高四位和第四位舍去然后重新组合为一个八位数据,用上边叙述过的同样的方法处理此八位数据然后送入lcd经行显示。闹钟功能,在这里我定义了三个变量,通过对此三个变量

8、的设置,然后将变量与存储着从时钟芯片中读出的时分秒数据经行对比,当两者相同时,将接有蜂鸣器的引脚置高,再通过一个循环程序时的蜂鸣器发出滴滴的声音。秒表功能我是用到了单片机内部计时器T0和中断功能。用以前曾经写过的方法,让程序每50MS中断一次并在中断程序中经行循环,当到达一秒时秒位加一。并结合键盘设置有秒表开秒表关和秒表清零功能。键盘作为整个程序的主要操作点,设有留个独立键盘。K1为位选功能,选中要修改的位;K2是增值功能,是算选中的值加一;K3是减值功能;K4是正常时钟、闹钟、秒表切换的功能位;K5在普通模式下表示闹钟开关,在秒表模式下作为秒表的开关;K6为秒表模式下的清零位,只有在秒表停止

9、时才能动作。4、Proteus仿真原理图 5、程序流程首先程序开始运行后,可以按下K1键选择要操作的位。每次按下会换一个操作位,位顺序为:秒、分、时、日、月、年、星期。选中星期后,再次按下K1键后程序回到正常运行模式。在选中每一位的时候可以通过K2、K3键来增减数值,内部已经设置好,因此分秒只能在0到59增减变化,时的范围是0到23,而日期则与月份值有关,有大小月份之分。按下K4键后第二行显示全零,此时为闹钟设置模式,依然用K1选中位,K2K3增减数值,K5控制闹钟开启和关闭。再次按下K4键进入秒表模式,此时按下K5秒表开始运转,再次按下K5秒表停止。在秒表停止的情况下按下K6,秒表清零。程序

10、内设置温度报警值为35度,当温度高过该值后小灯会闪烁报警。闹钟时间到以后蜂鸣器发出滴滴的声音。6、程序代码#include#include#define uchar unsigned char#define uint unsigned intsbit SCLK=P36; /时钟芯片端口设置sbit IO=P34;sbit CE=P35;sbit ACC0=ACC0; /定义ACC寄存器中的第1位sbit ACC7=ACC7; /定义ACC寄存器中的第八位sbit LCDE=P26; /液晶显示控制端口设置sbit LCDRS=P25;sbit LCDWR=P24;sbit DQ=P37;sbi

11、t BF=P07;sbit K1=P20; /独立按键端口设置,modesbit K2=P21; /addsbit K3=P22; /subtractionsbit K4=P23;sbit K5=P30;sbit K6=P31;sbit LED=P27;sbit ring=P32; /alarm pinuchar table= 2012-05-01 MON;uchar table1= 00:00:00;uchar code table2=32,29,32,31,32,31,32,32,31,32,31,32;char table3=MON TUE WEN THU FRI SAT SUN; ch

12、ar time=0x00,0x00,0x00,0x01,0x05,0x06,0x0c;uchar LED_DIS=0,0,0,0,0,0,0,0;uchar LED_DIS1=0,0,0,0,0,0,0,0;uchar K1_num,flag,temph,templ,timee,K4_num,K5_num;uchar temp,T,c_miao,c_fen,c_shi,count;char shi,fen,miao;void delay(uint);void ds1302display();/*NOT USE DIRECTLYvoid writebyte(uchar ucDa)uchar i=

13、0;ACC=ucDa;for(i=8;i0;i-)IO=ACC0;SCLK=1;_nop_();SCLK=0;_nop_();ACC=ACC1;uchar readbyte(void)uchar i=0;for(i=8;i0;i-)ACC=ACC1;ACC7=IO;SCLK=1;_nop_();SCLK=0;_nop_();return(ACC);/*void writeto1302(uchar addr,uchar dat)CE=0;SCLK=0;CE=1;writebyte(addr);_nop_();_nop_();writebyte(dat); /tips the code type of dat is bcdSCLK=1; CE=0;uchar readfrom1302(uchar addr)uchar dat1,temp;CE=0;SCLK=0;CE=1;writebyte(addr);_nop_();_nop_();dat1=readbyte();CE=0;temp=_cror_(dat1&0xf0,4);dat1=temp*10+(dat1&0x0f)*10/10;return(dat1); /将读出的BCD码转为十六进制码/*lcd read&writebit BusyTest()

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号