




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录目录1系统的总体设计11.1仿真电路设计11.1.1仿真电路中各模块的分析ds1302实时时钟芯片lcd1602工业字符型液晶at89c52cmos 8位单片机74hc573八进制3态非反转透明锁存器74hc00四与非门蜂鸣器led灯按键51.2系统流程图分析62系统的软件设计82.1软件各模块分析82.1.1时钟设置模块82.1.2闹铃模块82.1.3显示模块92.2调试结果分析102.3体会与心得112.4附录112.4.1附录1 参考文献112.4.2附录2 源代码11qxyinyongxian1110411231单片机课程设计1 系统的总体设计1.1 仿真电路设计以at89c52单片机为核心,ds1302实时时钟芯片,设计数字式电子钟。人机接口包括按键、显示器、闹钟指示灯和蜂鸣器等,显示器显示时间,按键可以调节时间,并可控制电子钟的启停、闹钟设置。蜂鸣器作半点和整点报时闹铃,半点和整点报时闹铃,时间延时10秒,自定义闹铃,时间延时30秒。显示器用lcd。图 1.1-1仿真电路1.1.1 仿真电路中各模块的分析 ds1302实时时钟芯片ds1302是由美国dallas公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。ds1302的在实时显示时间中的应用。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。图 -1 ds1302仿真电路 lcd1602工业字符型液晶工业字符型液晶,能够同时显示16x02即32个字符。(16列2行。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5x7或者5x11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义cgram,显示效果也不好)。图 -1lcd1602仿真电路 at89c52cmos 8位单片机at89c52是一个低电压,高性能cmos 8位单片机,片内含8k bytes的可反复擦写的flash只读程序存储器和256 bytes的随机存取数据存储器(ram),器件采用atmel公司的高密度、非易失性存储技术生产,兼容标准mcs-51指令系统,片内置通用8位中央处理器和flash存储单元,at89c52单片机在电子行业中有着广泛的应用。图 -1 at89c52引脚图 74hc573八进制3态非反转透明锁存器74hc573包含八进制3态非反转透明锁存器。图 -1 74hc573引脚图 74hc00四与非门74hc00是一款高速cmos器件,74hc00引脚兼容低功耗肖特基ttl(lsttl)系列。74hc00遵循jedec标准no.7a。74hc00实现了2输入与非门功能。图 -1 74hc00引脚图图 -2 74hc00实验电路图 蜂鸣器输出脉冲到蜂鸣器,蜂鸣器就会响。实验中p3.0口接蜂鸣器,给予特定脉冲可演奏两只老虎的音乐。图 -2 蜂鸣器 led灯输出1到led灯,led灯就会亮。实验中p3.1口接led灯,交替输出1/0到led灯,实现led灯的闪烁。图 -2 led灯 按键共有8个按键,功能如下: :选定下一个数值+:光标所在值增加- : 光标所在值减少延时:5分钟后蜂鸣器响定时:按下后开始设定定时时间设置:按下后开始设定时间暂停:时钟停止确定:定时/设置的确定图 -1 键盘1.2 系统流程图分析 系统流程图分析整点/半点报时定时报时暂停时钟设置时间设置定时时间延时报时开始初始化显示器读取当前时间/或自定义时间显示2秒提示语后清屏显示时间整点/半点定时到按暂停键按设置键按定时键结束关闭程序ynnnnnyyyyy按延时键n图 1.2-1 系统流程图2 系统的软件设计2.1 软件各模块分析2.1.1 时钟设置模块时钟设置分析按设置键获取当前时间选择设置位设置具体时间写入ds1302函数返回按确定键ny2.1.2 闹铃模块时钟设置分析按定时键获取当前时间选择设置位设置具体定时时间保存定时时间函数返回按确定键ny2.1.3 显示模块显示分析转化时间程序被调用读取当前时间显示时间程序返回2.2 调试结果分析在电子时钟设计中程序比较长,遇到了各种各样的问题。因此修改程序的时间很长,有语法错误,也有仿真时功能无法实现的问题,在此不能一一说明,只能对个别问题加以阐述。比如开始时无法对ds1302,写入的值是错误的。将写入的字符值改为数字后,问题解决了。虽然现在回过头来发现这个问题很简单,但当时是百思不得其解。我从中学到:任何事情都会有出错的可能,有些时候人的思路中的一些错误是自己难以发现的,在工作和生活中要多对自己的想法提出质疑。不光是这种明显的问题很多,有些细微的问题也一样出现了,但解决起来并不容易。在最后的硬件实现阶段发现蜂鸣器不响。虽然蜂鸣器接地,但是给蜂鸣器高电平也无法驱动蜂鸣器。最后老师说要给蜂鸣器脉冲才能驱动蜂鸣器。问题得以解决。程序已基本实现要求的如下功能:基本任务:以at89c52单片机为核心,设计数字式电子钟。人机接口包括按键、显示器、闹钟指示灯和蜂鸣器等,显示器显示时间,按键可以调节时间,并可控制电子钟的启停、闹钟设置。蜂鸣器作半点和整点报时闹铃,闹铃时间延时30秒。显示器可以用数码管或lcd。扩展任务增加:对日期的预设功能,通过按键,切换日期显示或时间显示。其他任务:增加闹钟种类:每日指定时刻闹铃、延时闹铃,可以按任意键,停止闹铃。2.3 体会与心得通过本次课程设计,我对基于单片机数字式时钟的设计有了深入的研究。首先,我对课题进行了分析,分析了任务要求并理出了简单的设计思路。电子钟最关键的就是对89c52芯片、ds1302。接着,我就接着我的设计思路,开始编写程序,调试程序。想法永远是很美好的,到自己开始写程序时,我又开始迷茫了,因为单片机课程是上学期学习的,很多知识点已经忘记了,我又进行了重新的学习。后来我找到了一段相似的程序,然后进行了改编。最后我的程序顺利的调试出来了。通过这次的单片机大实验,使我加深了对单片机的认识,并且熟悉了单片机系统的设计流程,收获丰硕。功能上基本达标:时钟的显示,调时功能。时钟显示功能,精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷,定时,整点报时,任意键停止闹铃,暂停时钟等。随着现在互联网的越来越发达。网络在本次设计中起到了很大作用,很多芯片资料,传统的纸质图书里是没有的。如何在浩如烟海的网络中提取我们需要的知识也是我必须要提高的,网络作为一个平台,由于大家的无私奉献,才使得它丰富多彩,包罗万象。但从这么多的资料中找到我想要的却不是那么容易,以后得着重加强这方面的能力。从这次的设计中,我真正的体会到,什么叫书到用时方恨少,还有就是理论联系实践的重要性,如何把我们所学的理论知识运用到实际生活当中,这是最难的,也是我最缺的。实践出真知,光有书本上的知识是远远不够的,我明白了,作为一个理工科学生,我必须多动手多实践。2.4 附录2.4.1附录1 参考文献1 单片机原理与应用系统设计-基于c51的proteus仿真实验指导书2 教科书3 lcd工作原理及其应用方面的资料4 5 潘永雄.新编单片机原理与应用. 第2版6 何宏森.多功能智能电子钟的设计.兵工自动化,20052.4.2附录2 源代码/ main.c/*基于单片机数字式时钟的设计*尹永贤*2014年11月17日-2014年11月28日**/*引用库函数*/#include /* special function register declarations */#include /* prototype declarations for i/o functions */#include #include #include #include /*/*定义数据类型的简写形式*/#define byte unsigned char#define uchar unsigned char#define word unsigned int#define uint unsigned int#define ulong unsigned long#define byte unsigned char#define word unsigned int#define true 1#define false 0/*/void time(unsigned int ucms);/延时单位:ms/*ds1302.c文件中函数与变量的声明*/extern void ds1302_initial();extern void ds1302readall();extern void ds1302dataconver();extern void ds1302writeall();extern char ds1302reg; /ds1302内部日期寄存器 (00-06)extern char date; /时钟数据转换为字符存储extern char datetime;/*/uchar xdata lcd1602cmdport _at_ 0x8000;/e=1 rs=0 rw=0uchar xdata lcd1602statusport _at_ 0x8001;/e=1-0 rs=0 rw=1uchar xdata lcd1602wdataport _at_ 0x8002;/e=1 rs=1 rw=0uchar xdata lcd1602rdataport _at_ 0x8003;/e=1-0 rs=1 rw=1/*设定闹钟保存所设定的时间*/char year2=0,month2=0,day2=0,hour2=0,minute2=0,second2=0,week=1;/*设定时间保存所设定的时间*/char yeart2=0,montht2=0,dayt2=0,hourt2=0,minutet2=0,secondt2=0,weekt=1;/*根据settime的值设定相应参数*/*0:设置年 1:设置月 2:设置日 3:设置时 4:设置分 5:设置秒 6:设置星期*/char settime=0;char delayup=-1; /为5时变为延时到char startdelay=0; /延时开始#define busy0x80/ 忙判别位code uchar exampl=-ds1302/lcd1602 -calendar clock;/首先显示sbit buzzer = p30; /蜂鸣器的接口sbit led = p31; /led灯的接口/lcd1602驱动函数void lcdwritedata( char dataw );void lcdwritecommand(uchar cmd,uchar attribc );void lcdreset( void );void display( uchar dd );void disponechar(uchar x,uchar y,uchar wdata);void putstr(uchar x,uchar y, uchar code *ptr);void locatexy(char posx,char posy);/显示光标定位 void displayttv(void);/显示时间 void clock(void);/闹钟void yanzou(uchar i,uint pai);/演奏定时音乐void pause(void); /暂停void setled(void); /设置ledchar anykeydown(void); /任意键按下返回真void setnowtime(void); /设置时间void setclock(void); /设置闹钟void integralpoint(void); /整点或半点报时void delay5min(void);/延时5分钟 /*主程序*/void main(void)lcdreset(); /初始化ds1302dataconver();putstr(0,0,exampl);/显示一个预定字符串exampltime(2000);/保持2秒显示内容putstr(0,0, );/清屏led=0; /灭灯/初始化后灯处于灭的状态ds1302_initial(); /设定2014年1月1日0时0分0秒 星期三while(1)/程序初始化后开始循环运行time(300); /防止出现光标移动displayttv();/显示时间integralpoint(); /整点或半点报时delay5min(); /延时5分钟clock(); /定时时间到程序pause(); /按下暂停键,停止时钟setnowtime();/按下设置键,设置时钟setclock(); /按下定时键,设置闹钟/*设置时间*/void setnowtime(void) /-设置时间开始.-if(p1=0xdf)/按下设置键while(p1=0xdf); putstr(0,0, );/清屏/获得当前时间值yeart1=date12;yeart0=date11;montht1=date6;montht0=date7;dayt1=date8;dayt0=date9;hourt1=date0;hourt0=date1;minutet1=date2;minutet0=date3;secondt1=date4;secondt0=date5;weekt=ds1302reg5;while(p1!=0x7f)/按确定键设定完成time(200); /显示格式为:*:*:* (表示时分秒)if(p1=0xfe) /按右移while(p1=0xfe); if(settime=6) settime=0; else settime=settime+1; disponechar(0,0,2); /显示设定的年份disponechar(1,0,0);disponechar(2,0,yeart1);disponechar(3,0,yeart0);disponechar(4,0,-);disponechar(5,0,montht1); /显示设定的月份disponechar(6,0,montht0);disponechar(7,0,-);disponechar(8,0,dayt1); /显示设定的日期disponechar(9,0,dayt0);putstr(11,0,time.); /显示一个预定字符串exampldisponechar(0,1,hourt1); /显示设定的时disponechar(1,1,hourt0);disponechar(2,1,:);disponechar(3,1,minutet1); /显示设定的分disponechar(4,1,minutet0);disponechar(5,1,:);disponechar(6,1,secondt1); /显示设定的秒disponechar(7,1,secondt0);/switch(ds1302reg5)switch(weekt)case 1:putstr(9,1,sun);/周日break;case 2:putstr(9,1,mon);/周一break;case 3:putstr(9,1,tue);/周二break;case 4:putstr(9,1,wed);/周三break;case 5:putstr(9,1,thu);/周四break;case 6:putstr(9,1,fri);/周五break;case 7:putstr(9,1,sat);/周六break;default:putstr(9,1,err);/错误break;/根据settime的值修改相应的值:settime=0 0:设置年 1:设置月 2:设置日 3:设置时 4:设置分 5:设置秒 6:设置星期 switch(settime) case 0:locatexy(0,0);/ 定位显示地址if(p1=0xfd) /年+while(p1=0xfd); if(yeart0=9)yeart0=0;if(yeart1=9) yeart1=0;else yeart1=yeart1+1;else yeart0=yeart0+1;else if(p1=0xfb) /年- while(p1=0xfb); if(yeart0=0)if(yeart1=0)yeart1=0;yeart0=0;elseyeart1=yeart1-1; yeart0=9;else yeart0=yeart0-1;break;case 1:locatexy(5,0);/ 定位显示地址if(p1=0xfd) /月+while(p1=0xfd); if(montht0=2)if(montht1=1) montht1=0; montht0=1;else montht0=montht0+1;else if(montht0=9) montht1=1;montht0=0;elsemontht0=montht0+1; else if(p1=0xfb) /月- while(p1=0xfb); if(montht0=1)if(montht1=1) montht0=0;else montht1=1;montht0=2;else if(montht0=0) montht1=0;montht0=9;elsemontht0=montht0-1; break;case 2:locatexy(8,0);/ 定位显示地址if(p1=0xfd) /日+while(p1=0xfd); if(dayt0=1)if(dayt1=3) dayt1=0; dayt0=1;else dayt0=dayt0+1;else if(dayt0=9) dayt1=dayt1+1;dayt0=0;elsedayt0=dayt0+1; else if(p1=0xfb) /日- while(p1=0xfb); if(dayt0=0) dayt1=dayt1-1; dayt0=9;else if(dayt0=1) if(dayt1=0) dayt1=3;dayt0=1;else dayt0=dayt0-1;elsedayt0=dayt0-1; break;case 3:locatexy(0,1);/ 定位显示地址if(p1=0xfd) /时+while(p1=0xfd); if(hourt0=3)if(hourt1=2) hourt1=0; hourt0=0;else hourt0=hourt0+1;else if(hourt0=9)hourt0=0; hourt1=hourt1+1;elsehourt0=hourt0+1; else if(p1=0xfb) /时- while(p1=0xfb); if(hourt0=0)if(hourt1=2 | hourt1=1) hourt1=hourt1-1; hourt0=9;else hourt1=2; hourt0=3;elsehourt0=hourt0-1; break;case 4:locatexy(3,1);/ 定位显示地址if(p1=0xfd) /分+while(p1=0xfd); if(minutet0=9)if(minutet1=5) minutet1=0; minutet0=0;else minutet1=minutet1+1; minutet0=0;elseminutet0=minutet0+1; else if(p1=0xfb) /分- while(p1=0xfb); if(minutet0=0)if(minutet1=5 | minutet1=4 | minutet1=3 |minutet1=2 | minutet1=1) minutet1=minutet1-1; minutet0=9;else minutet1=5; minutet0=9;elseminutet0=minutet0-1; break;case 5:locatexy(6,1);/ 定位显示地址if(p1=0xfd) /秒+while(p1=0xfd); if(secondt0=9)if(secondt1=5) secondt1=0; secondt0=0;else secondt1= secondt 1+1; secondt0=0;elsesecondt0=secondt0+1; else if(p1=0xfb) /秒- while(p1=0xfb); if(secondt0=0)if(secondt1=5 | secondt1=4 | secondt1=3 | secondt1=2 | secondt1=1) secondt1=secondt1-1; secondt0=9;else secondt1=5; secondt0=9;elsesecondt0=secondt0-1; break;case 6:locatexy(9,1);/ 定位显示地址if(p1=0xfd) /星期+while(p1=0xfd); if(weekt=7)weekt=1;elseweekt=weekt+1; else if(p1=0xfb) /星期- while(p1=0xfb); if(weekt=1)weekt=7;elseweekt=weekt-1; break;default: break; /-结束-根据settime的值修改相应的值:settime=0 0:设置年 1:设置月 2:设置日 3:设置时 4:设置分 5:设置秒 6:设置星期/字符转化为数字weekt= weekt;yeart1= yeart1-0;yeart0= yeart0-0;montht1= montht1-0;montht0= montht0-0;dayt1= dayt1-0;dayt0= dayt0-0;hourt1= hourt1-0;hourt0= hourt0-0;minutet1= minutet1-0;minutet0= minutet0-0;secondt1= secondt1-0;secondt0= secondt0-0;/存入设定的值datetime0=weekt;datetime1=(yeart14)|yeart0;datetime2=(montht14)|montht0;datetime3=(dayt14)|dayt0;datetime4=(hourt14)|hourt0;datetime5=(minutet14)|minutet0;datetime6=(secondt14)|secondt0;ds1302writeall(); /保存设定值settime=0;putstr(0,0, );/清屏 /-设置时间结束.-/*设置定时*/void setclock(void) /-设定定时时间开始.-if(p1=0xef)/按下定时键while(p1=0xef); putstr(0,0, );/清屏/获得当前时间值year1=date12;year0=date11;month1=date6;month0=date7;day1=date8;day0=date9;hour1=date0;hour0=date1;minute1=date2;minute0=date3;second1=date4;second0=date5;week=ds1302reg5; while(p1!=0x7f)/按确定键设定完成time(200);/显示格式为:*:*:* (表示时分秒)if(p1=0xfe) /按右移while(p1=0xfe); if(settime=6) settime=0; else settime=settime+1; disponechar(0,0,2); /显示设定的年份disponechar(1,0,0);disponechar(2,0,year1);disponechar(3,0,year0);disponechar(4,0,-);disponechar(5,0,month1); /显示设定的月份disponechar(6,0,month0);disponechar(7,0,-);disponechar(8,0,day1); /显示设定的日期d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 张裔书课件教学课件
- 2025广东惠州市博罗县东部自来水有限公司招聘及考前自测高频考点模拟试题及1套完整答案详解
- 2025安徽安庆望江县融媒体中心急需紧缺专业技术人员招聘2人考前自测高频考点模拟试题及答案详解(必刷)
- 2025北京林业大学附属实验小学招聘考前自测高频考点模拟试题及一套参考答案详解
- 2025湖南张家界市桑植县农业农村局所属事业单位选调4人模拟试卷附答案详解(模拟题)
- 2025安徽理工大学第一附属医院第二批紧缺岗位招聘14人模拟试卷及答案详解(各地真题)
- 现代温室大棚节能施工方案
- 医院住院医师规范化诊疗流程手册
- 初中英语重点单元词汇语法总结资料
- 纳米结构橡胶材料的微观结构与性能关系-洞察及研究
- 胖东来评定管理制度
- 产房考试试题及答案
- 重症自身免疫性脑炎监测与治疗中国专家共识(2024版)解读
- 供餐服务合同协议书模板
- 无偿搭车免责协议书
- 2025-2030年中国电力线载波通信芯片行业市场现状供需分析及投资评估规划分析研究报告
- 窗户改造合同协议书
- 《脑电图的临床应用》课件
- 中国补习班行业市场发展现状及前景趋势与投资分析研究报告2025-2028版
- 《电生理导航系统》课件
- 《局部解剖胸部》课件
评论
0/150
提交评论