基于51单片机的DS12C887时钟芯片的程序
基于DS12C887时钟芯片的多功能万年历设计概要

一、系统的结构和工作原理 1.系统结构此次课程设计的万年历,以AT89S52单片机为主控核心,由LCD 显示屏、DS12C887时钟芯片、温度传感器DS18B20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。
AT89S52单片机温度传感器DS18B20DS12C887时钟芯片LCD 显示屏(1602)蜂鸣器复位电路功能键盘电源模块图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 :EA/VPP 31XTAL119XTAL218RESET 9P3.7/RD 17P3.6/WR 16P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN 29ALE/PROG 30P3.1/TXD 11P3.0/RXD 10VCC 40GND 20U1AT89S52VCC+C1210u FR910KS17Y112MHzC930p FC1030p FP00P01P02P03P04P05P06P07VCCP20P21P22P23P24P25P27P26P10P11P12P04P13P14P15P16P00P17P01P32P02P30P03P31P05P33P06P34P07P35P20P35WR P37P32P34242322212019181716151413121110987654321DS12C887CSASR/WNCDSRESETIRQNCNCNCSQWVCCGND AD7AD6AD5AD4AD3AD2AD1AD0NC MOT NC 123456789RP1RESPACKVCCU3P36P37图2 DS12C887与单片机的连接3.DS18B20温度传感器采用数字式温度传感器DS18B20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除A/D 模块,降低硬件成本,简化系统电路。
基于51单片机驱动DS12CR887时钟芯片用1602液晶显示的完整程序

