6、用DS1302与LCD1602可调数字万年历实验设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

利用时钟芯片DS1302实现万年历系别电子通信工程系组别第十组专业名称电子信息工程指导教师组内成员2013年8月19日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302设计可调式电子日历时钟。1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。控制程序的编写等。备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。但造价较高。1.3.2、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。所以也不用此种作为显示。方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。LCD1602可实现显示2行十六个字符。1.3.3、时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、星期、月、年以及闰年补偿的年进行计数,而且精度高,31*8位的RAM做为数据暂存区,工作电压范围为2.5V~5.5V,2.5V时耗电小于300nA。1.3.4、电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;DS1302提供时钟;LCD1602液晶带汉字库显示屏作为显示部分。二、硬件设计2.1、电路设计模块图如图2-1所示80C51主控制器模块LCD显示控制模块按键控制模块蜂鸣器闹钟提醒控制模块DS1302实时时钟控制模块图2-12.2、系统总体设计原理图2.3、要求用proteus仿真软件仿真并抓图。三、软件设计3.1、画出各个函数流程图。3.1.1、DS1302实时控制芯片的流程图如图3-1开始初始时间状态设置向DS1302中写日期时间从DS1302中读日期时间送到80C51图3-13.1.2、LCD1602液晶显示控制流程图如图3-2对1602初始化写入显示设置命令检查忙标志设置字符显示位置LCD显示内容向1602中写入数据延时一段时间BF=7?延时一段时间返回主程序是入口图3-23.1.3、闹钟提醒控制流程如图3-3开始查询是否到定时时间P3_7置低蜂鸣器响应闹铃否是如图3-33.1.4、调时函数控制流程如图3-4开始控制键有效,调整年等待按键程序加有效减有效年加1年减1控制键有效,调整月等待按键程序加有效减有效月加1月减1控制键有效,调整日控制键有效,调整星期等待按键程序等待按键程序加有效减有效日加1日减1加有效减有效星期加1星期减1控制键有效,调整时控制键有效,调整分加有效减有效加有效减有效时加1时减1按键有效跳出调时程序,进入主循环分减1分加1等待按键程序等待按键程序图3-33.2、写出程序代码。/*说明**************************************************************************曲谱存贮格式unsignedcharcodeMusicName{音高,音长,音高,音长....,0,0};末尾:0,0表示结束(Important)音高由三位数字组成:个位是表示1~7这七个音符十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音:0-不升,1-升半音。音长最多由三位数字组成:个位表示音符的时值,其对应关系是:|数值(n):|0|1|2|3|4|5|6|几分音符:|1|2|4|8|16|32|64音符=2^n十位表示音符的演奏效果(0-2):0-普通,1-连音,2-顿音百位是符点位:0-无符点,1-有符点调用演奏子程序的格式Play(乐曲名,调号,升降八度,演奏速度);|乐曲名:要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11):是指乐曲升多少个半音演奏;|升降八度(1-3):1:降八度,2:不升不降,3:升八度;|演奏速度(1-12000):值越大速度越快;***************************************************************************/#includebuzz.hunsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7在频率表中的位置unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};staticunsignedcharSound_Temp_TH0,Sound_Temp_TL0;//音符定时器初值暂存staticunsignedcharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存externint8scan_key(void);voidInitialSound(void){BeepIO=1;Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;//计算TL1应装入的初值(10ms的初装值)Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%256;//计算TH1应装入的初值TH1=Sound_Temp_TH1;TL1=Sound_Temp_TL1;TMOD|=0x11;ET0=1;ET1=0;TR0=0;TR1=0;EA=1;}voidBeepTimer0(void)interrupt1//音符发生中断{BeepIO=!BeepIO;TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;}//**************************************************************************bitPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed){unsignedintNewFreTab[12];//新的频率表unsignedchari,j;unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i12;i++)//根据调号及升降八度来生成新的频率表{j=i+Signature;if(j11){j=j-12;NewFreTab[i]=FreTab[j]*2;}elseNewFreTab[i]=FreTab[j];if(Octachord==1)NewFreTab[i]=2;elseif(Octachord==3)NewFreTab[i]=2;}SoundLength=0;while(Sound[SoundLength]!=0x00)//计算歌曲长度{SoundLength+=2;}Point=0;Tone=Sound[Point];Length=Sound[Point+1];//读出第一个音符和它时时值LDiv0=12000/Speed;//算出1分音符的长度(几个10ms)LDiv4=LDiv0/4;//算出4分音符的长度LDiv4=LDiv4-LDiv4*SOUND_SPACE;//普通音最长间隔标准TR0=0;TR1=1;while(PointSoundLength){if(scan_key()){BeepIO=1;return0;}SL=Tone%10;//计算出音符SM=Tone/10%10;//计算出高低音SH=Tone/100;//计算出是否升半CurrentFre=NewFreTab[SignTab[SL-1]+SH];//查出对应音符的频率if(SL!=0){if(SM==1)CurrentFre=2;//低音if(SM==3)CurrentFre=2;//高音Temp_T=65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值Sound_Temp_TH0=Temp_T/256;Sound_Temp_TL0=Temp_T%256;TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0+12;//加12是对中断延时的补偿}SLen=LengthTab[Length%10];//算出是几分音符XG=Length/10%10;//算出音符类型(0普通1连音2顿音)FD=Length/100;LDiv=LDiv0/SLen;//算出连音音符演奏的长度(多少个10ms)if(FD==1)LDiv=LDiv+LDiv/2;if(XG!=1)if(XG==0)//算出普通音符的演奏长度if(SLen=4)LDiv1=LDiv-LDiv4;elseLDiv1=LDiv*SOUND_SPACE;elseLDiv1=LDiv/2;//算出顿音的演奏长度elseLDiv1=LDiv;if(SL==0)LDiv1=0;LDiv2=LDiv-LDiv1;//算出不发音的长度if(SL!=0){TR0=1;for(i=LDiv1;i0;i--)//发规定长度的音{while(TF1==0);TH1=Sound_Temp_TH1;TL1=Sound_Temp_TL1;TF1=0;}}if(LDiv2!=0){TR0=0;BeepIO=0;for(i=LDiv2;i0;i--)//音符间的间隔{while(TF1==0);TH1=Sound_Temp_TH1;TL1=Sound_Temp_TL1;TF1=0;}}Point+=2;Tone=Sound[Point];Length=Sound[Point+1];}BeepIO=1;return1;}/**蜂鸣器响*/voidalarm_sound(void){uint16m,n=2000;while(n--){BeepIO=~BeepIO;for(m=0;m100;m++);}BeepIO=1;}四、专业实习要求1、掌握常用设备的使用;2、掌握keil编译环境的使用,熟悉proteus仿真软件的使用;3、基本掌握电路板的焊接调试技巧;4、基本掌握51单片机最小应用系统的组装、调试。五、附录5.1、附录一、DS132

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功