单片机课程设计总结报告参考模板.docx
《单片机课程设计总结报告参考模板.docx》由会员分享,可在线阅读,更多相关《单片机课程设计总结报告参考模板.docx(24页珍藏版)》请在冰豆网上搜索。
单片机课程设计总结报告参考模板
湖州师范学院求真学院
课程设计总结报告
课程名称单片机应用系统设计
设计题目基于STC89C51的数字电子钟设计
专业电子科学与技术
班级080835
姓名张静
学号12
指导教师李祖欣吴小红
报告成绩
求真学院信息与工程系
二〇一一年六月一日
《单片机应用系统设计》课程设计任务书
一、课题名称
《基于STC89C52的数字电子钟设计》
二、设计任务
基本任务:
1.采用STC单片机和键盘,设置4位LED数码管显示的电子时钟;
2.上电时,显示12:
00并且“:
”间隔500ms闪烁,其中“:
”代表秒功能;
3.具有闹钟设定、闹铃功能。
4.通过键盘可修改时间。
发挥任务:
1.实现时钟整点“嘟”声提示功能;
2.实现秒表功能。
秒表具有计时开始,计时结束,计时复位等功能。
三、设计报告撰写规范
单片微机应用系统设计总结报告正文,主要含以下内容(硬件、软件各部分内容也可组合起来进行撰写说明):
1.系统总体设计方案(画出系统原理框图、方案的论证与比较等内容);
2.硬件系统分析与设计(各模块或单元电路的设计、工作原理阐述、参数计算、元器件选择、完整的系统电路图、系统所需的元器件清单。
等内容);
3.软件系统分析与设计(各功能模块的程序设计流程图与说明、软件系统设计、软件抗干扰措施、完整的程序等内容);
4.系统仿真调试与参数测量(使用仪器仪表、故障排除、电路硬件和软件调试的方法和技巧、指标测试的参数和波形、测量误差分析);
5.总结(本课题核心内容及使用价值、电路设计、软件设计的特点和选择方案的优缺点、改进方向和意见等);
6.按统一格式列出主要参考文献。
《基于STC89C51的数字电子钟设计》
课程设计总结报告
一、系统总体方案
本次设计时钟电路,使用了AT89c51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用汇编程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:
键盘、单片机芯片、扬声器、显示屏即可满足设计要求。
如图1-1为数字钟总体设计框图。
本设计的软件程序包括主程序如图1-2、中断子程序如图1-3、打铃子程序、时钟显示子程序、查询时间表切换程序和延时子程序等等。
另外,由于电路中有四个按键,还另外设计了防抖动程序来防止干扰
本设计的硬件包括89c51芯片,+5V电源,共阳八段数码管4个,三极管,电阻若干,导线若干
图1-1数字钟总体设计框图
二、单片机概述
1、AT89c51单片机
●单片机的发展及应用
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
单片机由运算器、控制器、存储器、输入输出设备构成单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
工业方面,仪器仪表方面,消费类电子产品,通信方面,武器装备等。
●单片机的引脚
图1-4单片机的引脚
40个引脚按功能大致可分为4类:
电源、时钟、控制和I/O引脚。
(1)电源:
VCC-芯片电源,接+5V;VSS-接地端;
(2)时钟:
XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。
(3)控制线:
控制线共有4根,
✧ALE/PROG:
地址锁存允许/片内EPROM编程脉冲
①ALE功能:
用来锁存P0口送出的低8位地址
②PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
✧PSEN:
外ROM读选通信号。
✧RST/VPD:
复位/备用电源。
①RST(Reset)功能:
复位信号输入端。
②VPD功能:
在Vcc掉电情况下,接备用电源。
✧EA/Vpp:
内外ROM选择/片内EPROM编程电源。
①EA功能:
内外ROM选择端。
②Vpp功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
(4)I/O线
●单片机的应用注意事项
二、键盘电路
(一)键盘扫描概述
此次用到四个键,即K8,K9,K10,K11键。
K8和K9键分别是加一和减一键,主要是对时钟和闹钟操作。
K11键是对时钟的模式切换,在这里一共有5种模式,当r0=1,对时钟的分加、减一;当R0=2时,对时钟的时加、减一;当R0=3时,对闹钟的分加。
减一;当R0=4时,对闹钟的时加、减一;当R0=5时,切换到秒表功能;当R0=6时,返回实时时钟显示。
K10键是对秒表的模式切换,当R6=1时,关外部中断一;当R6=2时,开外部中断一,开始秒表计时;当R6=3时,关外部中断一,暂停秒表计时。
(二)键盘电路图
(三)工作原理
先对芯片片。
P2.4口置低电平,即表示其接地。
再判断P2.3是否为低电平,若为则R0加一。
反之,判断P2.0是否为低电平,若为则判断其属于哪一个模式,在进行加一操作。
反之,判断P2.1是否为低电平,若为则判断其属于哪一个模式,在进行减一操作。
反之,判断P2.2是否为低电平,若为则判断其属于哪一个模式,进行秒表功能。
反之,返回。
(四)硬件电路注意的问题
在编程时要注意键盘的去抖,所以在判断一个键盘的按下之后,进行一段延时。
(五)程序流程图:
如图1-5
三、显示电路
(一)显示电路概述
我运用四个共阳极LED显示器,且为8段。
并且将所有位的段码线的相应段并联起来,由一个8为I/O口控制,我用的是P0口。
而且各位的共阳极分别有相应的I/O线控制,形成各位的分时选通,这里我运用了P1.7,P1.6,P1.5,P1.4分别作为时的十位,时的个位,分的十位和分的个位选通线。
且当其端口为低电平时,改位选通。
(二)用到的电路图
(三)用到动态扫描工作原理
时间显示是先分个位计算显示,然后是分十位计算显示,再是时个位计算显示,最后是时十位计算显示。
当显示分个位,置P1.4为低电平;当显示分十位,置P1.5为低电平;当显示分时个位,置P1.6为低电平;当显示时十位,置P1.7为低电平。
(四)硬件电路注意的问题
要注意你运用的LED显示器,是共阳极的还是共阴极的,在设置TAB表。
(五)程序流程:
如图1-6
(六)、编程注意点
设置TAB表时,要注意有两个LED显示器是反过来的,它的TAB表要根据实际情况自己计算而得。
否则显示器的显示值就是错误的。
四、蜂鸣器
(一)蜂鸣器电路概述
蜂鸣器电路,由P3.2口控制,当定时的闹钟时间和实时时钟显示时间相同时,则置P3.2口为低电平。
此时三极管导通,蜂鸣器响。
(二)蜂鸣器电路
五、系统调试
(一)所需软件:
①PL2303驱动软件包;
②各类文本编辑器软件,如Eidt,记事本等,编辑汇编语言源程序*.ASM;
③集成环境WAVE6000软件:
将汇编语言源程序编译成*.hex文件(也可直接
在此环境下编辑汇编语言源程序*.ASM);
④官方网站提供的STC-ISP软件(http//www.MCU-M):
将汇编语言源
程序编译成的*.hex文件在线下载到STC单片机中
(二)其调试技巧与方法:
A.测试与计算机的通信是否正常,即能否正常下载;
B.测试LED和LED数码管各段是否正常;
C.测试蜂鸣器是否正常发声;
D.测试继电器是否正常吸合与释放;
(三)在调试过程中的问题:
在刚开始程序下载时,串口总是找不到,我们通过修改COM..来下载程序。
下载好后,发现数码管没有反应,我们通过修改程序来解决这个问题。
还有有时按键没有反应,后来发现是接触不好,我们在调试时,把板子放到桌面上来解决这个问题。
六、总结
经过两周的努力,在指导老师的帮助下,终于完成了该电子时钟的课程设计,在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。
此次的数字钟设计重在于编程,通过这次的设计实验更进一步地增强了实验的动手能力。
在设计过程中遇到的问题也是常有发生的,我们能做的就是想办法解决问题。
刚开始时,程序编好后,下载到实验板中模块不能够切换显示,我想了很多方法。
后来在老师的提醒下,我才发现应该对输入的值进行拆分,即拆分成个位和十位。
再送入相应的程序中显示。
最后,在编译秒表功能时,无法实现,后来在老师的指导下,重新添加一个外部中断寄存器,最终解决了这个问题。
这次的课程设计终于完成了,在此次课程设计中我们获益非浅,其过程中遇到了很多编程问题和操作问题,但最终我们克服了。
附录一:
源程序清单
SECONDEQU30H;定义计数存储单元
MBUFEQU31H;定义分计数存储单元
HBUFEQU32H;定义时计数存储单元
MBUF0EQU33H;定义分个位计数存储单元
MBUF1EQU34H;定义分十位计数存储单元
HBUF0EQU35H;定义时个位计数存储单元
HBUF1EQU36H;定义时十位计数存储单元
DPBIT24H.3;定义半秒闪烁位单元
naosequ40h;定义闹钟分计数存储单元
naofequ41h;定义闹钟时计数存储单元
nmBUF0EQU42H;定义闹钟分个位计数存储单元
nmBUF1EQU43H;定义闹钟分十位计数存储单元
nHBUF0EQU44H;定义闹钟时个位计数存储单元
nHBUF1EQU45H;定义闹钟时十位计数存储单元
NMBUF01equ70h;定义秒时个位计数存储单元
NMBUF11equ71h;定义秒时十位计数存储单元
miaoequ72h;定义秒毫秒计数存储单元
nnhbufequ73h;;定义秒计数存储单元
nnhbuf0equ74h;定义秒时个位计数存储单元
nnhbuf1equ75h;定义秒时十位计数存储单元
ORG0000H
LJMPMAIN
ORG000BH
ljmpitop
org001Bh
ljmpitop1
ORG0100H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;主程序;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;
MAIN:
MOVTL0,#0b0H
MOVTH0,#3cH
movtmod,#11h
movtl1,#0f0h
movth1,#0d8h
setbet0
setbet1
setbea
MOVR2,#20
movr0,#00
movr6,#00h
MOVMBUF0,#0
MOVMBUF1,#0
MOVHBUF0,#2
MOVHBUF1,#1
MOVnMBUF0,#0
MOVnMBUF1,#0
MOVnHBUF0,#0
MOVnHBUF1,#0
MOVMBUF,#00H
MOVHBUF,#12H
MOVnaof,#00H
MOVnaos,#00H
SETBTR0
LOOP:
NOP
acallkey调用键盘扫描程序
ACALLDISP调用显示程序
lcallbb调用闹钟程序
AJMPLOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;中断程序;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
itop:
PUSHACC;中断1
MOVTL0,#0b0H
MOVTH0,#3cH
DJNZR2,INT03
MOVR2,#20中断20次,每次中断时间50ms
CPLDP
DJNZSECOND,OUTT0秒减完不为0,则跳到outto,
MOVSECOND,#60对秒重新赋初值,60
ACALLADD1调用add1
AJMPOUTT0
INT03:
MOVA,R2
CJNEA,#20,OUTT0
CPLDP
OUTT0:
POPACC
RETI
itop1:
PUSHACC;中断2
movtl1,#0f0h
movth1,#0d8h
ACALLADD2
AJMPOUTT1
OUTT1:
POPACC
RETI
ADD1:
MOVA,mbuf;分十进制加1子程序,
ADDA,#01
DAA十进制转换为bcd码
MOVmbuf,A
CJNEA,#60h,ADD13;判断分十位是否到六十,若未到60,跳转到ADD13
Clrp3.2
Lcalldelay2
Setbp3.2
MOVMBUF0,#0
MOVMBUF1,#0
MOVMBUF,#0
MOVA,HBUF
ADDA,#01;时十进制加一
DAA
MOVHBUF,A
ADD13:
MOVA,MBUF
ANLA,#0FH;分值拆成分个位和分十位
MOVMBUF0,A
MOVA,MBUF
SWAPA;高四位与第四位转换
ANLA,#0FH
MOVMBUF1,A
MOVA,HBUF
CJNEA,#24H,ADD14;判断时是否到24,若未到24,跳转到ADD14
MOVHBUF0,#0
MOVHBUF1,#0
MOVHBUF,#0
ADD14:
MOVA,HBUF
ANLA,#0FH;时值拆成时个位和时十位
MOVHBUF0,A
MOVA,HBUF
SWAPA
ANLA,#0FH
MOVHBUF1,A
RET
ADD131:
MOVA,NAOF
ANLA,#0FH;闹钟分值拆成分个位和分十位
MOVNMBUF0,A
MOVA,NAOF
SWAPA;高四位与第四位转换
ANLA,#0FH
MOVNMBUF1,A
ret
ADD141:
MOVA,NAOS
ANLA,#0FH;闹钟时值拆成时个位和时十位
MOVNHBUF0,A
MOVA,NAOS
SWAPA
ANLA,#0FH
MOVNHBUF1,A
RET
ADD2:
MOVA,MIAO;毫秒十进制加1子程序,
ADDA,#01
DAA
MOVMIAO,A
CJNEA,#100h,ADD15;判断毫秒是否到100,若未到100,跳转到ADD15
MOVNMBUF01,#0
MOVNMBUF11,#0
MOVMIAO,#0
MOVA,NNHBUF
ADDA,#01;秒十进制加一
DAA
MOVNNHBUF,A
ADD15:
MOVA,miao
ANLA,#0FH;毫秒拆成个位和十位
MOVnMBUF01,A
MOVA,miao
SWAPA;高四位与第四位转换
ANLA,#0FH
MOVnMBUF11,A
MOVA,nnHBUF
CJNEA,#60H,ADD16;判断时是秒否到60,若未到60,跳转到ADD16
MOVnnHBUF0,#0
MOVnnHBUF1,#0
MOVnnHBUF,#0
ADD16:
MOVA,nnHBUF
ANLA,#0FH;秒拆成时个位和时十位
MOVnnHBUF0,A
MOVA,nnHBUF
SWAPA
ANLA,#0FH
MOVnnHBUF1,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;时钟显示程序;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
CJNER0,#00H,L1
LCALLDISP2
L1:
CJNER0,#01H,L2
lcalladd13将时拆成个位与十位
LCALLDISP4;调用时钟时显示
L2:
CJNER0,#02H,L3
lcalladd14
LCALLNEXT;调用时钟分显示
L3:
CJNER0,#03H,L4
lcalladd131
LCALLDISP41;调用闹钟时钟分显示
L4:
CJNER0,#04H,l5
lcalladd141
LCALLNEXT1
l5:
cjner0,#05h,exit
lcalldisp3
exit:
ret
DISP2:
MOVDPTR,#TAB2
MOVA,MBUF0
ACALLDSPM0
MOVDPTR,#TAB2
MOVA,MBUF1
ACALLDSPM1
MOVDPTR,#TAB1
MOVA,HBUF0
ACALLDSPH0
MOVDPTR,#TAB1
MOVA,HBUF1
ACALLDSPH1;调用时十位显示子程序
RET
DISP3:
MOVDPTR,#TAB2
MOVA,nMBUF01
ACALLDSPM0
MOVDPTR,#TAB2
MOVA,nMBUF11
ACALLDSPM1
MOVDPTR,#TAB1
MOVA,nnHBUF0
ACALLDSPH0
MOVDPTR,#TAB1
MOVA,nnHBUF1
ACALLDSPH1;调用时十位显示子程序
RET
DISP4:
MOVDPTR,#TAB2;修改时钟分
MOVA,MBUF0
ACALLDSPM0
MOVDPTR,#TAB2
MOVA,MBUF1
ACALLDSPM1
RET
NEXT:
MOVDPTR,#TAB1;修改时钟时
MOVA,HBUF0
ACALLDSPH0
MOVDPTR,#TAB1
MOVA,HBUF1
ACALLDSPH1
RET
DISP41:
MOVDPTR,#TAB2;修改闹钟分
MOVA,NMBUF0
ACALLDSPM0
MOVDPTR,#TAB2
MOVA,NMBUF1
ACALLDSPM1
RET
NEXT1:
MOVDPTR,#TAB1;修改闹钟时
MOVA,NHBUF0
ACALLDSPH0
MOVDPTR,#TAB1
MOVA,NHBUF1
ACALLDSPH1
RET
DSPM0:
MOVCA,@A+DPTR;分个位显示子程序
MOVP0,A
CLRP1.4
ACALLDY1MS
SETBP1.4
RET
DSPM1:
MOVCA,@A+DPTR;分十位显示子程序
MOVP0,A
CLRP1.5
ACALLDY1MS
SETBP1.5
RET
DSPH0:
MOVCA,@A+DPTR;时个位显示子程
MOVC,DP
MOVACC.7,C
MOVP0,A
CLRP1.6
ACALLDY1MS
SETBP1.6
RET
dSPH1:
MOVCA,@A+DPTR;时十位显示子程序
MOVP0,A
CLRP1.7
ACALLDY1MS
SETBP1.7
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;时钟调试程序加1;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
key:
clrp2.4
jbp2.3,key2
lcallDISP2
jbp2.3,key2
wait1:
lcallDISP2
jnbp2.3,WAIT1
incr0
cjner0,#06,KEY_EXIT
MOVR0,#0
LJMPKEY_EXIT
key2:
jbp2.0,key3
lcallDISP2
jbp2.0,key3
wait4:
lcallDISP2
jnbp2.0,WAIT4
cjner0,#01h,loop1
MOVA,MBUF
ADDA,#01;分十进制加1子程序,
DAA
MOVMBUF,A
CJNEA,#60h,KEY_EXIT;判断分十位是否到六十,若未到60,跳转到ADD13
MOVMBUF0,#0
MOVMBUF1,#0
MOVMBUF,#0对分单元赋初值0
LJMPKEY_EXIT
loop1:
cjner0,#02h,loop2
MOVA,HBUF
ADDA,#01;时十进制加1子程序
DAA
MOVHBUF,A
CJNEA,#24h,KEY_EXIT;判断分十位是否到24,若未到24,跳转到ADD13
MOVHBUF0,#0
MOVHBUF1,#0
MOVHBUF,#0对时单元赋初值
KEY_EXIT:
RET
;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;闹钟定时程序加1;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
loop2:
cjner0,#03h,loop3
MOVA,naof
ADDA,#01;十进制加1子程序,
DAA
MOVnaof,A
CJNEA,#60h,KEY_EXI;判断分十位是否到六十,若未到60,跳转到ADD13
MOVnMBUF0,#0
MOVnMBUF1,#0
MOVnaof,#0对闹钟分单元赋初值
LJMPKEY_EXi
LOOP3:
CJNER0,#04H,KEY_EXI
MOVA,naos;分十进制加1子程序,
ADDA,#01
DAA
MOVnaos,A
CJNEA,#24h,KEY_EXIT;判断分十位是否到24,若未到24,跳转到ADD13
MOVnHBUF0,#0
MOVnHBUF1,#0
MOVnaos,#0对闹钟时单元赋初值
KEY_EXI:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;