#include<reg52.h>#include<define.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint z);sbit lcdrs=P3^5;sbit lcd_e=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P1^3;sbit s4=P1^2;sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^2;sbit beep=P2^3;void set_time();void Disp_xq();void write_ds(uchar,uchar);uchar read_ds(uchar);uchar num,i,y,xq,mon,d,h,m,s,l,*p,als,alm,alh,a,aa;//定义全局变量uchar code table1[]="2013 02 13 TUE ";uchar code table2[]=" 00:00:00 00:00";uchar code table3[]={15,12,8,5,2, 14,9,6,3};uchar code table4[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02, /*年*/0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00, /*月*/0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00, /*日*/0x11,0x0E,0x1F,0x1F,0x1F,0x0A,0x11,0x00,};/*闹钟符号*/uchar code table5[7][3]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"}; void delay(uint z)//延时函数{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void keyscan() //键位函数{ uchar j;if(s4==0) //闹铃开关{delay(5);while(!s4);if(a==0)a=1;else a=0;}if(s1==0) //调时键{ write_ds(0x0A,0x60);delay(5);while(!s1);if(aa<5)set_XY(table3[aa],1);else set_XY(table3[aa],0);write_com(0x0f);aa++;i=1;j=aa-1;if(aa==10){ aa=0;i=0;write_ds(0x0A,0xa0);write_com(0x0c);}while(s1==i){ delay(5);if(s4==0) //退出调时{delay(5);while(!s4);i=0;aa=0;}if(s2==0) //按键每次加1{delay(5);while(!s2);switch(j){delay(5);case 0:{alm++;if(alm==60)alm=0;write_ds(3,alm);write_sfm1(14,alm);write_com(0x80+0x40+15);};break; //闹铃分case 1:{alh++;if(alh==24)alh=0;write_ds(5,alh);write_sfm1(11,alh);write_com(0x80+0x40+12);};break; //闹铃时case 2:{s++;if(s==60)s=0;write_ds(0,s);write_sfm1(7,s);write_com(0x80+0x40+8);};break; //秒case 3:{m++;if(m==60)m=0;write_ds(2,m);write_sfm1(4,m);write_com(0x80+0x40+5);};break; //分case 4:{h++;if(h==24)h=0;write_ds(4,h);write_sfm1(1,h);write_com(0x80+0x40+2);};break; //时case 5:{xq++;if(xq==8)xq=1;write_ds(6,xq);Disp_xq();};break;//星期case 6:{d++;if(d==31)d=1;write_ds(7,d);write_sfm2(8,d);write_com(0x80+9);};break; //日case 7:{mon++;if(mon==13)mon=1;write_ds(8,mon);write_sfm2(5,mon);write_com(0x80+6);};break; //月case 8:{y++;if(y==64)y=0;write_ds(9,y);write_sfm2(2,y);write_com(0x80+3);}; break; //年}}if(s3==0) //按键每次减1{delay(5);while(!s3);switch(j){ delay(5);case 0:{if(alm==0)alm=60;alm--;write_ds(3,alm);write_sfm1(14,alm);write_com(0x80+0x40+15);};break; //闹铃分case 1:{if(alh==0)alh=24;alh--;write_ds(5,alh);write_sfm1(11,alh);write_com(0x80+0x40+12);};break; //闹铃时case 2:{if(s==0)s=60;s--;write_ds(0,s);write_sfm1(7,s);write_com(0x80+0x40+8);};break; //秒case 3:{if(m==0)m=60;m--;write_ds(2,m);write_sfm1(4,m);write_com(0x80+0x40+5);};break; //分case 4:{if(h==0)h=24;h--;write_ds(4,h);write_sfm1(1,h);write_com(0x80+0x40+2);};break; //时case 5:{if(xq==1)xq=8;xq--;write_ds(6,xq);Disp_xq();};break;//星期case 6:{if(d==1)d=31;d--;write_ds(7,d);write_sfm2(8,d);write_com(0x80+9);};break; //日case7:{if(mon==1)mon=13;mon--;write_ds(8,mon);write_sfm2(5,mon);write_com(0x80+6);};break; //月case 8:{if(y==0)y=64;y--;write_ds(9,y);write_sfm2(2,y);write_com(0x80+3);}; break; //年}}}}}void write_com(uchar com)//1602命令函数{lcdrs=0;P0=com;delay(1);lcd_e=1;delay(1);lcd_e=0;}void write_data(uchar date) //1602数据函数{lcdrs=1;P0=date;delay(1);lcd_e=1;delay(1);lcd_e=0;}void set_XY(uchar X,uchar Y)//设置字符显示位置{if(Y==0)X+=0x80;else X|=0xC0;write_com(X);}void DispOneChar(uchar X,uchar Y,uchar Data){ //显示单个字符set_XY(X,Y);write_data(Data);}void DispChars(uchar X,uchar Y,uchar *p,uchar count){ //显示字符串uchar i;for(i=0;i<count;i++){set_XY(X,Y);write_data(*p);X++;p++;}}void HZ() //写入自定义字符{uchar i;write_com(0x40);for(i=0;i<32;i++)write_data(table4[i]);}void write_sfm1(uchar add,uchar date)//写入s m h{ uchar ge,shi;ge=date%10;shi=date/10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_sfm2(uchar add,uchar date)//写入y mon d{ uchar ge,shi;ge=date%10;shi=date/10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void init () //初初初初初初初初初初初初初初始化函数{ beep=0;a=0;aa=0;i=0;lcd_e=0;EA=1;EX0=1;IT0=1;write_ds(0x0B,0x26);//DS寄存器B// read_ds(0x0C); //DS寄存器C write_ds(0x0A,0x20);//DS寄存器Awrite_com(0x38); //指令6write_com(0x0c); //指令4write_com(0x01); //指令1write_com(0x80); //指令8write_com(0x06); //指令3DispChars(0,1,p=table2,16);//00:00:00DispChars(0,0,p=table1,2);//20set_time();}void write_ds(uchar add,uchar date){dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add){uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}#include<keyscan.h>void set_time()//设置时间{write_ds(9,13);//年write_ds(8,2);//月write_ds(7,18);//日write_ds(6,4);//星期write_ds(5,0);//闹铃时write_ds(4,0);//时write_ds(3,1);//闹铃分write_ds(2,0);//分write_ds(1,0);//闹铃秒}void Disp_time() //读出时间{if(i==0){ write_ds(0x0A,0xa0);write_com(0x0c);s=read_ds(0);//读秒m=read_ds(2);//读分alm=read_ds(3); //闹铃分h=read_ds(4);//读时alh=read_ds(5);//闹铃时d=read_ds(7);//读日xq=read_ds(6);//读星期mon=read_ds(8);//读月y=read_ds(9);//读年write_sfm1(7,s);//显秒write_sfm1(4,m);//显分write_sfm1(14,alm);//闹铃分write_sfm1(1,h);//显时write_sfm1(11,alh);//闹铃时write_sfm2(8,d);//显日write_sfm2(5,mon);//显月write_sfm2(2,y);//显年}}void Disp_xq() //显星期{uchar t;write_com(0x0c);xq=read_ds(6);for(t=0;t<3;t++)DispOneChar(t+12,0,table5[xq-1][t]);}void Disp_HZ() //显示自定义字符{HZ();write_com(0x0c);DispOneChar(4,0,0x00);//显示年DispOneChar(7,0,0x01);//显示月DispOneChar(10,0,0x02);//显示日if(a==0)DispOneChar(10,1,0x03);//显示闹钟符号else DispOneChar(10,1,0x20);}void main() //主函数{init();while(1){ Disp_HZ();keyscan();Disp_time();Disp_xq();}}void exter() interrupt 0{beep=1;delay(500);// write_ds(0x0C,0x00);}。
DS12C887 例程

