当前位置:文档之家› 用DS1302与LCD1602可调数字万年历课程设计

用DS1302与LCD1602可调数字万年历课程设计

数字开发与实践课程设计题目:用DS1302与LCD1602设计可调式电子日历时钟班级:姓名:学号:学院:二O一二年六月五日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。

1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。

控制程序的编写等。

备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。

1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。

方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

但造价较高。

1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。

所以不用此种作为显示。

方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。

所以也不用此种作为显示。

方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。

LCD1602可实现显示2行十六个字符。

1.3.3、时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。

采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。

所以不采用此方案。

方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、星期、月、年以及闰年补偿的年进行计数,而且精度高,31*8位的RAM做为数据暂存区,工作电压范围为2.5V~5.5V,2.5V时耗电小于300nA。

1.3.4、电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;DS1302提供时钟;LCD1602液晶带汉字库显示屏作为显示部分。

二、硬件设计2.1、电路设计模块图如图2-1所示图2-12.2、系统总体设计原理图2.3、要求用proteus仿真软件仿真并抓图。

三、软件设计3.1、画出各个函数流程图。

3.1.1、DS1302实时控制芯片的流程图如图3-1图3-13.1.2、LCD1602液晶显示控制流程图如图3-2是图3-2如图3-3图3-33.2、写出程序代码。

