单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(26页珍藏版)》请在冰点文库上搜索。
![单片机课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/21/a3ab6cf8-990f-4bbc-be84-69cf00edd2e3/a3ab6cf8-990f-4bbc-be84-69cf00edd2e31.gif)
单片机课程设计报告
单片机课程设计报告
题目:
电子日历和电子表
2003级自动化一班
郭珍珍2003080901
邓 明2003080931
指导老师:
张东波
完成日期:
2006年6月15日
.设计题目:
电子日历和电子表
.设计要求:
1.利用8031作为主控器组成一个电子日历和电子表;
2.上电或RESET后能自动显示当前时间(时:
分),首次上电复位显示为0时0分;以后各次均显示正确的当前时间;
3.利用4个LED显示管分时显示当前时间和日历;
4.利用尽可能少的小键盘(开关)实现
1)校正日历和时间,即当前的日历和时间输入计算机
2)显示选择:
时分显示/日历显示/报警显示
3)报警时间的设置
5.利用发光二极管作为报警指示,当报警时间到,二极管发光。
三.系统设计方案(简略):
在本次课程设计中经过我们的认真研究我们决定采用8031内部的定时/计数器T0作为时间基准,工作在定时状态时每隔100MS产生一次中断,每10次中断秒计数器加1。
由于本实验的CPU晶振频率是6MHZ,所以定时器T0的时间常数是3CB0H,即TH0=3CH,TL0=BOH。
以此作为电子日历和电子表的基本计时器。
时间常数=65536-6000000*0.1*(1/12)=15536=3CB0H
对于共阴极LED显示利用8155的动态扫描显示,8031的P0口的输出显示送到8155的地址AD口。
8155的PA,PB口输出。
PB口为显示管段输出口,通过驱动芯片7407接LED的a-d.p位。
输出相应的段码,PA口为显示管位输出口,它的PA0到PA3通过驱动芯片7406作为相应的位码输出。
利用两个开关L分别接8031的P1.0,P1.1对电子钟和电子日历的显示状态进行控制,并且完成相应的调时以及报警定时工作。
利用发光二极管接到8031的P3.0口,当报警时间到将P3.0置1完成报警显示
四.元件清单:
8155 一片 7407两片
7406 一片 开 关两个
LED共阴极数码管四个 发光二极管一个
面包板一个 万用表一个
仿真头一个 拔线钳一把
镊子一把细导线若干
剪刀一把
五.设计原理图:
六.电气结构图:
七.使用说明书:
按键0的功能:
1、实现显示模式的转换:
不按时是显示时、分(时间)。
按下第一次是显示日、 月(日历)。
按下第二次是显示报警时、分(报警)。
按下第三次是显示秒、 十分之一秒。
按下第四次显示时、分。
如此进行按键循环
2、在按键1(调整鍵)动作后实现对日历,时间,报警时间的调整。
具体操作为当1键显示要调整的位时,0键实现对这一位的累加,即按下一次示数加一。
按键1的功能:
实现对显示时间(时间、日历、报警时间)要调整的位转换:
1、当前显示时、分时,按键1按下第一次调分位,按下第二次调时位,按下第三次循环到当前显示状态,不能调整。
2、当前显示日、月时,按键1按下第一次调日位,按下第二次调月位,按下第三次循环到当前显示状态,不能调整。
3、当前显示报警时、分时,按键1按下第一次调分位,按下第二次调时位,按下第三次循环到当前显示状态,不能调整。
在按键1的基础上通过按键0来实现调整。
八.软件设计:
主程序流程图:
时间中断子程序流程图:
显示子程序流程图:
0号键处理子程序流程图:
1号键处理子程序流程图:
程序清单
DISBUFEQU30H
BUF EQU20H
SECBUFEQU21H
MINBUFEQU22H
HOUBUFEQU23H
DAYBUFEQU24H
MONBUFEQU25H
ALARMMINEQU26H
ALARMHOUEQU27H
TEMP_BUF1EQU28H
TEMP_BUF2EQU29H
DISP_STATUSEQU2AH
CHG_BITEQU2BH
ALARMINGEQU2CH
KEYBUFEQU2DH
P_CONEQU7F00H
PORT_AEQU7F01H
PORT_BEQU7F02H
MODE1EQU0
MODE2EQU1
MODE3EQU2
MODE4EQU3
HOUCHGEQU4
MINCHGEQU5
MONCHGEQU6
DAYCHGEQU7
AHOUCHGEQU8
AMINCHGEQU9
ORG8000H
LJMPSTART
ORG8003H
LJMPINT_KEY0
ORG800BH
LJMPCLOCK
ORG8013H
LJMPINT_KEY1
ORG8030H
START:
MOVSP,#60H
MOVDPTR,#P_CON
MOVA,#03H;8155初始化PA,PB同为输出口
MOVX@DPTR,A
MOVA,#00H
MOVR1,#04H
MOVR0,#DISBUF
LP1:
MOV@R0,A
INCR0
DJNZR1,LP1
ANLTMOD,#0F0H
ORLTMOD,#01H
MOVTL0,#0B0H
MOVTH0,#3CH ;定时器0置初值
MOVBUF,#00H
MOVMINBUF,#00H
MOVHOUBUF,#00H;时间设初值00时00分
MOVDAYBUF,#01H
MOVMONBUF,#01H;日历设初值01月01日
MOVALARMMIN,#30H
MOVALARMHOU,#00H;报警时间设初值00时30分
MOVKEYBUF,#00H
SETBTR0
SETBET0;开中断0
SETBEA
SETBEX0
SETBEX1
SETBIT0
SETBIT1
CLRP3.0
MOVDISP_STATUS,#1
MOVCHG_BIT,#0
DISP1:
MOVA,DISP_STATUS
CJNE A,#1,DISP2
MOVTEMP_BUF1,HOUBUF
MOVTEMP_BUF2,MINBUF;时间放置暂时显示缓冲单元
SJMPDISP5
DISP2:
CJNE A,#2,DISP3
MOVTEMP_BUF1,MONBUF
MOVTEMP_BUF2,DAYBUF;日历放置暂时显示缓冲单元
SJMPDISP5
DISP3:
CJNE A,#3,DISP4
MOVTEMP_BUF1,ALARMHOU
MOVTEMP_BUF2,ALARMMIN;报警时间放置暂时显示缓冲单元
SJMPDISP5
DISP4:
CJNE A,#4,DISP5
MOVTEMP_BUF1,SECBUF
MOVTEMP_BUF2,BUF;秒放置暂时显示缓冲单元
DISP5:
LCALLDISPLAY;调用显示子程序
ACALLIS_KEY0;调用判断按键0子程序
JCNEXT_KEY1;无按下转按键1的判断
MOVR7,#0FH
KEY0:
ACALLDISPLAY
ACALLIS_KEY0;调用15次显示子程序对按键进行消抖
JCNEXT_KEY1
ACALLINT_KEY0;按键0按下则执行按键0子程序
NEXT_KEY1:
ACALLIS_KEY1;调用判断按键1子程序
JCDISP1
MOVR7,#0FH
KEY1:
ACALLDISPLAY
ACALLIS_KEY1
JCNEXT_KEY1
ACALLINT_KEY1;按键1按下则执行按键1子程序
SJMPDISP1
IS_KEY0:
MOV P1,#0FFH;判断按键0子程序
MOVC,P1.0
RET
IS_KEY1:
MOV P1,#0FFH;判断按键1子程序
MOVC,P1.1
RET
DISPLAY:
MOV R0,#DISBUF;显示子程序
MOVA,TEMP_BUF1
SWAPA
ANLA,#0FH
MOV@R0,A
INCR0
MOVA,TEMP_BUF1
ANLA,#0FH
MOV@R0,A
INCR0
MOVA,TEMP_BUF2
SWAPA
ANLA,#0FH
MOV@R0,A
INCR0
MOVA,TEMP_BUF2
ANLA,#0FH
MOV@R0,A
INCR0
ORG_DISPLAY:
MOVR0,#DISBUF+3
MOVR2,#08H
MOVR1,#0
DIS_LP:
MOVDPTR,#SEG_TAB
MOVA,@R0
MOVC A,@A+DPTR
MOVR3,CHG_BIT
CJNE R3,#1,CC1
CJNE R1,#1,CC1
ORLA,#80H
CC1:
CJNER3,#2,CB1
CJNER1,#3,CB1
ORLA,#80H
CB1:
MOVDPTR,#PORT_B
MOVX@DPTR,A
MOVDPTR,#PORT_A
MOVA,R2
MOVX@DPTR,A
MOVR3,#00H
DJNZR3,$
DECR0
MOVA,R2
RRA
MOVR2,A
JNBACC.7,DIS_LP
RET
SEG_TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
CLOCK:
MOVTL0,#0B0H;时间子程序
MOVTH0,#3CH
PUSHPSW
PUSHACC
MOVA,ALARMING;报警时间处理
CJNE A,#1,NEXT1
NEXT1:
JCNEXT2
DJNZ ALARMING,NEXT2;报警时间延时
CLRP3.0
NEXT2:
MOVA,BUF
ADDA,#01H
MOVBUF,A
CJNE A,#0AH,C_ALARM
MOVBUF,#00H
MOVA,SECBUF
ADDA,#01H;1/10秒满10次清零,秒加1
DAA
MOVSECBUF,A
CJNE A,#60H,C_ALARM
MOVSECBUF,#00H
MOVA,MINBUF
ADDA,#01H;满60秒,秒清零,分加1
DAA
MOVMINBUF,A
CJNE A,#60H,C_ALARM
MOVMINBUF,#00H
MOVA,HOUBUF
ADDA,#01H;满60分,分清零,时加1
DAA
MOVHOUBUF,A
CJNE A,#24H,C_ALARM
MOVHOUBUF,#00H
MOVA,DAYBUF
ADDA,#01H;满24小时,时清零,天加1
DAA
MOVDAYBUF,A
MOVA,MONBUF
FEB:
CJNE A,#02H,NO2;判断月份,不是2月转NO2子程序
MOVA,DAYBUF
CJNE A,#29H,C_ALARM
D1:
MOVDAYBUF,#00H
MOVA,MONBUF
ADDA,#01H;是2月满28天,日为1月进1
DAA
MOVMONBUF,A
NO2:
CJNE A,#01H,D2;不是1月转D2
B1:
MOVA,DAYBUF
CJNE A,#32H,C_ALARM
AJMPD1;是1月满31天,日为1月进1
D2:
CJNE A,#03H,D3;不是3月转D3
AJMPB1;是3月满31天,日为1月进1
D3:
CJNE A,#05H,D4;不是5月转D4
AJMPB1;是5月满31天,日为1月进1
D4:
CJNE A,#07H,D5;不是7月转D5
AJMPB1;是7月满31天,日为1月进1
D5:
CJNE A,#08H,D6;不是8月转D6
AJMP B1;是8月满31天,日为1月进1
D6:
CJNE A,#10H,D7;不是10月转D7
AJMPB1;是10月满31天,日为1月进1
D7:
CJNE A,#12H,D8;不是12月转D8
AJMPB1;是12月满31天,日为1月进1
D8:
MOVA,DAYBUF
CJNE A,#31H,C_ALARM
AJMPD1;是4,6,9,11月满30天,日为1月进1
D9:
CJNE A,#13H,C_ALARM
MOVMONBUF,#01H;满12月,月为1
C_ALARM:
MOV A,ALARMHOU;报警时间判断
CJNE A,HOUBUF,INT_DONE
MOVA,ALARMMIN
CJNE A,MINBUF,INT_DONE
SETBP3.0;报警时间和当前时间一致就点亮二极管
MOVALARMMING,#10;二极管点亮一分钟
INT_DONE:
POPACC
POPPSW
RETI;时间中断处理完毕
INT_KEY0:
MOVA,KEYBUF;按键0功能子程序
CJNE A,#MODE1,N01
MOVDISP_STATUS,#2;按键0按下一次显示日历
INCKEYBUF
AJMPEXIT
N01:
CJNEA,#MODE2,N02
MOVDISP_STATUS,#3;按键0再按下一次显示报警时间
INCKEYBUF
LJMPEXIT
N02:
CJNEA,#MODE3,N03
MOVDISP_STATUS,#4;按键0再按下一次显示秒钟
INCKEYBUF
LJMPEXIT
N03:
CJNEA,#MODE4,N04
MOVDISP_STATUS,#1;按键0按下一次返回显示时间
INCKEYBUF
LJMPEXIT
N04:
CJNEA,#HOUCHG,N05
MOVA,HOUBUF;调时间的小时状态
INCA;按下按键0对小时加1
DAA
MOVHOUBUF,A
CJNEA,#24H,TT1
TT1:
JCEXIT
MOVHOUBUF,#0;小时满24时清零
SJMPEXIT
N05:
CJNEA,#MINCHG,N06
MOVA,MINBUF;调时间的分钟状态
INCA;按下按键0对分钟加1
DAA
MOVMINBUF,A
CJNEA,#60H,TT2
TT2:
JCEXIT
MOVMINBUF,#0;分钟满60分清零
SJMPEXIT
N06:
CJNEA,#MONCHG,N07
MOVA,MONBUF;调日历的月份状态
INCA;按下按键0对月份加1
DAA
MOVMONBUF,A
CJNEA,#13H,TT3
TT3:
JCEXIT
MOVMONBUF,#1;月份满12月置1
SJMPEXIT
N07:
CJNEA,#DAYCHG,N08
MOVA,DAYBUF;调日历的天状态
INCA;按下按键0对天加1
DAA
MOVDAYBUF,A
CJNEA,#32H,TT4
TT4:
JCEXIT
MOVDAYBUF,#1;天满31天置1
SJMPEXIT
N08:
CJNEA,#AHOUCHG,N09
MOVA,ALARMHOU;调报警时间的小时状态
INCA;按下按键0对报警时加1
DAA
MOVALARMHOU,A
CJNEA,#24H,TT5
TT5:
JCEXIT
MOVALARMHOU,#0;小时满24时清零
SJMPEXIT
N09:
CJNEA,#AMINCHG,EXIT
MOVA,ALARMMIN;调报警时间的分钟状态
INCA;按下按键0对报警分加1
DAA
MOVALARMMIN,A
CJNEA,#60H,TT6
TT6:
JCEXIT
MOVALARMMIN,#0;分满60分清零
EXIT:
RET
INT_KEY1:
MOVA,KEYBUF;按键1功能子程序
CJNEA,#MODE1,N11
MOVKEYBUF,#MINCHG;在时间模式时按键1按下一次调分
MOVCHG_BIT,#1
SJMPEXIT1
N11:
CJNEA,#MINCHG,N12
MOVKEYBUF,#HOUCHG;按键1再按下一次调时
MOVCHG_BIT,#2
SJMPEXIT1
N12:
CJNEA,#HOUCHG,N13
MOVKEYBUF,#MODE1
MOVDISP_STATUS,#1;按键1再按下一次显示时间模式
MOVCHG_BIT,#0
SJMPEXIT1
N13:
CJNEA,#MODE2,N14;在日历模式时按键1按下一次调日
MOVKEYBUF,#DAYCHG
MOVCHG_BIT,#1
SJMPEXIT1
N14:
CJNEA,#MINCHG,N15;按键1再按下一次调月
MOVKEYBUF,#MONCHG
MOVCHG_BIT,#2
SJMPEXIT1
N15:
CJNEA,#HOUCHG,N16
MOVKEYBUF,#MODE2
MOVDISP_STATUS,#2;按键1再按下一次显示日历模式
MOVCHG_BIT,#0
SJMPEXIT1
N16:
CJNEA,#MODE3,N17
MOVKEYBUF,#AMINCHG;按键1按下一次调报警分
MOVCHG_BIT,#1
SJMPEXIT1
N17:
CJNEA,#AMINCHG,N18
MOVKEYBUF,#AHOUCHG;按键1再按下一次调报警时
MOVCHG_BIT,#2
SJMPEXIT1
N18:
CJNEA,#AHOUCHG,EXIT1
MOVKEYBUF,#MODE3
MOVDISP_STATUS,#3;按键1再按下一次显示报警时间模式
MOVCHG_BIT,#0
SJMPEXIT1
EXIT1:
RET
END
九.设计结果:
经过为期两个星期的单片机课程设计,我们所做的电子日历和电子表最终比较完美的实现了设计要求。
LED管显示很明显,亮度非常高,走时很精确,其中时间和日历还有报警时间的设定以及调整都能很好的实现。
在设计的过程中,我们还多加了一个显示功能,即秒和1/10秒的显示,使得时间显示得更加完美。
报警时间设定为一分钟,也就是说当报警时间和当前时间一致时,发光二极管可以持续点亮一分钟。
但在本次的设计中还存在一些不足之处:
我们为了程序设计的进度,忽略了闰年的情况,将二月都定为了28天。
并且在时间和日历的调整上每月都可以调到31天。
除此之外其他方面都很正常。
十.心得体会:
经过一个多星期的努力,我和邓明的课程设计——电子日历和电子表,终于
获得圆满的结果,看着电子日历和电子时钟正常的跳动,我的心理有着说不出的
高兴,任何事情的成功都来的不容易,我们的课程设计的这个小小成功也经过了
困难和艰辛的付出。
在这次课程设计中我主要负责的是硬件电路的设计,首先是原理图的设计,之前做过单片机实验,所以我们对8155、74LS06、74LS07、LED显示管等并不陌生,认真的研究过本课题的要求后,我们还是有个整体的思路,经过我和同组的邓明的商量后,我们把原理图较快的画了出来,并在老师的检查下拿到了设计所需器材等。
接下来就是根据原理图接线了,由于女孩子比较细心,所以我就负责接线,当然同组的同学就负责软件的设计,面包板和以前做数电和模电课程设计不同的是不用焊接,但是这次的面包板是用螺丝固定的,可是有些螺丝掉了,我只好用导线把它们固定起来,这也为后来留下了隐患,设计的原理图和实际的接线是有一定区别的,接线时一定要合理布线,讲求美观,有个全面的考虑,说和写容易,但是当真正动手操作的时候并不是一件简单的事,要把用到的线尽量都用镊子夹成直线,做到地线用黑色,电源线用红色,其他的用黄色,有时候布置一根线都要思考良久,线路接好容易,要在好的基础上整体感觉合理、美观可不容易,但是,我还是尽我最大的努力做到了。
下一步的工作是调试,在实验室,我拿着万用表测试一根根的导线以及芯片和数码管,调试过程中发现了两个问题:
有个数码管不能正确显示,面包板的一条接触不良,等换了一下数码管和重新接了面包板的一条后,在正确的程序下,我们的结果显示的很好!
这次的课程设计使我受益匪浅,不仅对单片机的理论知识有了比较全面的认识,对自己动手能力也有很大的提高,最重要的是,真实接触到自己做出来的电子日历和电子表,使我对自动化专业有了更高的兴趣。
郭珍珍
通过为期两天的单片机课程设计,我学到了不少课本上学不到的知识与方法,尤其重要的是这次的设计是真正意义上的由我们组独立完成的课程设计,这就在很大程度上提高了我们的实际分析能力、解决问题的能力、组员合作的能力,同时在很大方面也锻炼了我们的动手操作能力。
总的来说,收获是不小的,具体如下:
1、使我深刻地理解了理论联系于实际并运用于实际的这一说法。
这次的设计题目不是很难,相对来说比较容易上手,但由于要实现的功能较多,因此在具体的设计中就有很多问题摆在了我们的面前。
我主要是负责软件设计方面,而正是如此,所要求的理论知识是很多的,并且程序的好坏决定了本次设计的成败,来不得半点马虎。
为了更好地实现软件设计,我从图书馆借来了许多与单片机有关的教材和资料,也从网上下载了一些相关信息和资料,充分学习在本次设计中所要用到的理论知识,并结合具体的问题有针对性地解决了各种程序难题。
2、实际分析、解决问题的能力得到了提高。
当我们的硬件和软件设计好后,最重要的就是调试了。
在调试过程中问题是层出不穷的,这就需要我们耐心、认真地一一较对、分析,找到解决的办法。
我记得在第一次调试时,我们的面包板在运行过程中没有丝毫反应,为了检查线路,只好用万用表对每一个芯片的引脚,每一根导线进行测量,并对照接线图仔细检查,有些地方甚至检查了4遍,最后发现原来是仿真头接触不良,导致8031对8155不能进行实时控制。
经验的不足可能会导致设计的进程,但只有当我们及时地发现并解决问题时,经验才会丰富,能力才会得到提升。
3、组员之间的团结合作使得设计进展得很顺利。
当我和郭珍珍在拿到题目后,两人认真研究了题目,并做出几个合理的方案,从中我们选出最佳方案。
方案确定后,我主要负责程序设计方面,而她负责硬件接线,两人各领其职,相互合作,比较顺利地完成了初步任务,在以后的