ImageVerifierCode 换一换
格式:DOCX , 页数:50 ,大小:240.60KB ,
资源ID:2056605      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2056605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机的万年历设计说明.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于51单片机的万年历设计说明.docx

1、基于51单片机的万年历设计说明基于51单片机的电子万年历的设计报告第五小组2012.2.221、项目概述 随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。本设计是数据采集及处理,键盘控制,显示系统及报警系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科

2、学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。2、项目要求1 具有年、月、日、星期、时、分、秒等功能;2 具有温度计功能; 3 具备年、月、日、星期、时、分、秒校准功能;3、系统设计1、框图设计2、知识点(1) 时钟芯片DS1302的工作原理: DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字

3、,此控制字的位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的

4、控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出 RAM RD 1 A4 A3 A2 A1 A0 / CK /WR 表-1 DS1302的控制字格式(3) 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出

5、数据时从低位0位到高位7。如下图-4所示 图-4 DS1302读/写时序图(4) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表-2。 表-2 DS1302的日历、时间寄存器 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;

6、另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 4、硬件设计 本电路是由AT89S51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,

7、精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成;1、电路原理图2、元件清单名称型号数量 单片机AT89SC511 液晶显示器JHD12864F1 电阻10k(1/4w)5电阻1k5电阻200欧姆5电阻4.7k5 电阻4.7k5 电位器10k1 电容10u/16V1 电容30p4 三极管90131 轻触按键小(尺寸66mm5.5)4 蜂鸣器5 V1 晶振12M(小体积)1 底座8脚1 底座40脚1 发光二极管 红1 发光二极管绿1 时钟芯片DS13021 纽扣电池及底座3V(大)1 液晶插槽20孔1 单排针3排120 杜邦线及杜邦头1股40 电路板AOA515、软

8、件设计本系统的软件系统主要分为主程序、液晶程序、时钟程序。1.程序流程图 主程序框图 设置流程图2程序清单(1).主程序:#include #include #include ds1302.h#include ds18b20.h#include lcd12864.h /按键定义sbit KEY0 = P23; /设置sbit KEY3 = P24; /退出sbit KEY1 = P25; /减sbit KEY2 = P26; /加sbit LED1=P30;sbit LED2=P31;sbit LED3=P32;unsigned char w = 0; /调时标志位/键盘函数所要用到的变量un

9、signed char key_operate = 0;/设置模式unsigned char timer =0;unsigned char key_flag;unsigned int counter=0;unsigned char Lcd_t = 0; /LCD刷新间隔unsigned char ss; /全局变量unsigned int v,getdata,getdataa;static unsigned char menu = 0; /定义静态小时更新用数据变量static unsigned char keys = 0; /定义静态小时更新用数据变量static unsigned char

10、 timecount = 0; /定义静态软件计数器变量unsigned int flag = 0; /定义并初始化flagunsigned char DS = 10; /定义并初始化DSunsigned char DSS = 1; /定义并初始化DSSunsigned char flag1=0;unsigned char flag2=0;unsigned char flag3=0;unsigned char flag4=0;void lcd_dispwendu(void); /函数声明/*/void InitTimer0(void)/产生10ms时间间隔 TMOD = (TMOD & 0XF

11、0) | 0X01; /定时器0工作在模式1,16Bit定时器模式 TH0 = (65536 - 8000)/256; TL0 = (65536 - 8000)%256; TR0 =1; ET0 =1;/开启定时器和中断 EA = 1;/开始总中断void INIT_Clock(void) /初始化万年历 InitLCD(); /初始12864 ClearScreen(0);/清屏 SetStartLine(0);/显示开始行 Initial_DS1302();/初始化ds1302 Init_DS18B20();/初始化ds18b20 InitTimer0();/调转到10ms的定时器中断函数

12、/*/void DelayMM(unsigned int a) /延时函数 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个汉字)/*/*-显示时间-*/void lcd_disptime(SYSTEMTIME *Time) unsigned char s1,s2,f1,f2,m1,m2; /定义时间映射局部变量(专用寄存器) if(Time

13、-Second != ss) /判断是否需要更新 ss = Time-Second; /更新数据 if(flag!=0)DS-;if(DSHour/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

14、,2,5*8,11); /: Displayen(2,2,6*8,m1); Displayen(2,2,7*8,m2); /*-显示日期-*/void lcd_dispdate(SYSTEMTIME *Time) unsigned char n1,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=Ti