num1=0;
}
}
if(jian==0)//闹铃减少键
delay(9);
if(jian=);
switch(num1)
{
case 1:
shi=read(0x05);
shi--;
if(shi==-1)
shi=23;
writesfm(4,shi);
write(0x05,shi);
yue++;
if(yue==13)
yue=1;
writeryn(6,yue);
write(0x08,yue);
break;
case 3:
ri=read(0x07);
ri++;
if(ri==32)
ri=1;
writeryn(9,ri);
write(0x07,ri);
break;
case 4:
shi=read(0x04);
write(0x08,2);
write(0x09,15);
write(0x06,3);
}
void initalize()//液晶初始化函数
{
command(0x38);
command(0x0c);
command(0x04);
command(0x01);
}
void writesfm(uchar dizhi,uchar shuju)//写入液晶显示时分秒
miao=read(0x00);
miao++;
if(miao==60)
miao=0;
writesfm(10,miao);
write(0x00,miao);
break;
基于DS12CR887的多功能电子时钟设计

基于DS12CR887的多功能电子时钟设计作者:刘坤来源:《数字化用户》2013年第07期【摘要】本设计主要对51系列单片机控制的多功能实时时钟进行了研究,时钟芯片采用美国DALLAS公司生产的DS12CR887芯片,单片机采用STC89C52RC芯片,液晶屏用YM1602C型LCD。
实现了声控背光,液晶显示,时间显示,时间设置,闹钟提醒,闹钟设置等功能。
【关键词】实时时钟DS12CR887 单片机STC89C52RC 液晶屏YM1602C在日常生活中和自动控制系统中,经常遇到对时间实时监控的需求,这就给具有多种功能的时钟提供了市场。
这里给出了时钟芯片DS12CR887及液晶显示屏YM1602C与单片机的连接电路,声控背光电路,软件流程等供大家参考。
一、设计思路本设计为模块化设计,总体上可分为三个模块:(一)电源模块:系统输入12V±3V直流电压,经三端集成稳压器7805整成标准5V直流电,去耦后可为单片机及其他芯片供电。
(二)声控背光:传感器采用电容式麦克风,经两级三极管放大电路对声音信号进行放大,再经缓冲器增加其驱动能力,最后和单片机的一个控制引脚与非后接到LCD背光正极。
(三)主体电路:由单片机,实时时钟芯片,液晶屏和键盘组成。
单片机,时钟,液晶屏都挂在数据总线上进行数据交换,时钟和液晶屏通过少数地址总线和控制总线和单片机相连,以便控制。
二、电路硬件设计电路硬件接线图如图1所示:单片机P0口作为数据口连接在数据总线上[1],数据总线上还挂有液晶屏和时钟芯片,P2口中的一部分做了控制引脚,P2.4接液晶屏的使能端,P2.2接液晶屏的读写选择端,P2.0接液晶屏的命令数据选择端,P2.1经非门接时钟芯片的使能端,单片机的读写分别接时钟芯片的读写引脚,P1口的低四位和外部中断1引脚做了独立键盘输入,外部中断0接了时钟芯片的中断输出引脚,电容式麦克风经两级三极管放大电路放大[2]和P1.4引脚共同控制液晶屏背光,时钟芯片的方波输出端接蜂鸣器作为闹钟动作装置。
基于51单片机的DS12C887时钟芯片的时钟电路设计

