基于STC单片机的电子时钟大学本科方案设计书.docx
《基于STC单片机的电子时钟大学本科方案设计书.docx》由会员分享,可在线阅读,更多相关《基于STC单片机的电子时钟大学本科方案设计书.docx(19页珍藏版)》请在冰豆网上搜索。
基于STC单片机的电子时钟大学本科方案设计书
[摘要]本设计是基于STC单片机的电子时钟技术,由STC12C5A16S2芯片和LCD1602液晶显示屏,DS18B20进行温度测量,辅以必要的的电路,构成一个单片机定时闹钟。
电子钟可采用数字电路实现,也可以采用单片机来完成。
LCD显示“时”,“分”,LED闪动来做秒计数,定时时间到能发出警报声或者启动继电器,从而控制电器的启停。
现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。
在这次设计中主要是用STC12C5A16S2来进行定时,也结合着其他辅助电路实施控制,在定时的时候,按一下控制小时的键对小时加一;按一下控制分钟的键对分钟加一;到达预设的时间,此电路就会发出报警声音提示已经到点。
[关键词]定时闹钟 STC12C5A16S2 LCD1602
Timeclock
[Abstract]Theregularalarmclockdesignersdesign,bythemicrocontrollerSTC12C5A16S2chipand LCD1602 display、DS18B20,combinedwiththenecessarycircuitrytoformasingle-chiptimeralarmclock.Clockcanbedigitalcircuit,themicrocontrollercanalsobeusedtocomplete.LCDdisplay"when","sub",LEDflashtodothesecondcount,regulartimetobeabletosoundanalarmorstartrelaytocontroltheelectricalstartandstop.Nowistheeraofhighlydevelopedautomation,especiallyelectronicproductsarerelyingontheinternalcontrolcircuitrytoachievecontroloftheproducttoachievethepurposeofautomaticoperation,whichrequiresustodothedesignofelectricalcomponentsandcircuitstosupport.InthisdesignitismainlyusedtocarryoutregularAT89S51,butalsocombinedwithotherauxiliarycircuitimplementationofthecontrol,intime,whenyouclickacontrolbuttononthehourplusonehour。
clickthebuttononthecontrolminutesplusoneminute。
reachpresettime,thiswillsoundanalarmcircuithaspromptedthepoint.
[KeyWords]timeclockSTC12C5A16S2LCD1602
引言
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展。
单片机技术作为自动控制技术的核心之一,被广泛应用于工业控制、智能仪器、机电产品、家用电器等领域。
随着微电子技术的迅速发展,单片机功能也越来越强大,本设计基于STC单片机的电子时钟技术,以STC12C5A16S2为核心,构成数字钟,首先应选择一个脉冲源——能自动地产生稳定的标准时间脉冲信号。
而脉冲源产生的脉冲信号的频率较高,因此,需要进行分频,使得高频脉冲信号转变为适合于计时的低频脉冲信号,即“秒脉冲信号”(频率为1HZ)。
校时电路一般采用自动快速调整和手动调整,“自动快速调整”可利用分频器输出的不同频率的脉冲使显示的时间自动迅速调整。
“手动调整”可利用手动的节拍调准显示时间。
基于要求本次采用了自动快速调整。
数字闹钟要求有定时响闹的功能,故需要提供设定闹时电路和对比起闹电路。
设时电路应共享译码器、驱动器到数字显示器,以便使用者设定时间,并可减少电路的芯片数量;而对比起闹电路提供声源,应具有人工止闹功能,止闹后不再重新操作,将不再发生起闹等功能。
1电子时钟的设计目的和要求
1.1设计目的
(1)掌握时钟的基本构件;
(2)掌握各电子元器件的基本形状及其功能;
(3)掌握各电子元器件的焊接步骤与工作原理;
(4)掌握单片机内部结构与程序编制方法;
(5)掌握数码管内部结构,掌握数码显示技术;
(6)通过本次设计实验,对自己的专业知识掌握和运用有一个系统的考核。
1.2设计要求
利用实验开发板上的液晶显示屏,设计带有闹钟及日期显示功能的数字时钟。
(1)利用液晶显示屏显示时间及日期,时间为24小时制,日期格式为年-月- 日;
(2)利用按键对时间、日期、闹铃进行设置,到闹铃时间到时,蜂鸣器发出声音,按停止键可使闹铃停止;
(3)用了LED做闹铃倒计时显示。
(4)实现的功能在数字钟正常进行显示时其显示周期为000000至 23:
59:
59,其中有五个按键按下“暂停”键时钟停止走动按下“开始”键时 钟开始走动按下“秒设置”时钟秒位自加1加至60时向分位进1按下“分设置”时钟分位自加1加至60时向时位进1按下“时设置”时钟秒位自加1加至24时显示00。
2电子时钟的设计流程
2.1总体方案的原理
在一个完整的闹钟系统的设计中,我们采用的是自顶向下的设计思想,整个系统由若干个模块组合来实现,包括计数模块、控制模块、译码模块、动态扫描输出模块、闹钟控制模块。
设计闹钟时应考虑的问题有:
闹钟能否计数、能否对计时时间进行调整,定时闹铃功能是否正常,动态扫描显示是否正常等等。
2.2总体设计方案和框图
图2-1电子时钟系统框图
电子闹钟应包括秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分。
按键功能说明:
K1,设置时间和闹钟的小时;K2,设置小时以及设置闹钟的开关;K3,设置分钟和闹钟的分钟;K4;设置完成退出
电子闹钟的主电路指的是图2-1中虚线框内部分,主要涉及到CPU电路和按键按钮电路。
主机的设计具体地说有:
(1)系统时钟电路设计;
(2)系统复位电路设计;
(3)按键与按钮电路设计:
(4)闹铃声指示电路设计。
3系统硬件设计
3.1 STC12C5A16S2单片机
教案用电子打铃器主要由STC12C5A16S2单片机、键盘扫描模块、时钟和复位模块、蜂鸣器模块、LCD1602显示模块等组成。
运用汇编语言来控制单片机STC12C5A16S2来实现、动态数码显示等功能。
且本设计中的STC12C5A16S2单片机是整个工作过程的核心,是整个设计灵魂,它控制了脉冲时序的产生显示信号的发送控制显示LED的选择。
STC12C5A16S2是一种带4K字节存储器的低电压、高性能CMOS8位微处理器,俗称单片机.
图3-1STC12C5A16S2管脚图
P0.0—P0.7(39—32)P0口是一个漏极开路型准双向I/O口。
在访问外部存储器时,它是分时多路转换的地址(低8位)和数据总线,在访问期间激活了内部的上拉电阻。
在EPROM编程时,它接收指令字节,而在验证程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1.0—P1.7(1-8):
P1口是带内部上拉电阻的8位双向I/O口。
在EPROM编程和程序验证时,它接收低8位地址。
P2.0—P2.7(21-28):
P2口是一个带内部上拉电阻的8位双向I/O口。
在访问外部存储器时,它送出高8位地址。
在对EFROM编程和程序验证期间,它接收高8位地址。
P3.0—P3.7(10-17):
P3口是一个带内部上拉电阻的8位双向I/O口。
此部分是整个闹钟运行的核心部件,起着控制闹钟所有运行状态的作用。
控制方法有很多,大部分都采用单片机控制。
由于51单片机具有价格低廉是使用简单的特点,这里选择了ATMEL公司的STC12C5A16S2作为控制核心部件。
STC12C5A16S2单片机系列的存储器用的是哈佛结构,即将程序和数据存储截然分开,程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制系统。
STC89C52的存储器可分为五类:
程序存储器,内部数据存储器,特殊功能寄存器,位地址空间,外部数据存储器。
3.2模块电路
3.2.1复位电路与晶振电路
复位电路是单片机系统必须的,用来为单片机提供正确的复位信号;振荡电路就为单片机工作提供了所需要的时钟脉冲信号,使单片机的开始正常工作;如图3-2所示18脚和19接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出;第9引脚为复位输入端,接上电容,电阻及开关后能够形成上电复位电路。
图3-2复位电路与晶振电路
3.2.2显示模块及芯片
液晶显示器各种图形的显示原理:
线段的显示,点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当000H=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点,当3FF=FFH时,则屏幕的右下角显示一条短亮线当000H=FFH,001H=00H,002H=00H„00EH=00H,00FH=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
字符的显示:
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮。
为“0”的不亮。
这样一来就组成某个字符。
但由于内带字符发生器的控制器来说。
显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址设立光标在此送上该字符对应的代码即可。
图3-3LCD1602液晶显示模块
3.3串口通讯单元
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5V单电源供电。
引脚图片:
图3-4MAX232管脚及功能
引脚介绍:
主要分为几部分
电荷泵电路:
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
数据转换通道:
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
供电:
15脚GND、16脚VCC(+5v)。
由于RS232电平较高,在接通时产生的瞬时电涌非常高,很有可能击毁max232,所以在使用中应尽量避免热插拔。
3.4蜂鸣器单元
3.4.1鸣器的结构原理
(1)压电式蜂鸣器压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
有的压电式蜂鸣器外壳上还装有发光二极管。
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。
在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
(2)电磁式蜂鸣器电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
3.4.2蜂鸣器的驱动
在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。
这里对单片机在蜂鸣器驱动上的应用作一下描述。
图3--5为蜂鸣器发声
电路原理图。
图3-5蜂鸣器发声电路原理图
图3-5蜂鸣器发声电路原理图
驱动方式:
由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,很简单,这里就不对自激蜂鸣器进行说明了。
这里只对必须用1/2duty的方波信号进行驱动的他激蜂鸣器进行说明。
单片机驱动他激蜂鸣器的方式有两种:
一种是PWM输出口直接驱动,另一种是利用I/O定时翻转电平产生驱动波形对蜂鸣器进行驱动。
PWM输出口直接驱动是利用PWM输出口本身可以输出一定的方波来直接驱动蜂鸣器。
比如频率为2000Hz的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了。
3.4.3蜂鸣器驱动电路
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。
下图为比较安全的驱动电路
图3-6蜂鸣器安全的驱动电路图
3.4.4蜂鸣器驱动设计
由于这里要介绍两种驱动方式的方法,所以程序不仅介绍了PWM输出口驱动蜂鸣器的方法,还要介绍I/O口驱动蜂鸣器的方法。
所以,我们将设计如下的一个系统来说明单片机对蜂鸣器的驱动:
系统有两个他激蜂鸣器,频率都为2000Hz,一个由I/O口进行控制,另一个由PWM输出口进行控制;系统还有两个按键,一个按键为PORT按键,I/O口控制的蜂鸣器不鸣叫时按一次按键I/O口控制的蜂鸣器鸣叫,再按一次停止鸣叫,另一个按键为PWM按键,PWM口控制的蜂鸣器不鸣叫时按一次按键PWM输出口控制的蜂鸣器鸣叫,再按一次停止鸣叫。
5PWM输出口直接驱动蜂鸣器方式由于PWM只控制固定频率的蜂鸣器,所以可以在程序的系统初始化时就对PWM的输出波形进行设置。
首先根据SH69P43的PWM输出的周期宽度是10位数据来选择PWM时钟。
系统使用4MHz的晶振作为主振荡器,一个tosc的时间就是0.25μs,若是将PWM的时钟设置为tosc的话,则蜂鸣器要求的波形周期500μs的计数值为500μs/0.25μs=(2000)10=(7D0)16,7D0H为11位的数据,而SH69P43的PWM输出周期宽度只是10位数据,所以选择PWM的时钟为tosc是不能实现蜂鸣器所要的驱动波的。
4系统软件设计
4.1程序流程图
图4-1系统总流程图
4.2电子时钟主要程序
#include
#include
sbitSCLK=P1^0。
//DS1302时钟口P1.0
sbitIO=P1^1。
//DS1302数据口P1.1
sbitRST=P1^2。
//DS1302片选口P1.2
unsignedcharcodeinit[]={0x00,0x00,0x20,0x01,0x01,0x05,0x10}。
unsignedchardatanow[7]。
voidDS1302_Initial()。
voidDS1302_SetTime(unsignedchar*p)。
voidDS1302_GetTime(unsignedchar*p)。
sbitLCD_RS=P1^7。
sbitLCD_wr=P1^6。
sbitLCD_EN=P1^5。
voidwrite_com(unsignedcharcom)。
voidwrite_date(unsignedchardate)。
voidInit()。
voiddelay(intms)。
voiddelayms(unsignedintz)。
voidwrite_sfm(unsignedcharadd,unsignedchardate)。
voidmain()
{//unsignedchari3,i1,i2。
LCD_wr=0。
Init()。
while
(1)
{write_sfm(4,45)。
delay(5000)。
}
}
voidwrite_sfm(unsignedcharadd,unsignedchardate)
{unsignedcharshi,ge。
shi=date%10。
ge=date/10。
write_com(0x80+0x40+add)。
write_date(0x30+shi)。
write_date(0x30+ge)。
LCD_EN=0。
}
voidInit()
{
write_com(0x38)。
//16*2显示,5*7点阵,8位数据
delay(5)。
write_com(0x38)。
delay(5)。
write_com(0x38)。
delay(5)。
write_com(0x0c)。
//显示开,关光标
delay(5)。
write_com(0x06)。
//移动光标
delay(5)。
write_com(0x01)。
//清除LCD的显示内容
delay(5)。
}
/voiddelay(intms)
{
inti。
while(ms--)
{
for(i=0。
i<250。
i++)
{
_nop_()。
_nop_()。
_nop_()。
_nop_()。
}
voiddelayms(unsignedintz)
{unsignedintx,y。
for(x=z。
x>0。
x--)
for(y=1100。
y>0。
y--)。
}
/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
voidDelay()
{
_nop_()。
_nop_()。
}
/**************************************
从DS1302读1字节数据
**************************************/
unsignedcharDS1302_ReadByte()
{
unsignedchari。
unsignedchardat=0。
for(i=0。
i<8。
i++) //8位计数器
{
SCLK=0。
//时钟线拉低
Delay()。
//延时等待
dat>>=1。
//数据右移一位
if(IO)dat|=0x80。
//读取数据
SCLK=1。
//时钟线拉高
Delay()。
//延时等待
}
returndat。
}
/**************************************
向DS1302写1字节数据
**************************************/
voidDS1302_WriteByte(unsignedchardat)
{
chari。
for(i=0。
i<8。
i++)//8位计数器
{
SCLK=0。
//时钟线拉低
Delay()。
//延时等待
dat>>=1。
//移出数据
IO=CY。
//送出到端口
SCLK=1。
//时钟线拉高
Delay()。
//延时等待
}
}
/**************************************
读DS1302某地址的的数据
**************************************/
unsignedcharDS1302_ReadData(unsignedcharaddr)
{
unsignedchardat。
RST=0。
Delay()。
SCLK=0。
Delay()。
RST=1。
Delay()。
DS1302_WriteByte(addr)。
//写地址
dat=DS1302_ReadByte()。
//读数据
SCLK=1。
RST=0。
returndat。
}
/**************************************
往DS1302的某个地址写入数据
**************************************/
voidDS1302_WriteData(unsignedcharaddr,unsignedchardat)
{
RST=0。
Delay()。
SCLK=0。
Delay()。
RST=1。
Delay()。
DS1302_WriteByte(addr)。
//写地址
DS1302_WriteByte(dat)。
//写数据
SCLK=1。
RST=0。
}
/**************************************
写入初始时间
**************************************/
voidDS1302_SetTime(unsignedchar*p)
{
unsignedcharaddr=0x80。
unsignedcharn=7。
DS1302_WriteData(0x8e,0x00)。
//允许写操作
while(n--)
{
DS1302_WriteData(addr,*p++)。
addr+=2。
}
DS1302_WriteData(0x8e,0x80)。
//写保护