15、me-Week%10; Displayen(2,0,0*8,2); /2 Displayen(2,0,1*8,0); /0 Displayen(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*16,7); /日 Display (1,2,9*16,10 );

16、/星 Display (1,2,10*16,11); /期 Display (1,2,11*16,n9); /日 /*-调整状态显示-*/void tiaozheng() switch (key_operate) case 1: /分钟 Displayen(2,6,2*8,12 ); /- Displayen(2,6,3*8,12 ); /- Display (2,6,0*16,25 ); /- Display (2,6,2*16,18); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16,21); /分 Display (1,6,1*16,22);

17、 /钟 Displayen(1,6,4*8,12 ); /- Displayen(1,6,5*8,12 ); /- Display (1,6,3*16,24); /+ break; case 2: /小时 Display (2,6,0*16,25 ); /- Display (2,6,2*16,18); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16,23); /小 Display (1,6,1*16,33); /时 Display (1,6,3*16,24); /+ break; case 3: /日期 Display (2,6,0*16,25

18、); /- Display (2,6,2*16,18); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16, 7); /日 Display (1,6,1*16,11); /期 Display (1,6,3*16,24); /+ break; case 4: /月份 Display (2,6,0*16,25 ); /- Display (2,6,1*16,32); Display (1,6,7*16,32); Display (2,6,2*16,18); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16, 9

19、); /月 Display (1,6,1*16,20); /份 Display (1,6,3*16,24); /+ break; case 5:; /年份 Display (2,6,0*16,25 ); /- Display (2,6,2*16,18); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16, 8); /年 Display (1,6,1*16,20); /份 Display (1,6,3*16,24); /+ break; case 6: /星期 Display (2,6,0*16,25 ); /- Display (2,6,2*16,1

20、8); /调 Display (2,6,3*16,19); /整 Display (1,6,0*16,10); /星 Display (1,6,1*16,11); /期 Display (1,6,3*16,24); /+ break; default: break; /*-显示温度-*/void lcd_dispwendu() unsigned char i=0; unsigned char a=0,b=0,c=0; /unsigned char td; i=ReadTemperature(); /读温度并送显 / td=1; if(i=0) LED2=0; LED1=LED3=1; if(i

21、=40) LED2=0; LED1=LED3=1; a=i/1000; /千位 b=i/100%10; /百位 c=i/10%10; /十位 if(i 10) /从DS1302中得到时间 if(key_operate = 0) DS1302_GetTime(&CurrentTime); else DS1302_SetTime(&CurrentTime); /写时间 例如:12-12-12 lcd_disptime(&CurrentTime);/显示时间 /写公历日期 例如:09-01-01 lcd_dispdate(&CurrentTime);/显示日期 tiaozheng();/调整状态显示

22、 if(!KEY3) Lcd_t = 0; void Timer_0(void)interrupt 1 EA = 0; TH0 = (65536 - 8000)/256; TL0 = (65536 - 8000)%256; Lcd_t +;/显示定时计数器,当为10时进行显示,时间10ms if(!KEY0)|(!KEY1)|(!KEY2)|(!KEY3)&(key_flag=0) timer=0;/清除不按键计数器 key_flag = 10; /设计 while(-key_flag);/延时去抖动 key_flag = 1; if(!KEY0) /Modle键,进入调时模式 if(key_

23、operate=0) key_flag = 0;/允许按键长按 w =1; /调时标志位,为1时进入调时 if(counter+50) /Modle键要长按1S生效 key_operate+; key_flag = 1;/不允许按键长安 else key_operate+; if(key_operate 6) key_operate = 1; else if(!KEY1 & w = 1)/减1调整 switch (key_operate) case 1:/分钟 if(CurrentTime.Minute- =0) CurrentTime.Minute = 59; break; case 2:/小时 if(CurrentTime.Hour- =0) CurrentTime.Hour = 23; break; case 3: /日 if(CurrentTime.Day- =1) CurrentTime.Day = 31; break; case 4: /月 if(CurrentTime.Month- =1) CurrentTime.Month = 12; break; case 5: /年 if(CurrentTime.Year- =0) CurrentTime.Year = 99; break; case 6: /

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2