您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的万年历设计
基于51单片机的电子万年历的设计报告第五小组2012.2.22一、项目概述随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。本设计是数据采集及处理,键盘控制,显示系统及报警系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。二、项目要求①具有年、月、日、星期、时、分、秒等功能;②具有温度计功能;③具备年、月、日、星期、时、分、秒校准功能;三、系统设计1、框图设计AT89C51主控模块Ds12864液晶显示Ds1302时钟电路按键扫描Ds18b20实时环境温度采集电路报警提示电路2、知识点(1)时钟芯片DS1302的工作原理:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2)DS1302的控制字节DS1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出RAMRD1A4A3A2A1A0/CK/WR表-1DS1302的控制字格式(3)数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图-4所示图-4DS1302读/写时序图(4)DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表-2。表-2DS1302的日历、时间寄存器此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。四、硬件设计本电路是由AT89S51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成;1、电路原理图2、元件清单名称型号数量单片机AT89SC511液晶显示器JHD12864F1电阻10k(1/4w)5电阻1k5电阻200欧姆5电阻4.7k5电阻4.7k5电位器10k1电容10u/16V1电容30p4三极管90131轻触按键小(尺寸6×6mm×5.5)4蜂鸣器5V1晶振12M(小体积)1底座8脚1底座40脚1发光二极管红1发光二极管绿1时钟芯片DS13021纽扣电池及底座3V(大)1液晶插槽20孔1单排针3排120杜邦线及杜邦头1股40电路板AOA51五、软件设计本系统的软件系统主要分为主程序、液晶程序、时钟程序。1.程序流程图开始初始化读、写日期、时间和温度分离日期\时间\温度显示值显示子程序日期、时间修改子程序主程序框图设置流程图2.程序清单(1).主程序:#includereg51.h#includeabsacc.h#includeds1302.h#includeds18b20.h#includelcd12864.h//按键定义sbitKEY0=P2^3;//设置sbitKEY3=P2^4;//退出sbitKEY1=P2^5;//减sbitKEY2=P2^6;//加sbitLED1=P3^0;sbitLED2=P3^1;sbitLED3=P3^2;unsignedcharw=0;//调时标志位//键盘函数所要用到的变量unsignedcharkey_operate=0;//设置模式unsignedchartimer=0;unsignedcharkey_flag;unsignedintcounter=0;unsignedcharLcd_t=0;//LCD刷新间隔unsignedcharss;//全局变量unsignedintv,getdata,getdataa;staticunsignedcharmenu=0;//定义静态小时更新用数据变量staticunsignedcharkeys=0;//定义静态小时更新用数据变量staticunsignedchartimecount=0;//定义静态软件计数器变量unsignedintflag=0;//定义并初始化flagunsignedcharDS=10;//定义并初始化DSunsignedcharDSS=1;//定义并初始化DSSunsignedcharflag1=0;unsignedcharflag2=0;unsignedcharflag3=0;unsignedcharflag4=0;voidlcd_dispwendu(void);//函数声明/******************************************************************************/voidInitTimer0(void)//产生10ms时间间隔{TMOD=(TMOD&0XF0)|0X01;//定时器0工作在模式1,16Bit定时器模式TH0=(65536-8000)/256;TL0=(65536-8000)%256;TR0=1;ET0=1;//开启定时器和中断EA=1;//开始总中断}voidINIT_Clock(void)//初始化万年历{InitLCD();//初始12864ClearScreen(0);//清屏SetStartLine(0);//显示开始行Initial_DS1302();//初始化ds1302Init_DS18B20();//初始化ds18b20InitTimer0();//调转到10ms的定时器中断函数}/*****************************************************************************/voidDelayMM(unsignedinta){//延时函数1MS/次while(a--);}/*****************************************************************************///Displayen(2,0,0*8,t1);//Displayen(1,0,63*8,3);//(1[右半屏],0[第1行],63[第63列]*8[数字],3[第3个数字])//Display(2,1,1*16,1);//(2[左半屏],1[第2行],1[第2列]*16[汉字],1[第1个汉字])/*****************************************************************************//*-----------------------显示时间---------------------------*/voidlcd_disptime(SYSTEMTIME*Time){unsignedchars1,s2,f1,f2,m1,m2;//定义时间映射局部变量(专用寄存器)if(Time-Second!=ss){//判断是否需要更新ss=Time-Second;//更新数据if(flag!=0){DS--;if(DS=0)DSS=2;if(DSS==2){flag--;}}else{flag=0;DS=10;DSS=1;}flag4=flag/600%6;//分位十位的数据flag3=flag/60%10;//分位个位的数据flag2=flag/10%6;//秒位十位的数据flag1=flag%10;//秒位个位的数据lcd_dispwendu();//显示温度s1=Time-Hour/10;s2=Time-Hour%10;f1=Time-Minute/10;f2=Time-Minute%10;m1=Time-Second/10;m2=Time-Second%10;Displayen(2,2,0*8,s1);Displayen(2,2,1*8,s2);Displayen(2,2,2*8,11);//:Displayen(2,2,3*8,f1);Displayen(2,2,4*8,f2);Displayen(2,2,5*8,11);//:Displayen(2,2,6*8,m1);Displayen(2,2,7*8,m2);}}/*-----------------------显示日期---------------------------*/voidlcd_dispdate(SYSTEMTIME*Time){unsignedcharn1,n2,n3,n4,n5,n6,n7,n8,n9;//定义局部变量n1=Time-YearH/10;n2=Time-YearH%10;n3=Time-Year/10;n4=Time-Year%10;n5=Time-Month/10;n6=Time-Month%10;n7=Time-Day/10;n8=Time-Day%10;n9=Time-Week%10;Displayen(2,0,0*8,2);//2Displayen(2,0,1*8,0);//0Displayen(2,0,2*8,n3);Displayen(2,0,3*8,n4);Display(2,0,10*16,8);//年Displayen(2,0,6*8,n5);Displayen(2,0,7*8,n6);Display(1,0,0*16,9);//月Displayen(1,0,2*8,n7);Displayen(1,0,3*8,n8);Display(1,0,2*
本文标题:基于51单片机的万年历设计
链接地址:https://www.777doc.com/doc-4226946 .html