/**************DS1302及1602时钟设计**********/ #include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define SECOND 0x81#define MINUTE 0x83#define HOUR 0x85sbit rs=P2^0;sbit rw=P2^1;sbit ep=P2^2;sbit DS1302_IO= P1^0;sbit DS1302_SCLK = P1^1;sbit DS1302_RST = P1^2;sbit M=P3^1; //选择sbit U=P3^2; // 加sbit D=P3^3; // 减sbit W=P3^4; //确定sbit SPK=P3^7; //蜂鸣器uchar sel=0;uchar code DIS1[]={"10 ji ying "};uchar code DIS2[]={"ke cheng she ji"};/////////////////////////延时////////////////////////////////void delay(uint ms){unsigned int a,b;for(a=0;a<ms;a++)for(b=0;b<124;b++);}/////////////////////////////////////////////////////////////***************DS1302驱动************************/////////////////////////////////////////////////////////////void DS1302_Write(uchar D){uchar i;for(i=0;i<8;i++){DS1302_IO =D&0x01;DS1302_SCLK=1;DS1302_SCLK=0;D=D>>1;}}uchar DS1302_Read(){uchar TempDat=0,i;for(i=0;i<8;i++){ TempDat>>=1;if(DS1302_IO) TempDat=TempDat|0x80;DS1302_SCLK=1;DS1302_SCLK=0;}return TempDat;}void WDS1302(uchar ucAddr, uchar ucDat){DS1302_RST = 0;DS1302_SCLK = 0;DS1302_RST = 1;DS1302_Write(ucAddr);DS1302_Write(ucDat);DS1302_SCLK = 1;DS1302_RST = 0;}uchar RDS1302(uchar ucAddr){uchar ucDat;DS1302_RST = 0;DS1302_SCLK = 0;DS1302_RST = 1;DS1302_Write(ucAddr);ucDat=DS1302_Read();DS1302_SCLK = 1;DS1302_RST = 0;return ucDat;}/////////////////DS1302的初始状态的时间设定///////////////////// void init_1302(){WDS1302(0x8e,0x00);//开保护寄存器WDS1302(0x80,0x50);//秒WDS1302(0x82,0x01);//分WDS1302(0x84,0x14);//时WDS1302(0x8A,0x03);//星期WDS1302(0x86,0x06);//日WDS1302(0x88,0x06);//月WDS1302(0x8C,0x12);//年WDS1302(0x90,0xab);//卷电流充电WDS1302(0x8e,0x80);//关保护寄存器}/************************1602驱动************************/ bit lcd_bz(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P0 & 0x80);ep = 0;return result;}////////////////////////////////////////////////////////void lcd_wcmd(uchar cmd){while(lcd_bz());rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep= 0;}/////////////////////////////////////////////////////////void lcd_pos(unsigned char pos){lcd_wcmd(pos | 0x80);}/////////////////////////////////////////////////////////void lcd_wdat(unsigned char dat){while(lcd_bz());rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//////////////////////////////////////////////////////////void lcd_init(){lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);}//////////////////////////////////////////////////////////*********************调时函数*************************//////////////////////////////////////////////////////////void set_time(){signed char address,item;signed char max,mini;if(M==0){sel++;delay(300);//if(sel==7) sel=0;if(sel==2) {address=0x82; max=59;mini=0; } //分if(sel==1) {address=0x84; max=23;mini=0; } //时if(sel==6) {address=0x8c; max=99;mini=9;} //年if(sel==4) {address=0x88; max=12;mini=1; } //月if(sel==5) {address=0x86; max=31;mini=1; } //日if(sel==3) {address=0x8A; max=07;mini=1;} //星期M=1;}item=((RDS1302(address+1))/16)*10 + (RDS1302(address+1))%16;if(U == 0){delay(200);U=1;item++;}if(D == 0){delay(200);D=1;item--;}if(W == 0){delay(200);sel=0;W=1;}if(item>max) item=mini;if(item<mini) item=max;WDS1302(0x8e,0x00);//允许写操作WDS1302(address,(item/10)*16+item%10); //写入DS1302 //转成BCD码WDS1302(0x8e,0x80);//写保护,禁止写操作}//////////////////////////////////////////////////////////*********************显示子函数************************/ /////////////////////////////////////////////////////////void lcdshow_u(uchar i,uchar y){lcd_wcmd(0x80+i);lcd_wdat(y);}void lcdshow_d(uchar i,uchar y){lcd_wcmd(0xC0+i);lcd_wdat(y);}/*******************显示函数****************************/ void display(void){uchar x,y;x=RDS1302(HOUR);//时y=x;x=x>>4; lcdshow_u(6,0x30+x);y=y&0x0f; lcdshow_u(7,0x30+y);lcdshow_u(8,':');x=RDS1302(MINUTE);//分y=x;x=x>>4; lcdshow_u(9,0x30+x);y=y&0x0f; lcdshow_u(0x0a,0x30+y);lcdshow_u(0x0b,':');x=RDS1302(SECOND);//秒y=x;x=x>>4; lcdshow_u(0x0c,0x30+x);y=y&0x0f; lcdshow_u(0x0d,0x30+y);x=RDS1302(0x8b);y=x;x=x>>4; lcdshow_u(0x0e,0x30+x);y=y&0x0f; lcdshow_u(0x0f,0x30+y);x=RDS1302(0x8d);y=x;x=x>>4; lcdshow_d(8,0x30+x);y=y&0x0f; lcdshow_d(9,0x30+y);lcdshow_d(0x0a,'-');x=RDS1302(0x89);y=x;x=x>>4; lcdshow_d(0x0b,0x30+x);y=y&0x0f; lcdshow_d(0x0c,0x30+y);lcdshow_d(0x0d,'-');x=RDS1302(0x87);y=x;x=x>>4; lcdshow_d(0x0e,0x30+x);y=y&0x0f; lcdshow_d(0x0f,0x30+y);/////////////////////下面的if实现每到8:10和14:10的提醒功能/////////////////////////////////if((RDS1302(HOUR)==0x14 & RDS1302(MINUTE)==0x10)| ( RDS1302(HOUR)==0x08 & RDS1302(MINUTE)==0x10)){SPK = 0;delay(200);SPK = 1;}for(x=45;x>0;x--){set_time();delay(10);}}/**************************主函数******************************/ void main(){uchar i;lcd_init();delay(10);lcd_pos(0x03);i = 0;while(DIS1[i] != '\0'){lcd_wdat(DIS1[i]);i++;}lcd_pos(0x41);i = 0;while(DIS2[i] != '\0'){lcd_wdat(DIS2[i]);delay(200);i++;}init_1302();delay(1000);for(i=0;i<17;i++){lcdshow_u(i,'>');delay(150) ;}for(i=0;i<17;i++){lcdshow_d(i,'<');delay(150) ;}lcd_init();delay(10);lcdshow_u(0,'T');lcdshow_u(1,'i');lcdshow_u(2,'m');lcdshow_u(3,'e');lcdshow_u(14,' ');lcdshow_d(0,'D');lcdshow_d(1,'a');lcdshow_d(2,'t');lcdshow_d(3,'a');lcdshow_d(6,'2');lcdshow_d(7,'0'); //LCD框架描绘while(1){set_time();if(sel==2){lcdshow_u(0X09,' ');lcdshow_u(0x0a,' ');delay(500); }if(sel==1){lcdshow_u(0X06, ' ');lcdshow_u(0X07,'if(sel==3) {lcdshow_u(0X0E,' ');lcdshow_u(0X0F,' ');delay(500); }if(sel==4){lcdshow_d(0x0b,' ');lcdshow_d(0x0c,' ');delay(500); }if(sel==5){lcdshow_d(0x0e,' ');lcdshow_d(0x0f,' ');delay(500); }if(sel==6) {lcdshow_d(0x08,' ');lcdshow_d(0x09,' ');delay(500); }if(sel==8) display();//调时LCD闪烁显示display();}}四、专业实习要求1、掌握常用设备的使用;2、掌握keil 编译环境的使用,熟悉proteus仿真软件的使用;3、基本掌握电路板的焊接调试技巧;4、基本掌握51单片机最小应用系统的组装、调试。

相关主题