基于DS12887的电子万年历
摘要:
本文介绍了一种以单片机为核心控制部件的电子万年历电路,它包括单片机电路,电源电路,程序下载电路,液晶模块,温度芯片电路,时钟芯片电路等。通过1602液晶显示器可以显示出时间,温度,通过三个按键可以调节时间,经过实验证明该电路能实现所需的功能和要求。
关键字:单片机,液晶,时钟芯片,温度芯片
一、 电路的原理
电子万年历电路包括单片机电路,电源电路,程序下载电路,液晶模块,温度芯片电路,时钟芯片电路等,电路图如图1所示,PCB如图2所示。
图1 万年历电路图
电子万年历电路的各个单元电路图分别如图2、图3所示
时钟电路按照芯片资料设计的电路图如图3所示,芯片AD0—AD7的8个引脚与单片机的P0口相连,进行数据的传输,另外还有4个芯片控制端口DS,R/W,RS,CS分别与单片机的P1^3—P1^0相连,用来控制芯片,还有一个方波输出端与P3^2相连,用于闹钟中断。
程序下载电路如图4所示,以MAX232芯片为核心,程序由串口输入通过芯片的电平转换由9,10引脚输出给单片机。从而完成程序的输入。
液晶电路如图5所示,液晶的DB0—DB7八个引脚分别与单片机的P2口相连,进行数据的传输,另外的EN,R/W,RS三个控制端口分别与单片机的P34,P35,P36三个端口相连,用于控制液晶,从而完成显示的功能。
单片机电路如图6所示,单片机的31脚和40脚接VCC,20脚接地,18,19脚接11.0592M的晶振,P0口接10k的排阻,其余的并口分别与相应的要控制的器件相连,用来控制器件的工作,以实现相应的功能。
电源电路如图7所示,其作用就是稳压,使之输出5V的稳定电压。输入9V的电压,经过整流桥整流,然后通过7805将电压稳定在5V,另外,还有滤波电容进行滤波,还有指示灯,用以显示电源是否接通。
图2时钟芯片电路
图3 单片机
芯片资料:
DS12887:
特性:
可作为计算机的时钟和日历
与MC146818B和DS1287的管脚兼容
芯片有内置锂电池在没有外部电源的情况下可工作10年
自带晶体振荡器及电池
可计算到2100年之前的秒、分、时、星期、日期、月、年等七种日历
信息并有闰年补偿
用12和24小时两种制式,12小时制有AM和FM提示
可选用夏令时间模式
可以应用于MOTOROLA和INTEL两种总线
数据/地址总线复用
建128字节RAM
可编程方波输出
总线兼容中断
DS18B20:
特性:
独特的单线接口仅需一个端口引脚进行通讯
简单的多点分布应用
无需外部器件
可通过数据线供电
零待机功耗
测温范围-55?—125?,以0.5?递增
温度以12位读出
温度数字转换时间200ms
用户可定义的非易失性温度报警设置
报警搜索命令识别并标志超过程序限定温度
应用包括温度控制、工业系统、消费品、温度计或热感测仪
元件清单:
磁片电容: 30pF 2个
电解电容: 22uF 1个
电阻: 1k 2个
10k 1个
330欧 1个
470欧 1个
排阻 10k 1个
晶振 11.0592M 1个
单片机 STC89C52 1片
4位数码管 1个
三极管 8550(npn) 4个
时钟芯片 DS12C887 1片
芯片插槽 DIP40 1个
DIP16 1个
按键 1个
开关 1个
电源接口 1个
电源 5V 1个
插针 2针 程序
#include
#include sbit dsds=P3^6;
sbit dsas=P3^4;
sbit dswr=P3^5;
sbit dscs=P3^3;
#define uchar unsigned char
#define uint unsigned char
code unsigned char
numa[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
uint miao,fen,shi,ri,yue,nian,xiq;
delay2(long nn)
{
while(nn--);
}
void disp(uchar wei,uchar shu)
{
switch(wei)
{
case 1:P0=0xef;P2=numa[shu]; break;
case 2:P0=0xdf;P2=numa[shu]; break;
case 3:P0=0xbf;P2=numa[shu]; break;
case 4:P0=0x7f;P2=numa[shu]; break;
default:P1=0xff; break;
}
}
void disp_all(void)
{
P2=0xff;
disp(1,fen/10);delay2(50);P2=0xff;
disp(2,fen%10);delay2(50);P2=0xff;
disp(3,miao/10);delay2(50);P2=0xff;
disp(4,miao%10);delay2(50);
}
void writeds(uint add,uint date) /*DS12CR887数据写入*/ {
dscs=0;
dsas=1;
dsds=1;
dswr=1;
P1=add;
dsas=0;
dswr=0;
P1=date;
dswr=1;
dsas=1;
dscs=1;
}
uint readds(uint add) /*DS12CR887数据读取*/ {
uint date;
dsas=1;
dsds=1;
dswr=1;
dscs=0;
P1=add;
dsas=0;
dsds=0;
P1=0xff; /*读取P2口,先给P2口全赋一*/
date=P1;
dsds=1;
dsas=1;
dscs=1;
return date;
}
void dsinit() /*DS12CR887初始化*/ {
EA=1;
EX0=1;
IT0=1;
writeds(0x0A,0x20); /*开启芯片振荡器*/
writeds(0x0B,0x26); /*开闹钟中断*/
writeds(1,0); /*设定闹钟时间*/
writeds(3,30);
writeds(5,8);
readds(0x0c); /*读闹钟中断标志位*/ }
main()
{
//ii=0;
//lcdinit();
delay2(1000);
fen=12;
shi=16;
xiq=7;
ri=10;
yue=1;
nian=9;
miao=0;
dsinit();
//writeds(0,miao);
//writeds(2,fen);
//writeds(4,shi);
//writeds(6,xiq);
//writeds(7,ri);
//writeds(8,yue);
//writeds(9,nian);
while(1)
{
miao=readds(0);
fen=readds(2);
//fen=%100;
//miao%=100;
//shi=readds(4);
//xiq=readds(6);
//ri=readds(7);
//yue=readds(8);
//nian=readds(9);
disp_all();
//disp(2,1);delay2(50);P2=0xff;
//delay2(16000);
}
}