单片机大作业报告.doc_第1页
单片机大作业报告.doc_第2页
单片机大作业报告.doc_第3页
单片机大作业报告.doc_第4页
单片机大作业报告.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

单片机论文题目: 电子实时时钟/万年日历系统专 业: 学生姓名: 提交日期 : 2009 年 12 月 14 日单片机实验报告一实验目的:课程标志性内容的设计理解和综合运用,鼓励独立性设计和功能扩展的创新实践。二功能要求:1 基本要求:(1) 显示准确的北京时间(时、分、秒),可用24小时制式;(2) 随时可以调校时间。(3) 增加公历日期显示功能(年、月、日),年号只显示最后两位;(4) 随时可以调校年、月、日;(5) 允许通过转换功能键转换显示时间或日期。2 发挥部分:(1) 减少按键个数三方案考虑:1 硬件方案 (1) 显示器采用6位LED数码管(共阳),可分别显示时间或日期;(2) 显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。可采用74LS244或者晶体管;(3) 使用五个按键,分别控制模式、调整、复位。2 软件方案 设计思路:a “时钟”准时间由单片机内部的定时中断提供,定时时间是“秒”的整除数,长短适宜。最长不超过16位定时器的最长定时时间;最短不少于中断服务程序的执行时间。通常基准时间越短,越有利于提高时钟的运行精确度。我们的实验定时10mS。b 用一个计数器(例如用片内RAM的41H单元)对定时中断的次数进行计数,从而可以实现“秒”定时,同理可以实现“分”定时和“时”定时,甚至于“日”、“月”、“年”定时。c LED数码管显示器采用“动态扫描驱动”时要注意:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。d 动态扫描显示方式在更新显示内容时,因LED数码管余辉的存在可能会造成显示字符的模糊,新内容写入显示器之前须将所有的LED数码管熄灭。e 关于自动识别“月大、月小”和“平年、润年”问题的考虑: 月大、月小:17月:逢单月为31天;逢双月为30天,其中2月另行处理。812月:逢单月为30天;逢双月为31天。 平年、闰年:仅仅处理2月份的天数:平年的2月份天数为28天,闰年的2月份天数为29天。4、 元器件清单序号器件名称型号数量/组1ICS5212IC座40脚13IC座20脚14IC7424415LED七段数码管共阳BS66晶体振荡器12MHz17独立式按钮4脚58晶体三极管PNP69电阻3K610电阻3301111瓷片电容30PF212电解电容10UF1135V稳压电源个114万用表个115万用板块116电烙铁把117剪线钳把118镊子把119一字小螺丝批把120焊锡3米1213-4种色导线各1米15、 电路图6 程序说明:程序中使用的地址标志说明:7FH:Flag1,当flag1=0时表示显示时间,当flag1=1时表示显示日期7EH:flag11,表示选中日期显示的年、月、日中的哪一位的标志位30H:flag2,表示选中时间显示的时、分、秒中的哪一位的标志位31H:flagn,表示判断平年、闰年的标志位32H、33H:与秒的两位显示有关34H、35H:与分的两位显示有关36H、37H:与时的两位显示有关3BH、3CH:与日的两位显示有关3DH、3EH:与月的两位显示有关3FH、40H:与年的两位显示有关38H、39H、3AH:分别存放秒、分、时内容43H、44H、45H:分别存放日、月、年内容41H:存放秒定时器的计数次数42H:用做数码管位选以下为程序流程图:源程序:; 程序开始ORG 0000H;初始化入口LJMPBEGIANORG000BH ;中断入口LJMPIRQ;调中断子程序 ORG0020H ;主程序开始地址;初始化程序;将数据区和标志位都进行初始化flag10;flag110;flag20;flagn0;32H3AH,3CH,3EH,40H都为00HBEGIAN:CLR 7FH ;flag1显示日期或者时间的标志取值0,1 CLR 7EHCLR 31HCLR 30H CLRA ;MOVTMOD,#01H ;设置T0工作方式 MOVR0,#30H ;标志和数据缓冲区清零MOV B , #11H ;LOP1:MOVR0,AINCR0DJNZB,LOP1MOV3BH,#01H;日期为1日MOV43H,#1MOV3DH,#01H;月份为1月MOV44H,#1 MOV 3FH , #09H ;年份为05年 MOV 45H , #9 MOV41H,#100 ;秒定时计数器计数初值MOVTH0,#0D8H;T0定时10mS时间常数MOVTL0,#0F0H;(Fosc=12MHz)SETBTR0 ;启动T0计数 SETBET0 ;允许T0中断 SETBEA ;开系统中断; 初始化结束; 检查有无键按下(这里作为主程序);没有键按下就调用显示子程序;有键按下就判断是哪个键按下,然后调用相应;子程序,各个子程序返回后重新检查有无键按下;如此循环KEYCHK: MOV A , P1 ;读键盘 CJNE A , #0FFH , LOP2 ;有键按下则转 LCALL DISPLAY ;用来显示时间或日期 SJMP KEYCHK ;转回去读键盘LOP2: MOV R3 , A ;保键号WAIT:MOV A ,P1 CJNE A , #0FFH , WAIT ;没有松键就等MOVA , R3 JNBACC.0,LOP4;第零键按下就转JNBACC.1,LOP5;第一键按下就转JNBACC.2,LOP6;第二键按下就转JNB ACC.3 , LOP20 ;第三键按下就转SJMPKEYCHK;不是所要的按键就转LOP4:LCALLKEY0;调第零键功能子程序 SJMP KEYCHKLOP5:LCALLKEY1;调第一键功能子程序 SJMP KEYCHKLOP6:LCALLKEY2;调第二键功能子程序 SJMP KEYCHKLOP20: LCALL KEY3 SJMPKEYCHKRET;主程序到此结束;DISPLAY子程序;判断flag1,为0就调用tTIME子程序;为1就调用DATE子程序DISPLAY:JB7FH,LOP7;flag11就转LCALLTIME;调用time子程序RETLOP7:LCALLDATE;调用date子程序RET;KEY0子程序;按下此键用于切换显示时间或者显示日期;按一下key0键,flag1取反;接着判flag1是0还是1;然后调用相应子程序KEY0:CPL7FH;flag1取反JB7FH,LOP8;flag1=1转去调dateLCALLTIME;flag10调timeRETLOP8:LCALLDATE;调用date子程序RET;KEY1子程序;判flag1;为1则flag11取反,返回;为0则flag2加1,接着判flag22否?;是的话flag2返回0值返回,否的话直接返回KEY1:JB7FH,LOP9;flag11就转MOVA,30HADDA,#1MOV30H,A;flag2+1CJNEA,#3,LOP10;flag2不等3就转MOVA,#0;flag2大于2则回0MOV30H,A;送回flag2标志RETLOP9:MOV A, 7EH ADD A , #1MOV 7EH,A CJNE A,#3, LOP10 ;flag11不等于3就转 MOV A,#0 ;flag11大于2就回0 MOV 7EH,A ;送回flag11标志LOP10:RET;KEY2子程序;若flag1为1,先判flag11;如果flag11为0,则日期加1;如果flag11为1,;则月份加1;然后调用DATE子程序;若flag1为0,先判flag2;如果flag2为0,则秒数加1;如果flag2为1,则;分钟加1;如果flag2为2,则小时加1,然后调用TIME子程序KEY2:JB7FH,LOP11;flag11就转NEXT1:MOVA,30H;flag2的值送到ACJNEA,#0,LOP12;不是0就转MOVA,38H;秒+1ADDA,#01HMOV38H,ASJMPLOP16;调用time子程序LOP12:CJNEA,#1,LOP13;不是1就转MOVA,39H;分+1ADDA,#01HMOV39H,ASJMPLOP16;调用time子程序LOP13:MOVA,3AH;时+1ADDA,#01HMOV3AH,ALOP16:LCALLTIME;调用time子程序RETLOP11:MOV A , 7EH CJNE A , #0, LOP14MOVA,43H;日+1ADDA,#01HMOV43H,ASJMPLOP15;调用DATE子程序LOP14:CJNE A ,#1, LOPYMOVA,44H;月+1ADDA,#01HMOV44H,ACJNEA,#13H,LOP15MOVA,#01HMOV44H,A SJMP LOP15LOPY : MOV A , 45H ADD A , #01H MOV 45H , ALOP15:LCALLDATE;调用DATE子程序RET;KEY3子程序;若flag1为1,先判flag11;如果flag11为0,则日期减1;如果flag11为1,;则月份减1;如果flag11为2,则年份减1;然后调用DATE子程序;若flag1为0,先判flag2;如果flag2为0,则秒数减1;如果flag2为1,则;分钟减1;如果flag2为2,则小时减1,然后调用TIME子程序CLR CKEY3:JB7FH,LOP21;flag11就转NEXT11:MOVA,30H;flag2的值送到ACJNEA,#0,LOP22;不是0就转MOVA,38H;秒-1SUBBA,#01HCLR CMOV38H,ASJMPLOP26;调用TIME子程序LOP22:CJNEA,#1,LOP23;不是1就转MOVA,39H;分-1SUBBA,#01HCLR CDA AMOV39H,ASJMPLOP26;调用TIME子程序LOP23:MOVA,3AH;时-1SUBBA,#01HCLR CDA AMOV3AH,ALOP26:LCALLTIME;调用TIME子程序RETLOP21:MOV A , 7EH CJNE A , #0, LOP24MOVA,43H;日-1SUBBA,#01HCLR CDA AMOV43H,ASJMPLOP25;调用DATE子程序LOP24:CJNE A ,#1, LOPZ MOVA,44H;月-1SUBBA,#01HCLR CDA AMOV44H,ACJNEA,#00H,LOP25MOVA,#12HDA AMOV44H,A SJMP LOP25LOPZ : MOV A , 45H SUBB A , #01HDA A MOV 45H , ALOP25:LCALLDATE;调用DATE子程序RET ;TIME子程序;将位选码初值和显示位数初值送相应单元,字型码表首址送DPTR;显示之前先熄灭显示器;秒,分,时通过38H,39H,3AH送到32H,33H,34H,35H,36H,37H,再从;P0口送到显示器显示TIME:MOV42H,#0DFH;位选码初值送42HMOVR2,#6;显示位数初值送R2MOVDPTR,#LCD;字形码表首址送DPTRMOVR1,#32H;字形码表首址送DPTRGUAN:MOVA,#0FFH;关显示器,位选码为0FFHMOVP2,AMOVP0,A;字形码为0FFH送显示器MOVA,42H;取位选码送P2选位MOVP2,AMOVA,R1MOVCA,A+DPTR;查字型表MOVP0,A;送到P0口显示器LCALLDEL3ms;延时3ms秒MOVA,42H;准备显示下一位码RRA;移位MOV42H,AINCR1;要显示的下一位DJNZR2,GUAN;六位还没显示完就转RET;DATE子程序;将位选码初值和显示位数初值送相应单元,字型码表首址送DPTR;显示之前先熄灭显示器;日期,月份,年份通过43H,44H,45H送到3BH,3CH,3DH,3EH,3FH,40H再从; P0口送到显示器显示DATE:MOV42H,#0DFH;位选码初值送42HMOVR2,#6;显示位数初值送R2MOVDPTR,#LCD;字形码表首址送DPTRMOVR1,#3BH;字形码表首址送DPTRMIE:MOVA,#0FFH;关显示器,位选码为0FFHMOVP2,AMOVP0,A;字形码为0FFH送显示器MOVA,42H;取位选码送P2选位MOVP2,AMOVA,R1MOVCA,A+DPTR;查字型表MOVP0,A;送到P0口显示器LCALLDEL3ms;延时3ms秒MOVA,42H;准备显示下一位码RRA;移位MOV42H,AINCR1;要显示的下一位DJNZR2,MIE;六位还没显示完就转RET;IRQ中断子程序;T0每10ms中断一次,调用此中断子程序一次;够一秒后就重装秒定时;计数器计数初值,并且秒加1;接下来对时间进行BCD码调整,并查询是否;已经超出范围(是的话就复位),且送到相应单元;调整日期和月份,进行;闰年,月份大小等进行判断,作出相应反应后送到相应单元IRQ:MOVTH0,#0D8H;重装时间常数MOVTL0,#0F0HDJNZ41H,IRQ1;未够1秒就转SJMPIRQ2IRQ1:LJMPIRQ3IRQ2:MOV41H,#100;重装秒定时计数器计数初值INC38H;秒+1MOVPSW,#00H;清标志MOVA,38H;调出秒数DAA;BCD调整MOV38H,A;38H已经是BCD码CJNEA,#60H,LOP17;小于60秒则转MOVA,#00H;等于60秒就变为0MOV38H,A;38H已经是BCD码INC39H;分+1LOP17:MOVPSW,#00H;清标志位MOVA,39H;调出分数DAA;BCD调整MOV39H,A;39H已经是BCD码CJNEA,#60H,LOP18;小于60分则转MOVA,#00H;等于60分就变为0MOV39H,A;39H已经是BCD码INC3AH;时+1LOP18:MOVPSW,#00H;清标志位MOVA,3AH;调出时数DAA;BCD调整MOV3AH,A;3AH已经是BCD码CJNEA,#24H,LOP19;小于24时则转MOVA,#00H;等于24时就变为0MOV3AH,A;3AH已经是BCD码INC43H ;日+1LOP19:MOVA,38H;分拆秒ANLA,#0FHMOV32H,AMOVA,38HSWAPAANLA,#0FHMOV33H,AMOVA,39H;分拆分ANLA,#0FHMOV34H,AMOVA,39HSWAPAANLA,#0FHMOV35H,AMOVA,3AH;分拆时ANLA,#0FHMOV36H,AMOVA,3AHSWAPAANLA,#0FHMOV37H,AMOVPSW,#00H;清标志MOVA,43H;将日转成BCD码DAAMOV43H,AMOVPSW,#00H;清标志MOVA,44H;将月转成BCD码DAAMOV44H,ACJNEA,#02H,YUE1;不是2月就转MOVA,31H;是否闰年(flagn0)CJNEA,#0,YUE2;平年就转MOVA,43H;闰年CJNEA,#30H,YUE3;不是29日就转YUE4:MOV43H,#01;日子返回1日MOVA,44H;月+1ADDA,#01HMOV44H,AYUE3:MOVPSW,#00H;清标志MOVA,43H;将日转成BCD码DAAMOV43H,AMOVPSW,#00H;清标志MOVA,44H;将月转成BCD码DAAMOV44H,A MOVPSW,#00H;清标志 MOVA,45H;将年转成BCD码 DAA MOV 45H,A MOVA,43H;分拆日ANLA,#0FHMOV3BH,AMOVA,43HSWAPAANLA,#0FHMOV3CH,AMOVA,44H;分拆月ANLA,#0FHMOV3DH,AMOVA,44HSWAPAANLA,#0FHMOV3EH,A MOVA,45H ;分拆年 ANLA,#0FH MOV3FH,A MOVA,45H SWAPA ANLA,#0FH MOV40H,ARETIYUE2:MOVA,43HCJNEA,#29H,YUE3;小于28日就转SJMPYUE4;大于28日就转YUE1:CJNEA,#04H,YUE5;不是4月就转SJMPYUE9YUE5:CJNEA,#06H,YUE6;不是6月就转SJMPYUE9YUE6:CJNEA,#09H,YUE7;不是9月就转SJMPYUE9YUE7:CJNEA,#11H,YUE8;不是11月就转YUE9:MOVA,43HCJNEA,#31H,YUE3;小于30日就转SJMPYUE4;大于30日就转YUE8:MOVA,43H;是1.3.5.7.8.10.12月CJNEA,#32H,YUE3;小于31日就转MOV43H,#01;日子返回1日MOVA,44H;月+1ADDA,#01HMOV44H,AMOVA,44HCJNEA,#13H,YUE3;小于12月就转MOV44H,#01H;过了12月就恢复1月INC31H;flagn+1MOVA,31HCJNEA,#4,YUE3;flagn不大于3MOVA,#0;flagn大于3恢复为0MOV31H,AMOV A,45HADD A , #01HDA AMOV 45H , ALJMPYUE3IRQ3:RETI;DELl3ms子程序周期次数延迟时间us;延时3msDEL3MS:MOVR4,#6;111DEL1:MOVR5,#230;1230230DJNZR5,$;213802760DJNZR4,DEL1;2612RET;212共3005us约等于3msRET;字符0 9的字形码表(0电平有效)LCD:DB0C0H , 0F9H , 0A4H , 0B0H , 99H,92H,82H,0F8H,80H,90H;字型表END;程序到此结束七、系统使用与调试说明开关功能如下: Key0: “年月日显示”与“时分秒显示”的切换控制键。 Key1: “年月日显示”或“时分秒显示”的“年/月/日”或“时/分/秒”的选位键。Key2:“年/月/日”或“时/分/秒”每个位的加位键。Key3:“年/月/日”或“时/分/秒”每个位的减位键。Key4:系统复位键,所有数值清零,从09年1月1日00:00:00开始显示。通电后,系统初始化,数码管显示时间;按一次key0转为显示日期;在其中的状态中,可用key1选择调整对象,按一次为调整秒/日,按两次为调整分/月,按三次为调整时/年,按四次则回到未按key1时的状态。八心得与体会1、 通过此次实验,我们对”实际动手能力”有了更深刻的理解。起初我们先构思电路及设计程序,然后再在proteus上实现仿真,本以为一切顺利到底的,直到硬件设计和调试部分,才发现问题大有所在。例如:1)刚开始我们在调试电路时总发现数码管有些段不亮,我们熬夜检测,终于发现是有些飞线只有物理衔接了,并没有化学连接,以致接触不良,有时可以,有时不可以,后来我们重新焊接了一些可能接触不良的地方,最后终于能实现数码管显示正常了。2)还有一个问题,就是复位键不起作用,直接给高电平也不能起复位作用,虽然我们反复检查相关电路也没发现问题,但是后来经过高人指点,我们终于解开谜团:原来我们忽略了一个很易容被忽略的问题,就是复位键开关位置接反了,倒是RET直接就短路了,所以即使给它高电平,它也不能收到,故以后与此类似问题,我们都更有经验了。3) 在软件方面遇到的问题:(1)位操作指令:JB和JBC的区别。两者都是(bit)=1的时候就转,但是其实质区别在于对程序状态字的影响。JBC使PSW.6即AC置位为1;而JB则不影响此位。所以在用JBC进行BCD码调整时就会出现低四位加6的情况。后来抓住了问题后换用JB,问题得到解决。(2)在询问秒已经是60秒时,分,时,日,月是否要加1时,使

温馨提示

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

评论

0/150

提交评论