资源描述
07电气工程及其自动化 07电力 谭善文 单片机课程设计
单片机课程设计
课题:单片机模拟电子时钟设计
学 院: 自动化学院
专 业: 07电气工程及其自动化
(低压电力智能控制方向)
姓 名: 谭善文
学 号: 2007104743002
指导老师: 张华
23
目 录
一、前言 3
二、设计目的 3
三、设计任务与要求 3
四、设计原理 3
五、总体设计方案 4
1、硬件电路图 4
(1)、总电路图 4
(2)、电源 5
(3)、晶振 5
(4)、LED 5
(5)、复位 6
(6)、蜂鸣器 6
(7)、按键 6
(8)、串行口 7
(9)、单片机 7
(10)、数码管 8
2、程序编写 10
六、小结与展望 21
七、致谢 22
八、主要参考文献 22
一、前言
在当今的工作和生活环境中,有越来越多的单片机在为人们服务,例如电视遥控、手机、洗衣机、空调等,单片机几乎无所不在,学习单片微型计算机这门课程,就是为了对单片微型计算机有进一步感性的认识,了解、掌握、应用,甚至设计开发它。让我们能综合运用单片机的软、硬件技术分析实际问题,为工业生产、科学研究和实验设备等领域的单片机应用和开发打下良好的基础。
二、设计目的
a) 通过《单片微型计算机原理与接口技术教程》了解单片微型计算机的发展;
b) 根据课程设计的要求,学会用汇编语言设计程序,学会应用程序设计调试软件;
c) 通过调试程序设计模块,掌握单片微型计算机的结构原理,了解程序设计的编程思想;
d) 通过软件调试熟悉使用单片机指令系统,掌握汇编语言程序设计方法及编程技巧,掌握子程序的设计与使用,熟悉中断服务程序的设计及调用过程。
三、设计任务与要求
任务:利用单片机定时功能实现电子时钟的计时
要求:1.设计单片机电子时钟设计控制方案,功能设计;
2.详细描述实现需要的硬件,效果等;
3.编写汇编语言程序设计,在KEIL仿真实现调试程序;
四、设计原理
单片机可以利用定时功能实现电子时钟的计时。设计时利用单片机的定时器作为时钟的基准,利用几个单元作为时、分、秒的累计单元,秒到时,秒单元加1,直到59s时,分单元加1,依此类推,可完成年、月、日、时、分、秒的计时工作。
五、总体设计方案
1、硬件电路图
(1)总电路图
图1 总硬件电路原理图
(2)电源
图2 电源部分原理图
该电源接上USB口后可输出一个+5V的直流电源。图中C1为电解电容,有储能缓冲作用。C2为一个滤波电容。而R1则为保护电阻,有限流作用。D1为电源工作指示灯。
(3)晶振
图3 晶振部分原理图
该振荡电路可产生11.0952MHZ的频率。XTAL1为输入引脚,XTAL2为输出引脚。Y1为振荡器,C15、C16为微调电容,它们之间形成反馈电路,振荡器即能工作。
(4)LED
图4 LED接线图
该部分主要用来记秒,即每隔一秒,LED指示灯就闪烁一次。
(5)复位
图5 复位电路原理图
开关断开时,复位键RST为低电平,不起作用;当按下按键时,RST变为高电平,将起清零作用。
(6)蜂鸣器
图6 蜂鸣器电路原理图
访电路在T1口的驱动后,经过Q1的放大,作用到BZ1上发出声音,在设计中将用作整点报时。
(7)按键
图7 按键电路原理图
这两个按键在设计中分别用来调整时间和切换显示内容。
(8)串行口
图8 串行口电路原理图
该电路主要由MAX232芯片和它的外围电路组成,可通过它与电脑的串口连接,将程序下载到单片机里。
(9)单片机
图9 单片机引脚图
整个电路的主控芯片。
(10)数码管
图10 数码管显示电路原理图
该电路通过了二片74HC595芯片组成的电路去驱动4位的共阴数码管显示时间。
74HC595是一款具有8位移位寄存器和一个存储器,三态输出功能的驱动芯片。移位寄存器和存储器分别具有独立的时钟信号。数据在SHCP的上升沿输入,在STCP的上升沿进入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7),和一个异步的低电平复位(MR),存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
它和74HC164的功能类似,都是串入并出的IO接口,将串行的数据,转为并行的输出,这样可以节约MCU的IO口资源。主要应用在多路LED指示或多位数码管驱动方面。但与74HC164比,595主要还有以下更优越的功能:
1.支持3态输出,当第13脚为高电平时,595无输出;
2.具有数据锁存功能,这样不会影响移位时的瞬时输出;
3.具有数据输出功能,可以更方便的进行595级联
其引脚图和引脚功能如下:
图11 74HC595引脚图
1. 第1脚:数据输出端QB
2. 第2脚:数据输出端QC
3. 第3脚:数据输出端QD
4. 第4脚:数据输出端QE
5. 第5脚:数据输出端QF
6. 第6脚:数据输出端QG
7. 第7脚:数据输出端QH
8. 第8脚:电源GND
9. 第9脚:串行数据输入端SQH,时钟下降沿数据移出
10. 第10脚:复位引脚RESET
11. 第11脚:数据移位时钟输入端SCK
12. 第12脚:数据锁存信号输入端RCK
13. 第13脚:数据输出使能端/OE,低电平有效
14. 第14脚:串行数据输入端A,时钟上升沿数据移入
15. 第15脚:数据输出端QA
16. 第16脚:电源VDD
2、程序编写
汇编源程序如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 电子时钟程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPK EQU P3.5 ;P3.5端口定义为喇叭
org 0x0000 ;程序执行开始地址
ajmp main ;跳到标号main执行
org 0x0003 ;外中断0中断程序入口
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒闪烁子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
org 0x000b ;定时器T0中断程序入口
clr tf0
mov TH0,#0x4c
mov TL0,#0x00
djnz r4,ret1 ;50*20(0x14)=1000ms=1S
mov r4,#0x14
clr p1.0 ;每隔1秒指示灯闪烁一次
clr p1.1
push acc
setb rs0
clr rs1
mov r0,#0x20
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 秒计时控制子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
mov a,@r0
add a,#0x01
da a ;二-十进制调整指令
mov @r0,a
cjne a,#0x60,t0lp1 ;60秒到后分钟加1,秒钟清零
mov a,#0x00
mov @r0,a
inc r0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 分计时控制子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
mov a,@r0
add a,#0x01
da a
mov @r0,a
cjne a,#0x60,t0lp1 ;60分到后时钟加1,时钟清零
mov a,#0x00
lcall BZ ;整点到后喇叭报时
mov @r0,a
inc r0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 小时计时控制子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
mov a,@r0
add a,#0x01
da a
mov @r0,a
cjne a,#0x24,t0lp1 ;24小时到后天加1,时钟清零
mov a,#0x00
mov @r0,a
inc r0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 天计时控制子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
mov a,@r0
add a,#0x01
da a
mov @r0,a
cjne a,#0x31,t0lp1 ;30天过后月加1,天归1
mov a,#0x01
mov @r0,a
inc r0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 月计时控制子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
mov a,@r0
add a,#0x01
da a
mov @r0,a
cjne a,#0x13,t0lp1 ;12个月过后月归1
mov a,#0x01
mov @r0,a
;
t0lp1:
nop
pop acc
clr rs0
clr rs1
ret1:
cjne r4,#0x0a,ret2
jc ret2 ;point judge
setb p1.0 ;point off
setb p1.1
ret2:
reti
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 电子时钟初始化程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
main: mov 0x20,#0x15 ;秒初始化
mov 0x21,#0x59 ;分初始化
mov 0x22,#0x23 ;时初始化
mov 0x23,#0x30 ;天初始化
mov 0x24,#0x12 ;月份初始化
;
clr p1.3
clr p1.4
clr p1.5
;
acall T0init
mov sp,#0x0f
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示时分的子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
main1:
jb p3.2,hmlp
acall delay
jb p3.2,hmlp
mov r0,#0x21
acall display
ajmp main1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示月份与日数的子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
hmlp:
mov r0,#0x1f
acall display
ajmp main1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 50ms延时子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
T0init: mov TMOD,#0x01
mov TH0,#0x4c ;50ms延时初值设置
mov TL0,#0x00
setb et0
setb ea
setb tr0
mov r4,#0x14
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
display:
mov r1,#0x01
mov r5,#0x04 ;4bit or 8bit
mov dptr,#0x0300
loop: mov r7,#0x08
mov a,r1
lp2: rlc a
setb p1.5
jc lp1
clr p1.5
lp1: setb p1.4
clr p1.4
djnz r7,lp2
;
mov a,@r0
anl a,#0x0f
movc a,@a+dptr
cpl a
mov r7,#0x08
lp4: rlc a
setb p1.5
jc lp3
clr p1.5
lp3: setb p1.4
clr p1.4
djnz r7,lp4
;
setb p1.3
clr p1.3
;
acall delay
;
mov a,r1
rl a
mov r1,a
;
mov r7,#0x08
mov a,r1
lp6: rlc a
setb p1.5
jc lp5
clr p1.5
lp5: setb p1.4
clr p1.4
djnz r7,lp6
;
mov a,@r0
anl a,#0x0f0
swap a
movc a,@a+dptr
cpl a
mov r7,#0x08
lp8: rlc a
setb p1.5
jc lp7
clr p1.5
lp7: setb p1.4
clr p1.4
djnz r7,lp8
;
setb p1.3
clr p1.3
;
acall delay
;
mov a,r1
rl a
mov r1,a
inc r0
djnz r5,loop
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 整点报时子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
BZ: MOV R6, #200
B1: CPL SPK
ACALL DELAY1
DJNZ R6,B1 ;喇叭响的时间为:R6×R5=0.5s
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
delay: mov r6,#0x00
del1: djnz r6,del1
ret
;
DELAY1:
D1: MOV R5,#250 ;延迟时间为:R5
D2: DJNZ R5,D2
RET
START1: LCALL display ;调用显示子程序
JB p1.2,SETMM1 ;P1.2口为0时转时间调整程序
SJMP START1 ;P1.2口为1时跳回START1
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
SETMM: cLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
mov TH0,#0x4c
mov TL0,#0x00
djnz r4,de
de: lcall ret1
mov r4,#0x14 ;调用1秒延时程序
JB p1.2,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2: JNB p1.2,SET1 ;P1.2口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4: JB p1.2,SET3 ;等待键按下
mov TH0,#0x4c
mov TL0,#0x00
djnz r4,de1
de1: lcall ret1
mov r4,#0x0A ;有键按下,延时0.5秒
JNB p1.2,SETHH ;按下时间大于0.5秒转调小时状态
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
;
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE: JB p1.2,CLOSE ;无按键按下,等待。
LCALL display ;有键按下,调显示子程序延时削抖
JB p1.2,CLOSE ;是干扰返回CLOSE等待
WAITH: JNB p1.2,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
SETHH1: JNB p1.2,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6: JB p1.2,SET7 ;等待按键按下
mov TH0,#0x4c
mov TL0,#0x00
djnz r4,de2
de2: lcall ret1
mov r4,#0x0A ;有键按下延时0.5秒
JNB p1.2,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
LCALL ADD1 ;调加1子程序
MOV A,R3
CLR C
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB p1.2,SETOUT1 ;调时退出程序。等待键释放
LCALL display ;延时削抖
JNB p1.2,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开定时器T0中断(计时开始)
LJMP START1 ;跳回主程序
;
SET1: LCALL display ;键释放等待时调用显示程序(调分)
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL display ;等待调分按键时时钟显示用
AJMP SET4
SET5: LCALL display ;键释放等待时调用显示程序(调小时)
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL display ;等待调小时按键时时钟显示用
AJMP SET6
SETOUT1: LCALL display ;退出时钟调整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET
;
org 0x0300
DB 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,00H
;"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" 共阴段码表
end
六、小结与展望
通过这次单片机课程设计,我终于把在课本上的知识应用到了实际当中去。这次课程设计还真是受益匪浅。我基本上熟悉了MCS-51单片机的原理和汇编语言程序的设计,掌握了外设接口的编程设计,中断系统,系统扩展等知识。,我不但巩固了自己电力电子的理论知识,还进一步熟练了KEIL仿真软件的应用。用这个仿真软件,不仅可以方便地实现程序的修改,而且还可以直接进行软件仿真,观察程序运行情况。还可以将通过接口把程序下载到硬件电路上调试,真是方便多多啊!这种直观的仿真教学,使我不但验证了书本上的理论知识,而且也对一些抽象难懂的概念有了更加明确直观的理解。同时也能让我综合运用单片机的软、硬件技术分析实际问题,为工业生产、科学研究和实验设备等领域的单片机应用和开发打下良好的基础。
本次的课程设计还令我认识到了熟能生巧这个道理。刚刚接触单片机的时候,觉得很难,好像什么都不会,各种各样的助记符、程序更烦,做一道习题或者是设计一个电路都要耗费我很多的时间。但通过这次实训,让我懂得了世上无难事,只怕有心人的道理。再难的事,只要你肯用心,也会变得容易;反之,再容易的事,如果你无心去做,也会变得遥不可及。要学好单片机,我们要走的路还很长。但路漫漫其修玩兮,吾将上下而求索。只要我们不懈努力,我相信我们一定能把任何一件事做好。
七、致谢
本次单片机课程设计的顺利完成,我要特别感谢我们的张华老师,是他平时理论与实际的讲课方式让我对单片机产生了极大的兴趣和打下了扎实的理论基础。另外,在整个实训过程中,我还要感谢我的队友,是大家在一起讨论,一起研究,互相帮助,才会有我们的共同进步,才能顺利地完成这次的课程设计。感谢大家一起为这次课程设计营造了良好的气氛。这次,我还要特别感谢海杰同学。从实训开始到结束,海杰同学一直都陪着我到实验室调试程序,给了我很大的帮忙。对大家给我的无私帮助,在此我要再一次向他们表示衷心的感谢。
八、主要参考文献
1)《单片微型计算机原理与接口技术》 ,高锋, 科学出版社,2007
2)《单片机原理及接口技术》, 李朝青,北京航空航天大学出版社,2000
展开阅读全文