单片机应用课程设计实验报告电子时钟.doc_第1页
单片机应用课程设计实验报告电子时钟.doc_第2页
单片机应用课程设计实验报告电子时钟.doc_第3页
单片机应用课程设计实验报告电子时钟.doc_第4页
单片机应用课程设计实验报告电子时钟.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

键入文字键入文字键入文字单片机应用课程设计电子时钟 一、设计任务及要求【电子时钟】利用实验板上4个led数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。显示格式“时时分分”;”2、由led闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。拓展设计:1 用数码管的小数点闪动替代二极管显示秒,使之成为一个“完整的时钟”;2、使数字时钟的闹钟铃声为音乐。二、设计思路【工作原理及设计思路】计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要利用中断程序才能定时1秒,若中断程序每隔5ms中断一次并当作一个计数,则每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断1min是否到了,再判断1h是否到了。为了将时间在led数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现led显示。闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时,可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。三、设计分析【系统的主要功能】本实验实际是设计一个电子表,可以显示时和分,并且用一个二极管显示秒。另外,还可以对它进行时间调整,还要有闹铃功能。【所作题目的意义】时钟电路在各个系统中都起着十分重要的作用,是保证系统正常工作的基础。同时时钟电路整体的设计及其工作原理涉及到了单片机基础课程中各章节的内容,是对单片机理论基础课程的一个综合实践,通过本课题不仅让我对电子时钟这一课题有更深入的了解,更加深了自己对单片机课程整体知识的把握,将理论所学用于实践,将知识综合,达到融会贯通的高度。【硬件电路设计及描述】实验用jd51开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。显示部分jd51上用于显示部分的电路如下图: jd51上有四位共阳led数码管,其标号分别为led1led4,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。p0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。闹铃部分蜂鸣器与p2.4口相连。开关部分本实验中的开关是实验仪上的四个逻辑开关,它们分别与p3.2、p3.3、p3.4、p3.5相连。其总p3.2用于调整时钟或闹钟的时,p3.3用于调整时钟或闹钟的分,p3.5用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(sw1、sw2、sw4)时停止闹钟。【软件设计流程及描述】显示部分 显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。 流程图如下:闹铃部分设计思路及原理:音节由不同频率的方波产生,音节与频率的关系如下表所示。要产生音频方波,设计利用延时来建立音符表note,表格中的数存r3*20us,其倒数1/(r3*2*10us)对应相应音符的频率。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。设计利用t1中断产生10ms延时,取1/4拍为10h*10ms,相应产生所需延时。 音符(低).1.2.3.4.5.6.7频率(hz)262294330349392440494音符(中)1234567频率(hz)523587659698784880988音符(高)1234567频率(hz)1046117513181397156817601967闹钟铃声选取情景比较合适的猪之歌,其曲谱如下图:其相应的音符和节拍表note和metre如下:note:db 7fh,7fh,7fh,60h,65h,72h,72h,72h,7fh,72h db 60h,72h,60h,72h,60h,72h,7fh,72h,7fh,98h,72h,7fh db 7fh,7fh,7fh,60h,65h,72h,72h,72h,7fh,72h db 60h,72h,60h,72h,60h,72h,7fh,72h,7fh,72h,4ch,55h,00hmetre:db 80h,20h,20h,20h,20h,20h,20h,20h,20h,80h db 20h,20h,20h,20h,40h,20h,20h,20h,20h,20h,20h,80hdb 80h,20h,20h,20h,20h,20h,20h,20h,20h,80h db 20h,20h,20h,20h,40h,20h,20h,20h,20h,20h,20h,40h开关扫描及处理部分本实验用到了三个开关,其中涉及开关的扫描及处理。开关4控制数码管当前显示的是时钟还是闹钟,显示时钟时,可通过开关1和开关2调整时钟的时和分;显示闹钟时,也可以通过开关1和开关2调整时和分。开关4控制闹铃的开和关。按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:t0中断服务程序:采用定时器t0计时,中断程序每隔50ms中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否24小时到了。程序流程图如下:三、源程序代码及注释;*;/*电子时钟程序*/ ;程序主要包括main函数,t0、t1中断程序,时间、闹钟显示程序 ,按键扫描、处理程序;* org 0000hajmp main ;跳转到主程序main执行org 000bhajmp intt0 ;跳到intt0执行org 001bhljmp intt1 ;跳到intt1执行org 0300h;/*主函数*/预置t0t1工作方式,置初值,预置时钟、闹钟,置位数码管main:mov sp,#80h mov tmod,#11h ;设置定时器t0、t1工作于方式1 mov th0,#3ch ;装入时钟定时初值(50ms) mov tl0,#0b0h mov th1,#0d8h ;装入闹铃定时初值(10ms) mov tl1,#0f0h mov r1,#00h ;确保首次默认闹铃工作mov 20h,#00h mov 21h,#00h mov 22h,#00h ;预置时钟分分mov 23h,#00h ;预置时钟时时 mov 30h,#30h ;预置闹铃分分mov 31h,#08h ;预置闹铃时时setb p2.0 ;数码管接p2口,置位数码管,使其全灭setb p2.1setb p2.2setb p2.3clr p1.7 ;发光二极管led7led8用于显示秒,清p1.7,发光二极管led8亮setb p1.6 ;置位p1.6,发光二极管led7灭setb ea ;开放总中断setb et0 ;允许t0中断setb tr0 ;开启定时器t0loop:lcall dispt ;调用时间显示子程序lcall ring ;调用闹铃处理子程序lcall key ;调用按键扫描子程序jz loop ;无键按下则循环lcall case ;有键按下则转按键处理子程序执行sjmp loop ;循环;/*t0一秒定时中断程序intt0*/正常时钟计时intt0:push psw ;状态字入栈保护 push acc ;累加器入栈保护mov tl0,#0b0h ;装入计数初值,12mhz晶振,形成1s中断mov th0,#3chinc 20hmov a,20hcjne a,#20,returncpl p1.7 ;一秒到发光二极管轮流亮,用于显示秒cpl p1.6mov 20h,#00h ;一秒到清20h mov a,21hadd a,#01hda amov 21h,acjne a,#60h,returnmov 21h,#00h ;一分到,21h单元清零mov a,22hadd a,#01hda amov 22h,acjne a,#60h,returnmov 22h,#00h ;一小时到,22h单元清零mov a,23hadd a,#01hda amov 23h,acjne a,#24h,returnmov 23h,#00h ;满24,23h单元清零return:pop accpop pswreti;/*时间显示子程序*/dispt:mov a,22hanl a,#0fhmov 2ah,a ;时钟分的低位mov a,22hanl a,#0f0hswap amov 2bh,a ;时钟分的高位mov a,23hanl a,#0fhmov 2ch,a ;时钟时的低位mov a,23hanl a,#0f0hswap amov 2dh,a ;时钟时的高位led1:setb p2.3 mov a,2dh mov dptr,#tab movc a,a+dptr clr p2.0 ;选通数码管1 mov p0,a ;显示时钟时的十位部分 lcall delayled2:setb p2.0 mov a,2ch mov dptr,#tab movc a,a+dptr clr p2.1 ;选通数码管2 mov p0,a ;显示时钟时的个位部分 lcall delay led3:setb p2.1 mov a,2bh mov dptr,#tab movc a,a+dptr clr p2.2 ;选通数码管3 mov p0,a ;显示时钟分的十位部分 lcall delayled4:setb p2.2 mov a,2ah jb p1.7,ta2ta1: add a,#10 ;用于利用数码管的小数点来表示秒ta2: mov dptr,#tab movc a,a+dptr clr p2.3 ;选通数码管4 mov p0,a ;显示时钟分的个位部分 lcall delay rettab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;共阳数码管的不带小数点的时间显示码 db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h;共阳数码管的带小数点的时间显示码 ;/*按键扫描程序*/开关接p3口,判断按键情况key: mov p3,#0ffh mov a,p3cpl aanl a,#2chjz retk ;无键按下则返回lcall delay ;延时消抖mov a,p3cpl aanl a,#2chjz retk ;键盘去抖动mov r6,a ;将键值存入r6loop1:lcall dispt;mov a,p3cpl aanl a,#2chjnz loop1 ;等待键释放mov a,r6retk:ret;/*按键处理子程序*/根据按键情况进行处理case:mov a,r6clr p1.0 ;发光二极管led1亮jb acc.2,seth ;转调整时jb acc.3,setm ;转调整分jb acc.5,setr ;转闹铃设置waitcase:lcall dispt ;无键按下时等待lcall keyjz waitcase;/*时间调整程序*/按键调整时间sett:lcall disptlcall keyjz settmov a,r6jb acc.2,sethjb acc.3,setmjb acc.5,keygo ;第二次按为确认离开keygo: setb p1.0 ;发光二极管led1、led2灭setb p1.1retseth:mov a,23h ;调整时钟时,时加1add a,#01hda a ;十进制调整mov 23h,acjne a,#24h,hd ;判断是否到24,不到继续mov 23h,#00h ;到24时清零hd:ljmp settsetm:mov a,22h ;分加1add a,#01hda a ;十进制调整 mov 22h,acjne a,#60h,md ;判断是否到1小时,不到继续mov 22h,#00h ;到1小时则清零md:ljmp sett;/*闹铃时间调整按键扫描及处理子程序*/keyr: mov p3,#0ffh mov a,p3cpl aanl a,#2chjz retk ;无键按下则返回lcall dispr ;延时消抖mov a,p3cpl aanl a,#2chjz retk ;键盘去抖动mov r6,a ;将键值存入r6ljmp looprloopr:lcall disprmov a,p3cpl aanl a,#2chjnz loopr ;等待键释放mov a,r6ajmp retk;/*设置闹铃时间*/setr:setb p1.0 ;发光二极管led1灭clr p1.1 ;发光二极管led2亮,改显示状态lcall disprmov r1,#00h ;设置闹钟时重设r1,用于检测闹铃播放与否mov 53h,#03h ;重设闹铃次数lcall keyr ;闹铃时间调整按键检测jz setrmov a,r6jb acc.2,setrhjb acc.3,setrmjb acc.5,keygo ;第二次按为确认离开setrh:mov a,31h ;闹钟时加1add a,#01hda a ;十进制调整mov 31h,acjne a,#24h,rhd ;判断是否到24,不到继续mov 31h,#00h ;到24时则清零rhd:ljmp setrsetrm:mov a,30h ;闹钟分加1add a,#01hda a ;十进制调整mov 30h,acjne a,#60h,rmd ;判断是否到1小时,不到继续mov 30h,#00h ;到1小时则清零rmd:ljmp setr;/*闹钟设置显示子程序*/dispr:mov a,30hanl a,#0fh ;屏蔽高四位mov 3ah,a ;保留低位送3ahmov a,30hanl a,#0f0h ;屏蔽低四位 swap a ;高四位与第四位交换mov 3bh,a ;将保留的高4位送3bhmov a,31hanl a,#0fh mov 3ch,a ;低位mov a,31hanl a,#0f0hswap amov 3dh,a ;高位ledr1:setb p2.3mov a,3dh mov dptr,#tab movc a,a+dptr clr p2.0mov p0,alcall delayledr2:setb p2.0 mov a,3ch mov dptr,#tab movc a,a+dptr clr p2.1mov p0,alcall delayledr3:setb p2.1 mov a,3bh mov dptr,#tab movc a,a+dptr clr p2.2mov p0,alcall delayledr4:setb p2.2 mov a,3ah mov dptr,#tab movc a,a+dptr clr p2.3mov p0,alcall delayret;/*延时子程序*/delay:mov r5,#2 d1:mov r4,#250d2:djnz r4,d2djnz r5,d1ret;/*闹铃检测程序*/ring:mov a,23h ;比较时cjne a,31h,retrmov a,22h ;比较分cjne a,30h,retr lcall singretr:ret;/*定时器t1中断子程序*/intt1:push psw ;状态字入栈保护 push acc ;累加器入栈保护 inc 50h ;中断服务程序,中断计数器加1mov th1,#0d8h ;装入计数初值,12m晶振,形成10ms中断 mov tl1,#0f0h pop acc pop pswreti ;/*响铃子程序*/ sing:cjne r1,#01h,sing1 ;判断是否已经闹铃过一次 ljmp rets sing1:setb et1 mov 50h,#00h ;中断计数器清0 mov 51h,#00h ;音符指针 mov 52h,#00h ;节拍码指针 mov 53h,#03h ;设置闹钟不退出响铃次数 getnot:mov a,51h mov dptr,#note ;表头地址送dptr movc a,a+dptr ;查表取音符码 jz endp ;是00h,则结束 mov r6,a ;存r6 inc 51h cjne a,#0ffh,getmet ;不为0ffh,转取节拍码 ljmp pause ;转休止播放 ljmp getnot ;取音符码 getmet:mov a,52h mov dptr,#metre ;取节拍码首地址 movc a,a+dptr ;取节拍代码送r7 mov r7,a inc 52h play:setb tr1 ;启动计数 cpl p2.4 lcall key jnz rets mov a,r6 mov r3,a ;音符码存r3 lcall delay1 mov a,r7 ;取节拍码放a与中断计数比较cjne a,50h,play ;断计数器(50h)=r7否,不等继续循环mov 50h,#00h ;等于,则取下一代码 lcall dispt lcall dispt lcall dispt lcall dispt clr tr1 ljmp getnot rets:setb p2.4 ;置位蜂鸣器,否则可能产生啸叫mov r1,#01h ;表明播放过一次clr a ;清除a,防止进入按键处理子程序ljmp retr pause:clr tr1 ;休止100毫秒 mov r2,#0dh delay2: mov r3,#0ffh lcall delay1 djnz r2,delay2ret endp:setb p2.4 mov r2,#0c7h ;歌曲结束,延时1秒后继续end1m: mov r3,#00h lcall delay1 djnz r2,end1m djnz 53h,sing ret delay1:nop ;r3为01h时,delay延时为20usdelay3: mov r4,#02h delay4: djnz r4,delay4 djnz r3,delay3 retnote:db 7fh,7fh,7fh,60h,65h,72h,72h,72h,7fh,72h db 60h,72h,60h,72h,60h,72h,7fh,72h,7fh,98h,72h,7fh db 7fh,7fh,7fh,60h,65h,72h,72h,72h,7fh,72h db 60h,72h,60h,72h,60h,72h,7fh,72h,7fh,72h,4ch,55h,00hmetre:db 80h,20h,20h,20h,20h,20h,20h,20h,20h,80h db 20h,20h,20h,20h,40h,20h,20h,20h,20h,20h,20h,80hdb 80h,20h,20h,20h,20h,20h,20h,20h,20h,80h db 20h,20h,20h,20h,40h,20h,20h,20h,20h,20h,20h,40h end四、调试分析过程1、建立一个keil51应用程序首先新建一个工程项目文件zj,再为工程选择目标器件p80p87c52x2,如图所示。然后把源程序文件(.asm)添加到项目中.2、程序文件的编译、连接单击工具栏project选项,在弹出的下拉菜单中选择“option for target target1”命令为目标设置工具选项,在debug栏内选中use simulator选项,单击确定命令按钮,此时配置为软件仿真,在output栏中选择create hex fi选项,用于生成hex文件。经过上述设置,就可以编译程序了。单击工具栏project选项,在弹出的下拉菜单中选择build target命令对源程序文件进行编译,若出现下图所示窗口,显示无错误,继续进行rebuild all target fiels, 在信息输出窗口会输出一些相关的信息。第五行“creating hex file from zj”说明已生成目标文件zj.hex,最后一行说明在编译过程中不存在错误和警告,编译连接成功。若在编译过程中出现错误,系统会给出错误所在的行和该错误提示信息,我们可以根据这些提示信息更正程序中出项的错误,重新编译调试程序,直至完全正确为止。3、将生成的目标文件last.hex下载到flash中 运行可执行文件“sstflashflex51.exe”。打开界面如图2所示。点击菜单“detectchip/rs232”-“detect target mcuand rs232 config”。打开界面如图所示。根据板载单片机型号选择“sst98c58”或“sst89e/v58rd2”。存储器模式选“internal memory”。点击确定。设置串行口参数,如图4所示。注意串口号应选择与学习板连接的端口,波特率选默认值38400。其他不用改动。按“detect mcu”。根据弹出的对话框操作:先按下“确定”,然后按一下学习板的复位按钮sw1。(如果mcu已经复位,可以不用按sw1,应视乎软件能否检测到mcu决定)。如果软件检测到mcu则界面如图5所示(因mcu状况不同可能有差异)。点击“iap function”中的“dnload/run usercode”,在弹出对话框中输入要下载的程序名(hex后缀)。弹出对话框问是否覆盖原来代码,点击“是”,程序代码即下载到学习板的单片机中并开始运行。时钟开始运行(预置的是00:00,用于显示秒的led78开始闪烁)。4、在线调试选择菜单“project”-“open project”。选择打开项目文件zj.uv2。打开项目后可看到源代码。点击左边project workspace窗口的目录树最顶端的target 1。然后选择菜单“project”-“options for target target 1”。打开窗口如图所示。点击“debug”选项卡。打开如图所示界面,选择右边“use keil monitor-51 driver”。选择下面“run to main()”复选框。然后点击“settings”按钮。弹出对话框中选择串口号和波特率,串口号选择与上文使用sst下载软件时相同(如果串口连接没有改变的话),波特率选择38400。完成后点击“确定”。再次点击“确定”退出项目设置窗口。在主界面上方图标按钮处点击 按钮。软件即进入仿真调试状态。黄色光标停留在main函数的第一语句处。光标下方红色方块为运行断点,可以自行设置(双击黄色光标下方的深灰色区域即可设置或取消断点)。按全速执行按钮 执行程序,光标将停留在预设的断点处。接着可按单步执行按钮执行断点处的语句。同理,可继续设置断点或全速执行全部程序。可在子函数内部设置断点,亦可使用 按钮进入某个子函数。如果接下来没有其他断点而按全速运行按钮,mcu将全速运行,软件将不能再实时观察到mcu的状态,此时可以观察学习板的硬件运行情况是否和设想的一致。进入全速运行后要停止操作须按停止按钮 。弹出对话框中选择“stop debugging”。退出仿真调试状态后若须重新仿真调试,请先复位学习板mcu(按学习板的sw1按钮)。五、课程设计体会【实验中遇到的问题及解决方案】1、首先是定时的问题,一开始我用的是查询方式,但是查询方式得不断查询tf0的值,很繁琐。后来我改用了中断方式,较简单。2、实验中按键扫描及处理部分困扰了我很久。我直接用jd51上的四个按键,其中三个用于调整时、分、显示变化,它们分别接在p3.2、p3.3、p3.5口,第一个问题是调整出现误差,开关存在抖动现象,通过调用延时子程序、确认按键程序消除开关抖动现象;同时,由于延时太长,导致显示出现闪烁或灭掉,最后解决的方法是在延时程序内部也加入调用显示程序的语句,这样

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论