单片机课程设计课题:单片机模拟电子时钟设计学院:自动化学院专业: 07电气工程及其自动化(低压电力智能控制方向)姓名:谭善文学号:2007104743002指导老师:张华目录一、前言 (3)二、设计目的 (3)三、设计任务与要求 (3)四、设计原理 (3)五、总体设计方案 (4)六、小结与展望 (21)七、致谢 (22)八、主要参考文献 (22)(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)晶振20pF晶振Y111.0592MHz图3 晶振部分原理图该振荡电路可产生11.0952MHZ 的频率。
XTAL1为输入引脚,XTAL2为输出引脚。
Y1为振荡器,C15、C16为微调电容,它们之间形成反馈电路,振荡器即能工作。
(4)LEDLED图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脚:数据输出端QB2. 第2脚:数据输出端QC3. 第3脚:数据输出端QD4. 第4脚:数据输出端QE5. 第5脚:数据输出端QF6. 第6脚:数据输出端QG7. 第7脚:数据输出端QH8. 第8脚:电源GND9. 第9脚:串行数据输入端SQH,时钟下降沿数据移出10. 第10脚:复位引脚RESET11. 第11脚:数据移位时钟输入端SCK12. 第12脚:数据锁存信号输入端RCK13. 第13脚:数据输出使能端/OE,低电平有效14. 第14脚:串行数据输入端A,时钟上升沿数据移入15. 第15脚:数据输出端QA16. 第16脚:电源VDD2、程序编写汇编源程序如下:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 电子时钟程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SPK EQU P3.5 ;P3.5端口定义为喇叭org 0x0000 ;程序执行开始地址ajmp main ;跳到标号main执行org 0x0003 ;外中断0中断程序入口;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒闪烁子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;org 0x000b ;定时器T0中断程序入口clr tf0mov TH0,#0x4cmov TL0,#0x00djnz r4,ret1 ;50*20(0x14)=1000ms=1Smov r4,#0x14clr p1.0 ;每隔1秒指示灯闪烁一次clr p1.1push accsetb rs0clr rs1mov r0,#0x20; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 秒计时控制子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov a,@r0add a,#0x01da a ;二-十进制调整指令mov @r0,acjne a,#0x60,t0lp1 ;60秒到后分钟加1,秒钟清零mov a,#0x00mov @r0,ainc r0; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 分计时控制子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov a,@r0add a,#0x01da amov @r0,acjne a,#0x60,t0lp1 ;60分到后时钟加1,时钟清零mov a,#0x00lcall BZ ;整点到后喇叭报时mov @r0,ainc r0; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 小时计时控制子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov a,@r0add a,#0x01da amov @r0,acjne a,#0x24,t0lp1 ;24小时到后天加1,时钟清零mov a,#0x00mov @r0,ainc r0; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 天计时控制子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov a,@r0add a,#0x01da amov @r0,acjne a,#0x31,t0lp1 ;30天过后月加1,天归1mov a,#0x01mov @r0,ainc r0; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 月计时控制子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov a,@r0add a,#0x01da amov @r0,acjne a,#0x13,t0lp1 ;12个月过后月归1mov a,#0x01mov @r0,a;t0lp1:noppop accclr rs0clr rs1ret1:cjne r4,#0x0a,ret2jc ret2 ;point judgesetb p1.0 ;point offsetb p1.1ret2:reti; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 电子时钟初始化程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;main: mov 0x20,#0x15 ;秒初始化mov 0x21,#0x59 ;分初始化mov 0x22,#0x23 ;时初始化mov 0x23,#0x30 ;天初始化mov 0x24,#0x12 ;月份初始化;clr p1.3clr p1.4clr p1.5;acall T0initmov sp,#0x0f; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 显示时分的子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;main1:jb p3.2,hmlpacall delayjb p3.2,hmlpmov r0,#0x21acall displayajmp main1; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 显示月份与日数的子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hmlp:mov r0,#0x1facall displayajmp main1; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 50ms延时子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0init: mov TMOD,#0x01mov TH0,#0x4c ;50ms延时初值设置mov TL0,#0x00setb et0setb easetb tr0mov r4,#0x14ret; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 显示子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;display:mov r1,#0x01mov r5,#0x04 ;4bit or 8bitmov dptr,#0x0300loop: mov r7,#0x08mov a,r1lp2: rlc asetb p1.5jc lp1clr p1.5lp1: setb p1.4clr p1.4djnz r7,lp2;mov a,@r0anl a,#0x0fmovc a,@a+dptrcpl amov r7,#0x08lp4: rlc asetb p1.5jc lp3clr p1.5lp3: setb p1.4clr p1.4djnz r7,lp4;setb p1.3clr p1.3;acall delay;mov a,r1rl amov r1,a;mov r7,#0x08mov a,r1lp6: rlc asetb p1.5jc lp5clr p1.5lp5: setb p1.4clr p1.4djnz r7,lp6;mov a,@r0anl a,#0x0f0swap amovc a,@a+dptrcpl amov r7,#0x08 lp8: rlc asetb p1.5jc lp7clr p1.5lp7: setb p1.4clr p1.4djnz r7,lp8;setb p1.3clr p1.3;acall delay;mov a,r1rl amov r1,ainc r0djnz r5,loopret; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 整点报时子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BZ: MOV R6, #200B1: CPL SPKACALL DELAY1DJNZ R6,B1 ;喇叭响的时间为:R6×R5=0.5sRET; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 延时子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay: mov r6,#0x00del1: djnz r6,del1ret;DELAY1:D1: MOV R5,#250 ;延迟时间为:R5D2: DJNZ R5,D2RETSTART1: 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 ;关闭定时器T0mov TH0,#0x4cmov TL0,#0x00djnz r4,dede: lcall ret1mov r4,#0x14 ;调用1秒延时程序JB p1.2,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电) MOV R2,#06H ;进入调时状态,赋闪烁定时初值 SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB p1.2,SET1 ;P1.2口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1 SET4: JB p1.2,SET3 ;等待键按下mov TH0,#0x4cmov TL0,#0x00djnz r4,de1de1: lcall ret1mov 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时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环;CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。