基于DS12C887时钟芯片的多功能万年历设计模板.docx
《基于DS12C887时钟芯片的多功能万年历设计模板.docx》由会员分享,可在线阅读,更多相关《基于DS12C887时钟芯片的多功能万年历设计模板.docx(17页珍藏版)》请在冰点文库上搜索。
基于DS12C887时钟芯片的多功能万年历设计模板
一、系统的结构和工作原理
1.系统结构
此次课程设计的万年历,以AT89S52单片机为主控核心,由LCD显示屏、DS12C887时钟芯片、温度传感器DS18B20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。
图1系统结构框图
2.工作原理
主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的时间、星期、温度等值实时显示在LCD液晶屏上。
同时,主控制器不断的扫描按键电路和温度测量电路,当有按键按下时,识别出按键的值并调整相应的时间、星期值再写入时钟芯片内部。
温度数据由测量电路获得的环境温度值送人显示电路。
二、硬件设计
1.主控核心—AT89S52单片机
AT89S52是一个低功耗,高性能CMOS8位单片机,具有8K在系统可编程Flash存储器。
采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
2.DS12C887时钟电路
DS12C887与计算机常用的时钟芯片MC146818和DS12887管脚兼容,可直接替换。
采用DS12C887芯片设计的时钟电路无需任何外围电路和器件,并且有良好的微机接口。
DS12C887芯片内有微功耗,外围接口简单,精度高,工作稳定可靠等优点,广泛用于各种需要较高精度的实时时钟系统中。
DS12C887主要功能如下:
(1)内含一个锂电池,断电后运行十年以上不丢失数据;
(2)计秒、分、时、天、星期、日、月、年、并有闰年补偿功能;
(3)二进制数码或BCD码表示时间,日历和定闹;
(4)12小时或24小时制,12小时时钟模式带有PM和AM指示,有夏令时功能;
(5)Motorola和Intel总线时序选择;
(6)有128个字节RAM单元与软件接口,其中14个字节作为时钟和控制寄存器,114
字节为通用RAM,所有RAM单元数据都具有掉电保护功能;
(7)可编程方波信号输出;
(8)中断信号输出(IRQ)和总线兼容、定闹中断、周期性中断、时钟更新周期、结束
中断可分别由软件屏蔽,也可分别进行测试;
DS12C887时钟芯片和单片机的硬件连接如下图2:
图2DS12C887与单片机的连接
3.DS18B20温度传感器
采用数字式温度传感器DS18B20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。
另外,数字式温度传感器还具有测量精度高、测量范围广等优点。
DS18B20特性如下:
(1)独特的单线接口方式:
DS18B20与微处理器连接时仅需要一条口线即可实现微处
理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:
+3.0~+5.5 V。
(4)测温范围:
-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20芯片的连接如下图3所示:
图3DS18B20连接电路
4.LCD1602显示屏
本设计采用1602字符型LCD,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。
单片机的P2口与LCD的数据端口连接,用于数字信号的读取,控制端RS、R/W分别与单片机的P3.3和P3.1相连。
电路连接如图4所示。
图41602LCD硬件电路
5.其它硬件电路
蜂鸣器电路:
为了实现闹钟功能,选择蜂鸣器作为闹铃。
采用PNP型9015三极管,发射极e脚连接+5V,基极b脚连接10K电阻后接到单片机P1.6口上,c脚连接蜂鸣器。
电路如图5所示。
图5蜂鸣器电路
功能键盘:
本设计采用了4个键盘,分别实现万年历时间日期的调整键、闹钟设置键、增加键(也为闹钟开启键)、减小键组成,分别连接P1.0~P1.3口。
复位电路:
89S52的复位输入引脚RST为其提供了初始化的手段,可以使程序从指定处开始执行,在MCS-52的时钟电路工作后,只要RST引脚上出现超过两个机器周期以上的高电平时,即可产生复位的操作.只要RST保持高电平,则MCS-52循环复位.只有当RST由高电平变低电平以后,MCS-52才从0000H地址开始执行程序.本系统采用按键复位方式的复位电路。
电源电路:
电路采用5V电源进行供电,为了得到稳定的直流电源,通过电源处理电路进行调理,得到稳定电压。
三、软件设计
本次系统设计软件部分采用模块化结构,由主程序﹑DS12C887子程序、DS18B20子程序、LCD1602子程序构成。
模块程序设计法的主要优点是:
单个模块比起一个完整的程序易编写及调试;模块可以共存,一个模块可以被多个任务在不同条件下调用;模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
1.主程序说明及流程图
主程序主要实现了从DS12C887各时间单元中读出数据和DS18B20传感器中读取数据,并送到LCD1602中显示的功能,同时检测有没有按键按下,如果有键被按下,则执行按键处理子程序。
首先进行DS12C887时钟芯片、DS18B20芯片和LCD1602的初始化函数,然后进行按键扫描,不断地检测按键是否按下,读取DS12C887时钟芯片、DS18B20检测环境温度的数据,并且送到液晶显示器显示;当数据发生变化时候,重新进行扫描写入。
主程序流程图如图6。
图6主程序流程图
2.DS12C887流程图及初始化程序
进入主程序后,DS12C887首先进行初始化设置,若串行口有数据,最后则调用函数从日历时钟芯片获取日历时钟信息,调用显示函数显示日历时钟信息显示出来,重复进行。
这部分包括DS12C887某个单元写、读DS12C887某个单元的内容和DS12C887设定时间。
DS12C887的流程图如图7所示。
图7DS12C887的流程图
DS12C887的子程序:
#ifndefDS12C887_H
#defineDS12C887_H
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfm=P1^4;
sbitds_as=P3^5;
sbitds_wr=P3^6;
sbitds_ds=P3^7;
sbitds_cs=P2^0;
sbitds_irq=P3^2;
charsecond,minute,hour,asecond,aminute,ahour,day,week,month,year;
voidds_write(ucharadd,uchardate)//向DS12C887写数据的函数
{
ds_cs=0;
ds_as=1;
ds_ds=1;
ds_wr=1;
P0=add;
ds_as=0;
ds_wr=0;
P0=date;
ds_wr=1;
ds_as=1;
ds_cs=1;
}
uchards_read(ucharadd)//从DS12C887读数据的函数
{
uchards_date;
ds_as=1;
ds_ds=1;
ds_wr=1;
ds_cs=0;
P0=add;
ds_as=0;
ds_ds=0;
P0=0xff;
ds_date=P0;
ds_ds=1;
ds_as=1;
ds_cs=1;
returnds_date;
}
voidsettime()//设定时间初始值的函数第一次上电使用,之后可以屏蔽
{
ds_write(0x0b,0x26);//设置24小时模式,数据二进制格式
ds_write(0x0a,0x20);//打开振荡器
ds_write(0,55);
ds_write(1,0);
ds_write(2,59);
ds_write(3,0);
ds_write(4,23);
ds_write(5,0);
ds_write(6,5);
ds_write(7,1);
ds_write(8,1);
ds_write(9,9);
}
voidsetalarm()//将设定的闹钟时间写进DS12C887的函数
{
ds_write(1,asecond);
ds_write(3,aminute);
ds_write(5,ahour);
}
voidbeep()//闹钟的声音函数
{
fm=0;
delay(100);
fm=1;
delay(20);
fm=0;
delay(100);
fm=1;
}
#endif
3.DS18B20流程图及初始化程序
进入主程序后,DS18B20首先进行初始化设置,然后通过对环境温度的检测,,调用显示函数显示温度信息,重复进行。
DS18B20的流程图如图8所示。
图8DS18B20的流程图
DS18B20的子程序:
#ifndefDS18B20_H
#defineDS18B20_H
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitds18b20=P1^6;
ucharflag2/*零下标志位*/;
voiddelay1(uintz)//DS18B20延时函数
{
uinti;
while(z)
{
i=200;
while(i>0)
i--;
z--;
}
}
voiddsreset()//发送复位和初始化
{
uinti;
ds18b20=0;
i=103;
while(i>0)
i--;
ds18b20=1;
i=4;
while(i>0)
i--;
}
bittmpread_bit()//读取数据的一位
{
uinti;
bitdat;
ds18b20=0;
i++;
ds18b20=1;
i++;i++;
dat=ds18b20;
i=8;
while(i>0)
i--;
returndat;
}
uchartmpread_byte()//读一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpread_bit();
dat=(j<<7)|(dat>>1);
}
returndat;
}
voidtmpwrite(uchardat)//写一个字节
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写“1”
{
ds18b20=0;
i++;i++;
ds18b20=1;
i=8;
while(i>0)
i--;
}
else
{//写“0”
ds18b20=0;
i=8;
while(i>0)
i--;
ds18b20=1;
i++;i++;
}
}
}
voidtmpchange()//DS18B20开始转换
{
dsreset();
delay1
(1);
tmpwrite(0xcc);
tmpwrite(0x44);
}
uintread_tmp()//读取温度
{
uchara,b;
uintt;
floattt;
dsreset();
delay1
(1);
tmpwrite(0xcc);
tmpwrite(0xbe);
a=tmpread_byte();
b=tmpread_byte();
t=b;
t<<=8;
t=t|a;
if(t<0x0fff)
{
flag2=0;
}
else
{
flag2=1;
t=-t;
}
tt=t*0.0625;
t=tt*10+0.5;
returnt;
}
/*voidrom()//读取期间序列号子程序
{
//uchari;
ucharsn1,sn2;
dsreset();
delay1
(1);
tmpwrite(0x33);
sn1=tmpread2();
sn2=tmpread2();
}*/
voiddisplay_tem()//显示温度的函数
{
uchara,b,c,flagdate;
uintd;
tmpchange();
delay1(200);
d=read_tmp();
a=d/100;
b=d%100/10;
c=d%10;
if(flag2==0)
{
flagdate=0x20;
}
else
{
flagdate=0x2d;
}
write_spe(9,flagdate);
write_tem(10,a);
write_tem(11,b);
write_spe(12,46);
write_tem(13,c);
write_spe(14,223);
write_spe(15,'C');
}
#endif
四、个人心得及总结
通过这次的课程设计使我:
掌握智能数字万年历系统的基本设计方法;熟悉智能数字万年历系统的电路接口设计及常用的通信接口器件应用;熟练应用PROTEL99进行电路图的绘制。
理解数据采集处理模块、DS12C887时钟模块、RS232串口通信模块、键盘模块、点阵模块、数码管模块等接口应用。
课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,这次课程设计虽然很累,但我学到了很多东西,对软件的设计过程和方法有了更深入的了解,培养了我们的团队精神,锻炼了我们的沟通和表达能力。
通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的。
只有把理论知识与实践相结合起来,才能真正的为社会服务,从而提高自己的实际动手能力和独立思考能力。
这次课程实际,使我们在基本理论的综合应用及正确解决实际问题等方面得到了一次较好的训练。
提高了我们的思考、解决问题创新设计的能力,为以后的设计工作打下了较小的基础。
另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。
在我们遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息。
和队友之间相互讨论,明白了团队合作的重要性。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.