摘要:本设计开发了一款具有日期、时间、星期和气温同步显示功能的电子时钟.工作原理是主控MCU读取实时时钟芯片DS12C887,获取时间信息,由全数字单总线结构温度传感器DS18B20读取温度信息,经MCU处理,送LCD显示,关键字:DS12C887 DS18B20 电子时前言随着科学技术的不断发展, 人们对时间计量的要求越来越高。
在当今社会,电子时钟已经得到相当广泛的应用,产品多样,发展更是多元化。
本作品是以STC89C51单片机作为主控芯片,使用12MHZ的晶振,使用专用时钟日历芯片DS12C887产生时间信息,时间精确。
软件部分以C语言为主体,用1602LCD液晶屏显示输出信息,输出信息量多,更直观、人性化。
该时钟可实现人机交互,可通过提供的键盘对其进行调整。
系统具有以下功能:年、月、日、时、分、秒显示;12小时/24小时模式切换,在12小时模式中,用AM和PM区分上午和下午;秒表功能;整点闹铃和报时功能,且闹钟可设置多组。
本次设计的电子时钟系统由单片机最小系统,1602LCD液晶屏,时钟芯片,调整按键,蜂鸣器,电源五大部分组成。
1. 课题分析随着电子技术的发展,电子技术为人们的生活带来了越来越大的方便.本课题旨在借助实时时钟芯片DS12C887和温度传感器DS18B20 和51单片机设计一个多功能的电子时钟.由于DS12C887芯片内附加锂电池,在上电情况下可以通过电源充电,断电后可以利用内部锂电池供电继续工作,在掉电重新上电后,不影响时间数据,不需重新对时,方便可靠.2. 方案论证方案一、利用单片机内部定时器产生秒信号,通过软件处理得到时间信息,送LCD显示.方案二、利用通用串行实时时钟芯片DS1302产生时间信息,利用MCU读取时间信息,送LCD 显示.方案三、通过实时时钟芯片DS12887,获取时间信息,经MCU处理,送LCD显示.方案一电路结构简单,可控性强,但断电后时间数据完全消失,再次上电后需重新设定,且由于电路本身缺陷和附加干扰较多,时间误差较大.方案二电路结构简单,时间精度较高,由于使用串行数据传输,节省MCU资源,但DS1302无内置电池,掉电后,数据丢失,重新上电后需对时.方案三采用实时时钟芯片DS12C887,其内部具有内置锂电池,在掉电的情况下可以正常工作10年以上,且带有非易失性RAM,可以保证在掉电的情况下,用户的定时信息不会丢失;带有温度补偿,保证时间数据的准确.经过综合考虑,我们认为方案三满足设计需求.2.2温度部分由于只是测量气温,用数字温度传感器单总线结构DS18B20即可满足要求,该器件采用单总线结构,且数字传输,可以与CPU直接接口,电路结构简便,可靠性好.2.3主控部分选用单片微控制器AT89C52作为主控.系统方案方框图如图2.1所示.图2.1 系统方案3.方案实现3.1 器件简介(1)AT89C52AT89C52是ATMEL公司生产的通用低功耗8位CMOS微控器,具有8051内核和8KB的可编程Flash程序存储空间以及256字节RAM.有32个通用IO口线和全双工串口,两个数据指针、两个16位可编程计数器/定时器、8个2级优先级中断源,具有片内时钟电路,通过简单的外接器件即可实现时钟电路.(2)DS12C887引脚结构及其功能如图3.1.图3.1 DS12C887引脚结构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.2 DS12C887内部结构(3)DS18B20DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术.全部传感元件及转换电路仅集成在形如三极管的一个集成电路内.DS18B20采用单总线接口方式,与微处理器连接时仅需要一条总线即可实现微处理器与DS18B20的双向通讯;支持多点组网功能,多个DS18B20可以并联在一条总线上,即可实现多点测温;在使用中不需要任何外围元件.测温范围为-55℃~+125℃,结果以9位数字量方式串行传送.DS18B20测温原理如图3.3所示.图3.3 DS18B20内部结构图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器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.1 DS18B20温度数据格式DS18B20采用12位二进制数据表示温度,分成两个字节,低字节低四位为小数位,低字节高四位和高字节低四位组成温度信息的8位整数位,其中第一位为符号位,为0表示温度为正值,为1表示温度为负值.当温度为负值时,数据采用补码存放.高字节高四位无效,与符号位保持一致.温度与数据对应关系如表3.2所示.表3.2 部分温度对应数据3.2硬件电路设计本课题涉及电路原理图和PCB图均由Altium Designer Summer 09绘制.(1)电源部分图3.7 整机电源电路由于电路微控器供电电压为5V,osyno6188供电电压为3V或4.5V,osyno6188对电源电压精度要求不高,决定整机采用5V电源供电,在电源处串联一只1N4003二极管,为osyno6188供电,1N4003为硅管,正向导通压降在0.7V左右,经过二极管后,得到约4.3V 电压,为osyno6188供电.电源电路为普通稳压电源电路,由于不是本项目主要方面,不再赘述.(2)AT89C52最小系统电路图3.8 AT89C52单片机最小系统电路由震荡电路,复位电路和单片机构成最小系统.震荡电路为单片机提供工作时钟,由石英晶体和补偿电容构成.由于语音部分需要1200bps波特率,石英晶体选取11.0592MHz,保证波特率零误差,补偿电容选取30pF瓷片电容.复位电路在上电时为单片机提供复位信号,由10uF电容和10K电阻构成的RC充电电路构成,当系统复位上电瞬间,电源通过电阻R为电容充电,在电阻上得到下降的指数充电电压,由高电平经过一段时间到达低电平,提供单片机需要的高脉冲复位信号.电源部分电容为去耦电容.EA拉高,MCU 上电后,从内部程序存储器开始执行.(3)osyno6188及外围电路设计.图3.9 osyno6188及外围电路系统采用4.5V电源供电模式,电源VDD由电源电路中VCC串接二极管后获得.电源电路、复位电路以及时钟电路参考osyno6188用户手册.RXD、TXD为串行总线接口,分别连接主控MCU的TXD、RXD端.(4)DS12C887与AT89C52接口电路设计.图3.10 DS12C887接口电路DS12C887的AD0-AD7为地址\数据复用总线,与控制器地址\数据总线(P0口)直接连接,R2为上拉电阻;MOT为总线模式选择引脚,接地选择INTEL总线连接方式;R/W在INTEL 总线模式下位写使能,接控制器读信号WR(P3.6)端;DS在INTEL总线模式下为读使能信号,接控制器读信号RD(P3.6)端;AS为地址锁存,接控制器地址锁存信号ALE(30脚)端;RST接电源拉高,片选CS直接接地使能。
基于51单片机电子时钟设计

