基于单片机智能电子数字钟的课程设计.docx
《基于单片机智能电子数字钟的课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机智能电子数字钟的课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
![基于单片机智能电子数字钟的课程设计.docx](https://file1.bdocx.com/fileroot1/2023-7/26/1292a93c-82c4-4964-885e-3c68a581bc88/1292a93c-82c4-4964-885e-3c68a581bc881.gif)
基于单片机智能电子数字钟的课程设计
课程设计报告
课程名称:
题目名称:
学院:
专业:
班级:
学号:
学生姓名:
指导教师:
职称:
成绩:
年月日
目录
摘要1
一、系统总体方案设计1
1.1方案列举1
1.2方案分析及比较1
二、系统硬件设计2
2.1总控制器AT89C512
2.1.1各引脚功能2
2.1.2引脚图4
2.2显示电路设计4
2.3晶振电路5
2.4复位电路6
2.5报时电路6
三、系统软件设计6
3.1总程序6
3.2中断程序8
四、总结9
参考文献9
附录9
摘要
近年来随着计算机技术在社会各个领域的渗透和大规模集成电路的发展,单片机的应用正不断地深入,它具有功能强、体积小、功耗低、价格便宜、工作可靠、使用方便等特点。
本文是基于AT89C51单片机智能电子数字钟的设计,阐述了数字时钟的设计思路,详细叙述了系统硬软件设计的具体过程。
此设计过程在硬件与软件方面进行同步设计,硬件部分主要由AT89C51单片机,七位LED显示驱动加键盘控制电路,晶振电路,复位电路,整点报时电路。
采用AT89C51作为主控制器,用单片机内部定时器实现时钟功能,用CH451为专用LED显示驱动芯片。
可以显示星期、时、分、秒,并且各位可以通过外接键盘调整,还具有整点报时的功能。
关键词:
AT89C51、CH451、智能数字时钟
一、系统总体方案设计
1.1方案列举
采用AT89C51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
方案一:
使用AT89C51内部定时器,通过中断方式进行溢出次数的累计。
方案二:
采用时钟芯片DS1302,DS1302是具有涓细电流充电能力的低功耗实时时钟芯片,接口简单、价格低廉、使用方便,被广泛地采用。
显示方案一:
专用LED驱动芯片,可以使用MAX7219、HD7279、CH451。
显示方案二:
采用74LS164串口扩展并口。
显示方案三:
LCD显示。
显示方案四:
I/O口加段位驱动器。
显示方案五:
LED驱动器MC14543、CD14543。
1.2方案分析及比较
方案一AT89S51单片机片内有两个可编程的定时器/计数器T1、T0,可以满足智能数字时钟的需求,并且此方案外加原件少,减少了错误率,提高了运行稳定性。
方案二采用外加芯片DS1302,内部存储好时间,单片机直接提取再进行显示即可,但是DS1302存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。
运行不稳定,所以不适合。
显示方案一采用专用芯片,实现了LED显示以及键盘控制,使用CH451扩展键盘显示接口,具有接口简单、占用CPU资源少、外围器件简单、性能价格比高等优点,很适合此设计。
显示方案二采用74LS164串口扩展并口,它是8位串入,并出移位寄存器。
显示方案三直接使用LCD显示,它是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,从而达到白底黑字或黑底白字显示的目的。
液晶显示器具有省电、抗干扰能力强等优点。
显示方案四采用74HC573、74HC138段位驱动器,增加驱动能力。
显示方案五使用LED驱动器MC14543、CD14543,单片机提供BCD码,驱动LED显示。
综合上述分析,采用方案一及显示方案一。
总体方案框图如下:
CH451
报时器
复位电路
图1-1总体方案框图
键盘模块
晶振电路
AT89C51
二、系统硬件设计
2.1总控制器AT89C51
本部分采用AT89C51作为主控制器。
AT89C51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
[1]
2.1.1各引脚功能
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
表2-1P3口的第二功能定义
引脚
备选功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(计时器0外部输入)
P3.5
T1(计时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次PSEN有效。
但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
EA/VPP:
当EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
[2]
2.1.2引脚图
图2-1AT89C51引脚排列
2.2显示电路设计
CH451是一内部集成有数码管显示驱动和键盘扫描控制的专用键盘/显示器接口芯片,CH451内置RC振荡电路,可以直接动态驱动8位LED数码管(或者64个LED),可选择BCD译码或不译码功能,可实现显示数字的左移、右移、左循环、右循环、各位显示数字独立闪烁等功能。
在键盘控制方面,该芯片内有64键键盘控制器,可实现8*8矩阵编码键盘的扫描,并内置自动去抖动电路,可提供按键中断与按键释放标志位等功能。
图2-2显示电路
2.3晶振电路
晶振电路两端分别接单片机的XTAL1和XTAL2两口,具体电路图如图2-2所示。
图2-3晶振电路
2.4复位电路
只需给AT89C51的复位引脚RST加上大于2个机器周期的高电平就可以使AT89C51复位。
外部复位电路通过按键电平复位电路来实现,通过RST端经电阻与电源VCC接通来实现,具体电路图如图2-3所示。
图2-4复位电路
2.5报时电路
外接蜂鸣器以及发光二极管,使得时钟具有整点报时功能,具体电路图如图2-4所示。
图2-5报时电路
三、系统软件设计
3.1总程序
程序开始,设置计时器T0为方式1,设置中断次数为10,清计时单元,打开中断,启动T0,对按键进行检测,调用子程序,判断是否为整点,若是整点,调用报时程序,若不是整点,继续循环。
Y
N
报警器报警
图3-1主程序流程图流程图
图图
判断是否整点
开始
设置T0为方式1
设中断次数为10
清计时单元
开中断
启动T0
按键检测
调用显示子程序
3.2中断程序
定时采用中断方式,利用T0每隔100ms向CPU发出一次中断请求(设系统使用6MHz晶体振荡器,定时器T0工作在方式1的定时器初值为3CB0H,即TH0=3CH,TL0=0B0H),CPU响应中断后进入中断服务子程序。
中断服务子程序以100ms、1S、1MIN、1HOUR对时钟计时,每产生一次中断,100mS计数单元加1,当该单元内容累计到10时,秒计数单元加1,并将100mS单元清0,秒累计到60时,分计数单元加1,并将秒计数单元清0,当分计数单元累计到60时,时计数单元加1,并将分计数单元清0;时计数单元满24后,所用单元内容清0。
[4]
保护现场
(42H)+1(42H)(42H)
(41H)=60?
0(41H)
(41H)+1(40H)
图3-2中断程序流程图
返回
恢复现场
0(41H)
(40H)=24?
(41H)+1(41H)
0(42H)
(42H)=60?
1s到?
设置计数初值
四、总结
本次设计是基于AT89C51单片机的智能数字时钟设计,AT89C51是生活中应用广泛的单片机型号,它内部具有定时器功能,通过内部定时器T0进行计数。
该设计的数字时钟具有显示时间和星期,以及整点报时的功能。
该数字时钟在时间精度上存在一定误差,由于中断响应需要3~8个机器周期,因此可以采取定时初值补偿的方法来减小计时的误差。
本设计采用专用LED驱动芯片CH451,不仅可以实现显示功能,还可以扩展键盘显示接口,接口简单,占用CPU资源少,加快反应速度,性价比高。
通过本次设计,查找资料,翻阅书籍,增强了对单片机的认识,掌握了AT89C51的计时功能,并且可以设定初值,实现功能需求。
刚刚做设计的一两天,无论查阅什么资料都看不懂,通过刻苦用心学习,学到了各种有用知识,加强了本学期的知识理念,并为以后开设的课程打下了良好的基础。
认识到知识的熟练掌握不单单靠上课认真听讲,也需要多应用,课本是基础,课程设计是应用扩展。
做课程设计是对一个人整体能力的检测,不仅需要平时上课的基础积累,还需要活学活用,课本教授内容理论性强,当真正应用时会发现自己好多都没有学习透彻。
做设计还需要掌握软件使用,充分利用网络资源,学会软件灵活使用。
在这次的设计过程中,增加的不只是我的知识,更是对自己内心的一种磨练,它会给我以后的生活带来不可忽视的作用。
参考文献
[1]白延敏.51单片机典型系统开发实例精讲.[M]北京:
电子工业出版社,2009
[2]张毅刚等.单片机原理及应用.[M]北京:
高等教育出版社,2010
[3]邹显圣.基于AT89C51单片机数字时钟的研究.[M]北京:
机电产品开发与创新,第22卷第5期
[4]王义军等.单片机原理及应用习题与实验指导书.[M]北京:
中国电力出版社,2006
[5]郑学坚,周斌.微型计算机原理及应用.[M]北京:
清华大学出版社,2001
附录:
总电气原理图
源程序代码
ORG0000H
LJMPSTART
ORG000BH
LJMPINIT0
START:
MOVR0,#70H;主程序开始
MOVR7,#0CH
INIT:
MOV@R0,#00H
INCR0
DJNZR7,INIT
MOV72H,#10;对连字符进行装值
MOV75H,#10
MOVTMOD,#01H;选择定时器/计数器T0的方式1
MOVTL0,#0B0H;对低位赋初值
MOVTH0,#03CH;高位赋初值
SETBEA
SETBET0
SETBTR0
START1:
LCALLSCAN
LCALLKEYSCAN
SJMPSTART1
DL1MS:
MOVR6,#14H;延时1子程序
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
DL20MS:
ACALLSCAN;延时20ms子程序
ACALLSCAN
ACALLSCAN
RET;数码管显示程序开始
SCAN:
MOVA,78H
MOVB,#0AH
DIVAB;时间秒的十位送给A,时间秒的个位送B
MOV71H,A;时间秒要显示的十位
MOV70H,B;时间秒要显示的个位
MOVA,79H
MOVB,#0AH
DIVAB;时间分的十位送给A,时间分的个位送B
MOV74H,A;时间分要显示的十位送地址
MOV73H,B;时间分要显示的个位送地址
MOVA,7AH
MOVB,#0AH
DIVAB;时间时的十位送给A,时间时的个位送B
MOV77H,A;时间时显示的十位送地址
MOV76H,B;时间时要显示的个位送地址
MOVR1,#70H
MOVR5,#01H
MOVR3,#09H
SCAN1:
MOVA,R5;数码管的显示程序
MOVP2,A
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR;对字段表取值显示
MOVP0,A
LCALLDL1MS
INCR1
MOVA,R5
RLA
MOVR5,A
DJNZR3,SCAN1
MOVP2,#0FFH
MOVP0,#0FFH
RET;"0~9"和"-"的字段表
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
;定时/计数器T0中断程序
INIT0:
PUSHACC
PUSHPSW
CLRET0
CLRTR0
MOVTL0,#0B0H
MOVTH0,#03CH
SETBTR0
INC7BH
MOVA,7BH
CJNEA,#14H,OUTT0
MOV7BH,#00
INC78H
MOVA,78H
CJNEA,#3CH,OUTT0;一秒的延时是否计到60次,
没有就继续执行
MOV78H,#00
INC79H
MOVA,79H
CJNEA,#3CH,OUTT0
MOV79H,#00
INC7AH
MOVA,7AH
CJNEA,#18H,OUTT0;60分延时是否计到24次,
没有就继续执行程序
MOV7AH,#00
OUTT0:
SETBET0;启动定时器T0
POPPSW
POPACC
RETI
;按键处理程序
KEYSCAN:
CLREA
JNBP1.0,KEYSCAN0;P1.0有按键按下则跳转到子程序
JNBP1.1,KEYSCAN1;P1.1有按键按下则跳转到子程序
JNBP1.2,KEYSCAN2;P1.2有按键按下则跳转到子程序
KEYOUT:
SETBEA
RET
KEYSCAN0:
LCALLDL20MS;20ms的延时消抖
JBP1.0,KEYOUT
WAIT0:
JNBP1.0,WAIT0;判断按键是否松手,松手就往下执行程序
INC7CH
MOVA,7CH
CLRET0
CLRTR0
CJNEA,#03H,KEYOUT;按下第一次和第二次对时、分选定
MOV7CH,#00;按下第三次时就启动计时
SETBET0
SETBTR0
SJMPKEYOUT
KEYSCAN1:
LCALLDL20MS;按键加一的程序
JBP1.1,KEYOUT
WAIT1:
JNBP1.1,WAIT1
MOVA,7CH
CJNEA,#02H,KSCAN11;如果功能键按下则对时加一调整
INC79H
CJNEA,#3CH,KEYOUT;如果加到60则清零
MOV79H,#00
SJMPKEYOUT
KSCAN11:
INC7AH;如果功能键是按下第
二次则对分进行加一调整
MOVA,7AH
CJNEA,#18H,KEYOUT
MOV7AH,#00
SJMPKEYOUT
KEYSCAN2:
LCALLDL20MS;延时消抖程序
JBP1.2,KEYOUT
WAIT2:
JNBP1.2,WAIT2;判断是否放开按键
MOVA,7CH
CJNEA,#02H,KSCAN21;如果功能键是按下第一次对时进行减一
DEC79H
MOVA,79H
CJNEA,#0FFH,KEYOUT
MOV79H,#3BH
SJMPKEYOUT
KSCAN21:
DEC7AH;如果功能键是按下第二次则对分进行减一
CJNEA,#0FFH,KEYOUT
MOV7AH,#17H
SJMPKEYOUT
END