基于51单片机的DS12C887时钟芯片的时钟电路设计副本Word文档下载推荐.docx
- 文档编号:18911736
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:24
- 大小:486.37KB
基于51单片机的DS12C887时钟芯片的时钟电路设计副本Word文档下载推荐.docx
《基于51单片机的DS12C887时钟芯片的时钟电路设计副本Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于51单片机的DS12C887时钟芯片的时钟电路设计副本Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
3.1器件简介
(1)AT89C52
AT89C52是ATMEL公司生产的通用低功耗8位CMOS微控器,具有8051内核和8KB的可编程Flash程序存储空间以及256字节RAM.有32个通用IO口线和全双工串口,两个数据指针、两个16位可编程计数器/定时器、8个2级优先级中断源,具有片内时钟电路,通过简单的外接器件即可实现时钟电路.
(2)DS12C887
引脚结构及其功能如图3.1.
图3.1DS12C887引脚结构
AD0-AD7:
地址/数据总线
NC:
空脚
MOT:
总线模式选择
CS:
片选信号
AS:
地址锁存信号
R/W:
写信号(intel总线模式下)
DS:
读信号(intel总线模式下)
RESET:
复位信号
IRQ:
中断请求输岀
VCC:
+5V电源
GND:
电源地
DS12C887是美国DALLAS半导体公司生产的实时时钟芯片.采用24引脚双列直插式的封装形式.芯片的晶体振荡器、振荡电路、充电电路和可充电锂电池等一起封装在芯片内部,组成一个加厚的集成电路模块.电路通电时,其内部充电电路便自动对其内部电池充电.可保证时钟数据10年内不会丢失.DS12C887内部设有方便的接口电路,接口设计简便,使其与各种微处理器的接口大大简化.使用时无需外围电路元件,通过对MOT引脚的电平控制,可以实现与不同的计算机总线连接.DS12C887能够自动存取并更新当前的时间,CPU可通过读取DS12C887的内部时标寄存器得到当前的时间和日历,也可通过选择二进制码或BCD码初始化芯片的10个时标寄存器.其中114字节的非易失性静态RAM可供用户使用,可以在控制器掉电的情况下,保存一些重要的数据.DS12C887的4个状态寄存器用来控制和指出DS12C887模块当前的工作状态,除数据更新周期外,程序可随时读写这4个寄存器.其内部结构如下图3.2.
图3.2DS12C887内部结构
(3)DS18B20
DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术.全部传感元件及转换电路仅集成在形如三极管的一个集成电路内.DS18B20采用单总线接口方式,与微处理器连接时仅需要一条总线即可实现微处理器与DS18B20的双向通讯;
支持多点组网功能,多个DS18B20可以并联在一条总线上,即可实现多点测温;
在使用中不需要任何外围元件.测温范围为-55℃~+125℃,结果以9位数字量方式串行传送.DS18B20测温原理如图3.3所示.
图3.3DS18B20内部结构
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入.计数器1和温度寄存器被预置在-55℃所对应的一个基数值.计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶体振荡器产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度.其内部带有非线性修正,确保温度数据的准确性.DS18B20的测温分辨率为0.5℃以9位数据格式表示,其中最低有效位(LSB)由比较器进行0.25℃比较,当计数器1中的余值转化成温度后低于0.25℃时,清除温度寄存器的最低位(LSB),当计数器1中的余值转化成温度后高于0.25℃,置位温度寄存器的最低位(LSB),DS18B20温度数据格式如表3.1所示.
表3.1DS18B20温度数据格式
DS18B20采用12位二进制数据表示温度,分成两个字节,低字节低四位为小数位,低字节高四位和高字节低四位组成温度信息的8位整数位,其中第一位为符号位,为0表示温度为正值,为1表示温度为负值.当温度为负值时,数据采用补码存放.高字节高四位无效,与符号位保持一致.温度与数据对应关系如表3.2所示.
表3.2部分温度对应数据
3.2硬件电路设计
本课题涉及电路原理图和PCB图均由AltiumDesignerSummer09绘制.
(1)电源部分
图3.7整机电源电路
由于电路微控器供电电压为5V,osyno6188供电电压为3V或4.5V,osyno6188对电源电压精度要求不高,决定整机采用5V电源供电,在电源处串联一只1N4003二极管,为osyno6188供电,1N4003为硅管,正向导通压降在0.7V左右,经过二极管后,得到约4.3V电压,为osyno6188供电.电源电路为普通稳压电源电路,由于不是本项目主要方面,不再赘述.
(2)AT89C52最小系统电路
图3.8AT89C52单片机最小系统
电路由震荡电路,复位电路和单片机构成最小系统.震荡电路为单片机提供工作时钟,由石英晶体和补偿电容构成.由于语音部分需要1200bps波特率,石英晶体选取11.0592MHz,保证波特率零误差,补偿电容选取30pF瓷片电容.复位电路在上电时为单片机提供复位信号,由10uF电容和10K电阻构成的RC充电电路构成,当系统复位上电瞬间,电源通过电阻R为电容充电,在电阻上得到下降的指数充电电压,由高电平经过一段时间到达低电平,提供单片机需要的高脉冲复位信号.电源部分电容为去耦电容.EA拉高,MCU上电后,从内部程序存储器开始执行.
(3)osyno6188及外围电路设计.
图3.9osyno6188及外围电路
系统采用4.5V电源供电模式,电源VDD由电源电路中VCC串接二极管后获得.电源电路、复位电路以及时钟电路参考osyno6188用户手册.RXD、TXD为串行总线接口,分别连接主控MCU的TXD、RXD端.
(4)DS12C887与AT89C52接口电路设计.
图3.10DS12C887接口电路
DS12C887的AD0-AD7为地址\数据复用总线,与控制器地址\数据总线(P0口)直接连接,R2为上拉电阻;
MOT为总线模式选择引脚,接地选择INTEL总线连接方式;
R/W在INTEL总线模式下位写使能,接控制器读信号WR(P3.6)端;
DS在INTEL总线模式下为读使能信号,接控制器读信号RD(P3.6)端;
AS为地址锁存,接控制器地址锁存信号ALE(30脚)端;
RST接电源拉高,片选CS直接接地使能。
由于液晶显示器、DS18B20与控制器接口比较简单,不再分开论述。
整机电路图如图3.11所示.
电路板采用单面板制作,电路板图由AltiumDesignerSummer09绘制.
将PCB文件底层打印到转印纸磨光面上,并按电路板大小留1cm左右边缘裁剪备用.把比电路板略大的覆铜板用细砂纸打磨干净,并将转印纸带墨一面覆盖到覆铜面上,一边用胶带粘牢,然后将粘胶带一边送入转印机转印,转印完成后打孔,放入三氯化铁溶液中腐蚀,大约15分钟左右腐蚀完成,用清水冲洗,将焊盘处用小刀将油墨小心刮开,其余部分油墨不再处理,一是比较美观,二是对铜膜具有保护作用,防止氧化.焊接经过检测过的电子元件,制作完成.
3.3软件设计
(1)功能分析
根据课题要求,软件应该能实现以下功能:
1)驱动LCD1602显示.
2)从DS12C887中读取时间数据,并写入调时信息和闹钟信息.
3)扫描键盘,实现人机交互,满足用户调时、定闹的需求.
4)实现控制器与DS18B20单总线接口,读取温度信息.
(2)设计流程
本课题所有程序均由C语言编写.开发环境为keiluvision2.
1)主程序设计
主程序流程图如图所示
图3.13主程序流程图
主程序作用是当系统上电后,首先对系统进行初始化(包括MCU的串行通信设置和LCD的初始化)然后读取时间信息和温度信息,检查是否需要更新时间缓冲存储区,如果系统处于正常显示模式,则更新时间缓存区,并同步显示,若系统处于调整时间模式下,则停止对时间缓冲区的更新,显示时间与时间缓存区同步,当退出调时模式时,更新到DS12C887的时标寄存器中.主程序还负责检测当前时间是否为整点或等于设定报时时间,在整点或定时时间调用报时函数,实现整点报时和定时
2)DS12C887接口程序.
DS12C887与控制器通过总线连接,主控器采取读写外部存储器的方法读取时间信息和写入调时和定时信息.DS12C887的时标寄存器地址为0-13字节,具体分布如图所示.
图3.14DS12C887存储器结构
其中10-13字节分别为寄存器A-D.其中寄存器C、D为只读.
寄存器A机构如图所示:
表3.5DS12C887寄存器A结构
UIP为更新标志位,标志芯片是否即将进行更新.当UIP为1时,表明更新即将开始;
为0时,表示在至少244μs内芯片不会进行更新,此时可以通过读写相应字节获取时间信息和设置信息.UIP位为只读位且不受复位信号影响,通过把B寄存器中的SET位置1将UIP位清零并禁止时间更新.DV0-DV2用来开关晶体振荡器和复位分频器,本课题中不需设置.RS0-RS3用于控制分频器输出,设置成不同的值可以在SQW引脚得到不同的分频输出或得到周期性的中断(通过控制寄存器B实现).由于本设计不涉及,具体设置值与对应频率请参考DS12C887技术文档,不在列举.
寄存器B结构如图所示.
表3.6DS12C887寄存器B结构
当SET位为0时,时间正常更新;
当SET位置1时,停止更新,此时,MUC可以对DS12C887进行初始化,该位不受复位信号影响.PIE位为周期性中断使能位,该位为1时,周期性中断使能;
为0时禁止中断.本课题中此位置0.AIE位为闹钟中断使能位本课题中由于没有使用中断,该位置0.UIE为更新完成中断使能位,本设计中不考虑.SQWE为方波使能信号,本设计不予处理.DM位为数据格式选择位,置1时时间数据以二进制格式存放,清0后,数据以BCD码格式存放.24/12位为时间格式设置位,该位为1时,时间为24小时格式,为0时,时间为12小时格式,该位不受复位信号影响.DSE为夏令时使能位,本设计不予考虑
寄存器C结构如图所示.
表3.7DS12C887寄存器C结构
其中4个有效位均为中断标志,本设计不予考虑,但当初始化完成并禁止中断时,应将该寄存器读取清0.
寄存器D结构如图所示
表3.8DS12C887寄存器D结构
VRT位指示片内锂电池状态,当为0时,说明内部锂电池耗尽,不能保证内部RAM中数据和时间数据的正确性.该位只读.
3)DS18B20接口程序设计.
DS18B20设置寄存器结构如图3.9所示
表3.9DS18B20设置寄存器结构
通过设置该寄存器中R1、R0的不同状态,可以得到不同的温度分辨率,分辨率越高,转换所需时间也越长(见图).为简便起见,本课题中采用系统复位后的默认值,即R1R0=11,分辨率为12位数据.其余位为传感器内部使用,不能进行操作.
表3.9DS18B20控制寄存器R0、R1设置与分辨率对应关系
由于DS18B20数据传送采取单总线方式,所以对操作时序和操作步骤有着严格的要求,任何不符合步骤的操作,都可能造成DS18B20不响应.每次在对DS18B20进行操作时,都要进行初始化.初始化时序如图所示:
图3.15DS18B20初始化时序图
首先,控制器将总线拉低并保持480μs,释放总线,等待15-60μs后,如果复位成功,DS18B20会将总线拉低,产生一个60-240μs的低脉冲,控制器通过检测低脉冲信号确定复位是否成功.复位成功后,在上拉电阻的作用下,DS18B20会恢复到高电平静止状态.在静止状态,总线在内部上拉电阻作用下,保持高电平.当控制器进行读写操作时,先将总线拉低1μs以上,DS18B20回应一个高电平应答信号,控制器检测到应答信号后,即可对总线进行操作.
向DS18B20读写一位数据时序如图所示:
图3.16DS18B20读写数据时序图
写”0”时,控制器将总线拉低30μs以上即可,写”1”时,控制器将总线拉低15μs,然后释放总线.读数据时,控制器将总线拉低15μs,然后释放总线并读取总线上的数据.
4)LCD显示驱动程序
a.基本操作时序:
读状态:
输入:
RS=L,RW=H,E=H输出:
D0-D8=状态字
写指令:
RS=L,RW=L,D0-D7=指令码,E=高脉冲输出:
无
读数据:
RS=H,RW=H,E=H输出:
D0-D7数据
写数据:
输入:
RS=H,RW=L,D0-D7=数据,E=高脉冲输出:
无
b.状态字说明
STA7
STA6
STA5
STA4
STA3
STA2
STA1
STA0
D7
D6
D5
D4
D3
D2
D1
D0
表3.10LCD状态字寄存器结构
STA0-STA6:
当前数据地址指针的数值
STA7:
读写操作使能1:
禁止,0:
允许
由于LCD指令集比较简单,不再详细介绍,请参考1602字符型液晶屏资料.
c.LCD复位流程如图所示:
图3.17LCD初始化流程图
初始化完成后,即可对液晶显示器进行操作,具体程序:
汇编程序:
ORG0000H
AJMPSTART
START:
ACALLSETTIME;
设置初始时间
LOOP:
ACALLGETTIME;
循环读取当前时间
AJMPLOOP;
SETTIME:
MOVDPTR,#7D0AH;
DS12C887的A寄存器
MOVA,#20H
MOVX@DPTR,A;
打开DS12C887的内部晶振并使RTC(实时时钟)记录时间
INCDPTR;
DS12C887的B寄存器
MOVA,#08H
设十进制BCD码,24小时制,不定时
MOVDPTR,#7D0DH;
DS12C887的D寄存器
MOVXA,@DPTR;
如果D寄存器的第7位为0,表示电池耗尽
JNBACC.7,ERROR
MOVDPTR,#7D00H;
DS12C887的秒单元
MOVA,#00H
写入秒
MOVDPTR,#7D02H;
DS12C887分单元
MOVA,#21H
写入分
MOVDPTR,#7D04H;
DS12C887时单元
MOVA,#03H
写入时
MOVDPTR,#7D06H;
DS12C887星期单元
写入星期
MOVDPTR,#7D07H;
DS12C887日单元
写入日
MOVDPTR,#7D08H;
DS12C887月单元
MOVA,#07H
写入月
MOVDPTR,#7D09H;
DS12C887年单元
MOVA,#05H
写入年时间
ERROR:
RET
GETTIME:
MOVDPTR,#7D0AH
MOVXA,@DPTR
JBACC.7,GETTIME;
REGISTERA的UIP位=0时才可以读数据
MOVDPTR,#7D00H
MOVR2,A;
SECONDS
ACALLDISPLAY
MOVDPTR,#7D02H
MOVR1,A
ACALLDISPLAY;
MINUTES
MOVDPTR,#7D04H
MOVR0,A;
HOURS
ACALLDELAY
DISPLAY:
MOVDPTR,#TAB
MOVSCON,#00H
MOVR3,A
ANLA,#0FH
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,R3
SWAPA
DELAY:
MOVR4,#0FH
DE1:
MOVR5,#0FFH
DJNZR5,$
DJNZR4,DE1
RET
TAB:
DB03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H
END
C语言源程序:
#include"
reg52.h"
absacc.h"
#defineDSAXBYTE[0x7F0A]//12c887寄存器A地址
#defineDSBXBYTE[0x7F0B]//B地址
#defineDSDXBYTE[0x7F0D]//D地址
#defineDS_HXBYTE[0x7F04]//时地址
#defineDS_MXBYTE[0x7F02]//分地址
#defineDS_SXBYTE[0x7F00]//秒地址
#defineDS_WXBYTE[0x7F06]//星期地址
#defineDS_DXBYTE[0x7F07]//日地址
#defineDS_MoXBYTE[0x7F08]//月地址
#defineDS_YXBYTE[0x7F09]//年地址
codeunsignedcharLED_code_tab[]={/*显示段笔划abcdefgh;
0=亮*/
0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,/*0,1,2,3,4,5,6,7*/
0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff/*8,9,A,b,C,d,E,F,全灭*/
};
sbitSet=P1^0;
//设置时间标志位
sbitSet_h=P1^1;
//设置小时
sbitSet_m=P1^2;
//设置分钟
sbitSet_s=P1^3;
//设置秒钟
codestructtime
{
intYear;
//当前时间年
intMonth;
//当前时间月
intDay;
//当前时间日
intWeek;
//当前时间星期
intHour;
//当前时间时
intMinutes;
//当前时间分
intSeconds;
//当前时间秒
inta_Hour;
//报警时间时
inta_Minutes;
//报警时间分
inta_Seconds;
//报警时间秒
};
structtimetime_n;
//保存当前时间的结构体
structtimetime_t;
//保存上次调用显示时的时间的结构体
voidInit();
//程序初始化函数
voidInit12c887();
//初始化12c887的函数
voidGetTime();
//获取当前时间的函数
voidShowTime();
//显示当前时间(设置)的函数
voidDisplay(inttemp);
//显示传入参数的函数
voidSetTime();
//用户设置时间函数
voidUpDateTime();
//更新12c887中时间的函数(供用户设置时间函数调用)
voidInit()//程序初始化函数
time_n.Seconds=0;
time_n.Minutes=0;
time_n.Hou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于51单片机的DS12C887时钟芯片的时钟电路设计 副本 基于 51 单片机 DS12C887 时钟 芯片 电路设计