基于51单片机的电子时钟设计摘要本电子时钟以STC89C52单片机作为主控芯片,采用DS12C887时钟芯片,使用1602液晶作为显示输出。
该时钟走时精确,具有闹钟设置,以及可同时显示时间、日期等多种功能。
本文将详细介绍该电子时钟涉及到的一些基本原理,从硬件和软件两方面进行分析。
【关键词】STC89C52单片机DS12C887时钟芯片1602液晶蜂鸣器目录一、绪论 (4)1.1 电子时钟功能 (4)1.2设计方案 (4)二、硬件设计 (4)2.151单片机部分设计 (4)2.2USB供电电路设计 (5)2.3 串行通信电路设计 (6)2.4DS12C887时钟芯片电路的设计 (6)2.51602LCD液晶屏显示电路设计 (7)2.6蜂鸣器电路设计 (8)2.7按键调整电路设计 (8)三、软件设计 (9)3.1系统程序流程图设计 (9)3.2程序设计 (11)四、心得体会 (22)参考文献 (23)一、绪论1.1电子时钟功能(1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。
(2)具有闹铃设定即到时报警功能,报警响起时按任意键可取消报警。
(3)能够使用实验板上的按键随时调节各个参数,四个有效键分别为功能选择键、数值增大键、数值减小键和闹钟查看键。
(4)每次有键按下时,蜂鸣器都以短“滴”声报警。
(5)利用DS12C887自身掉电可继续走时的特性,该时钟可实现断电时间不停、再次上电时时间仍准确显示在液晶上的功能。
1.2设计方案DS12C887时钟芯片+1602LCD液晶屏DS12C887时钟芯片功能丰富、价格适中,能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部含有世纪寄存器,从而利用硬件电路解决“千年”问题。
DS12C887中自带锂电池,外部掉电时,其内部时间信息还能保持10年之久。
1602LCD液晶屏可以输出2行,每行显示16个字符。
1602LCD液晶屏显示清晰且不会闪烁,由于液晶屏是数字式的,因此和单片机系统的接口简单,操作方便。
基于DS12C887的高精度时钟设计

基于DS12C887的高精度时钟设计摘要:设计以ATM89C52单片机为核心的,采用LCD1602液晶和专门时钟芯片DS12C887的高精度时钟,该时钟具有电路结构简单合理、显示精度高和实时更新显示等特点。
介绍了DS12C887芯片和LCD1602液晶的特点、功能和实现方法,给出了ATM89C52单片机的外部接口电路和相关程序的设计方法。
关键词:单片机;时钟芯片;实时时钟;接口电路0引言随着人们生活水平的提高和智能化电子集成的发展,许多电子设备,通常要进行与时间有关的控制,并需要记录实时的时间信息。
许多重要的信息不仅需要记录其内容,还需要记录发生的准确时间。
有些设备需要长时间运行并且保证掉电数据不丢失。
通常的单片机并没有这样的实时时钟功能,单片机掉电或者时钟晶振的误差会导致时间错乱。
如果完全用程序设计时钟,又会占用单片机大量的系统资源,影响到其他功能的实现。
美国Dallas公司的DS12C887实时时钟芯片,将晶振、写保护电路、可充电锂电池等集成,可保证时钟精确、掉电时时钟数据不丢失,可靠性高,使用简单。
1系统原理本系统利用DS12C887芯片设计的高精度时钟,与52单片机相连,通过1602液晶显示,实现在1602液晶上精确显示年、月、日、时、分、秒,并且在掉电的情况下仍能记录时间数据,通电后更新实时显示,与矩阵键盘相连接,能够使用按键调节时间,设定闹钟。
2核心芯片AT89C52单片机本系统核心芯片采用ATMEL公司生产的AT89C52单片机。
AT89C52是51系列单片机的其中一种型号,是一种低电压、高性能的8位单片机。
其片内含有8K bytes的可反复擦写Flash只读程序存储器和256 bytes的随机存取数据存储器。
AT89C52有40个引脚,其中32个为外部双向输入/输出(I/O)引脚,同时内含2个外部中断口,51单片机内部共有定时器T0和定时器T1两个16位可编程定时/计数器,AT89C52单片机内部比51单片机多一个T2定时/计数器,它们可以按照常规方法进行编程,并兼容标准MCS-51指令系统。
基于ds12c887的多功能时钟设计

中北大学大学生电子设计竞赛项目总结技术报告负责人:学号:学院、系:信息与通信工程学院专业:光电信息工程联系电话:E_m a i l: 1677882726@项目名称:基于DS12C887时钟芯片的多功能时钟设计指导教师:小组成员:赵策、高洁、黄康2013年 03 月 01 日目录一、设计背景 (3)二、主要研究内容 (3)三、总体思路与研究方案1、LCD1602模块 (4)2、DS18B20模块 (6)3、蜂鸣器 (9)4、独立键盘模块 (9)5、时钟芯片DS12C887模块 (15)四、主要研究成果 (17)五、存在问题即以后努力方向 (18)附件:设计原理图一、项目背景在本次全国大学生电子设计大赛人员选拨之际,我小组准备设计出一个多功能高精度时钟。
众所周知,电子时钟在日常生活中十分常见,本实验原利用单片机定时器中断系统来实现时钟设计,但考虑到走时不够精确,又不具有掉电保护功能,偶尔的掉电和晶振的误差都会造成时间的错乱,并且完全用程序计时也会占用大量的系统资源,影响其他系统的正常运行,与正常的时钟相比相去甚远,所以我们改用新的方案加以实现。
本方案采用时钟芯片DS12C887与单品机实验板相连,DS12C887芯片相比一些如DS1302等表贴式芯片体积较大,内部集成了可充电锂电池,同时内部还集成了32.768KHz 的标准晶振,一旦设定好时间,即使系统主电源掉电,该芯片仍然可以靠内部电源正常运行,当系统重新上电后,可继续给锂电池充电,这样可有效的保证了时间的延续性,并且精度高,运行稳定,使用方便,广泛应用于各种高精度的实时时钟系统中。
该芯片与晶振和电池集成在了一起,能自动产生世纪、年、月、日、时、分、秒等时间信息,少于31天的月份,月末日期自动调整,具有闰年补偿功能,有效期至2100年,对于一天的时间可有12小时制和24小时制两种模式,在12小时制中利用AM 和PM 来提示上午还是下午。
该时钟芯片内部有一个精密的温度补偿电路,用来监视Vcc 的状态,如果主电源有故障,会自动切换到备用电源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2011-10-03 MON"; uchar code table1[]=" 00:00:00"; sbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P2^5;sbit dscs=P1^0;sbit dsas=P1^1;sbit dsrw=P1^2;sbit dsds=P1^3;sbit dsirq=P3^3;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;uchar num,nian,yue,ri,zhou,s1num,flag; char miao,fen,shi;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_ds(uchar add,uchar date) {dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add){uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}/*void set_time(){write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);} */void write_week(char date){write_com(0x80+13);switch(date){case 1: write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2: write_date('T');delay(5);write_date('U');delay(5);write_date('S');break;case 3: write_date('W');delay(5);write_date('E');delay(5);write_date('D');break;case 4: write_date('T');delay(5);write_date('H');delay(5);write_date('U');break;case 5: write_date('F');delay(5);write_date('R');delay(5);write_date('I');break;case 6: write_date('S');delay(5);write_date('A');delay(5);write_date('T');break;case 7: write_date('S');delay(5);write_date('U');delay(5);write_date('N');break;}}void set_time(){//write_ds(2,30);//write_ds(4,12);//write_ds(9,11);write_ds(8,10);write_ds(7,4);write_ds(6,2);}void keyscan(){rd=0;//s1=0;if(s1==0){delay(5);if(s1==0);{flag=1;s1num++;while(!s1);if(s1num==1){write_com(0x80+0x40+10);write_com(0x0f);} //delay(1000);}if(s1num==2){write_com(0x80+0x40+7);write_com(0x0f);//delay(1000);}if(s1num==3){write_com(0x80+0x40+4);write_com(0x0f);//delay(1000);}if(s1num==4){ flag=0;s1num=0;write_com(0x0c);}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);write_ds(0,miao);}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);write_ds(2,fen);}{shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);write_ds(4,shi);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){/* if(miao==0){miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);}*/miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);write_ds(0,miao);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);write_ds(2,fen);}if(s1num==3){shi--;shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);write_ds(4,shi);}}}}}void init(){lcdrw=0;lcden=0;// write_ds(0x0A,0x20); //// write_ds(0x0B,0x26); //// set_time(); //这三句话为初始化DS12C887,首次使用时调用这三句话,此后不必调用set_time();write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}// EA=1;// EX0=1;// IT0=1;}void main(){init();while(1){keyscan();if(flag==0){miao=read_ds(0);fen=read_ds(2);shi=read_ds(4);nian=read_ds(9);yue=read_ds(8);ri=read_ds(7);zhou=read_ds(6);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);write_nyr(4,nian);write_nyr(7,yue);write_nyr(10,ri);write_week(zhou);}}}。