毕业设计(论文)-基于AT89S51单片机的简易万年历的设计.doc_第1页
毕业设计(论文)-基于AT89S51单片机的简易万年历的设计.doc_第2页
毕业设计(论文)-基于AT89S51单片机的简易万年历的设计.doc_第3页
毕业设计(论文)-基于AT89S51单片机的简易万年历的设计.doc_第4页
毕业设计(论文)-基于AT89S51单片机的简易万年历的设计.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计报告毕业设计报告 设计题目:设计题目: 简易万年历的设计简易万年历的设计 设计作者: 专业班级/学号: 合作者 1: 专业班级/学号: 合作者 2: 专业班级/学号: 指导教师: 设计时间: 2011-5-20 1 摘要摘要 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟 表业界的第三次革命。 电子万年历是单片机系统的简单应用。本设计是采用单片机 at89s51 作为系统的 核心,由主控模块、时控模块、显示模块和键盘接口模块共 4 个模块组成。主控芯片 使用低电压、高性能 cmos 8 位微处理器 at89s51 单片机。采用具有涓细电流充电 功能的低功耗实时时钟芯片 ds1302 和通过 2 个 4 位 8 段数码管显示。 关键词:at89s51、数码管、万年历 2 目录目录 摘要.1 引言.4 第一章 总体要求.5 1.1 设计任务及要求.5 1.1.1 设计任务5 1.1.2 设计要求5 1.2 系统总体设计.5 1.2.1 控制方面的方案选择.5 1.2.2 显示部份的方案选择6 1.2.3 系统结构框图设计及说明6 第二章 系统硬件设计 .6 2.1 晶体振荡器电路.6 2.2 串口通信电路.7 2.3 复位电路7 2.4 时钟电路7 2.5 按键部分8 2.6 at89s51 引脚在本设计中的作用说明.8 第三章 系统软件设计 .9 3.1 公历与星期的换算方法.9 3.2 设计流程图及说明.10 3.3 源程序的编写.11 3 3.3.1 中断程序11 3.3.2 延时程序12 3.3.3 读取部分数据12 3.3.4 数码管显示程序14 3.3.5 按键程序15 第四章安装与调试.17 4.1 硬件的安装调试.17 4.2 软件调试.17 4.3 测试结果分析与结论.18 4.3.1 测试结果分析.18 4.3.2 测试结论.18 总结.18 致谢.19 参考文献.20 附录.21 4 引言引言 电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越 流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式 led 数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出 多种功能。它是生活和工作中最常见的一种电子装置,核心部分是电子钟。除了专用 的时钟、计时显示牌外,许多应用系统常常需要带有实时时钟显示,如各种智能化仪 器仪表、工业过程控制系统以及家用电器等。 本设计主要采用 at89s51 单片机作为主控核心,由 ds1302 时钟芯片提供时钟、 数码管动态扫描显示屏显示。at89s51 单片机是由 atmel 公司推出的,功耗小,电压 可选用 46v 电压供电;ds1302 时钟芯片是美国 dallas 公司推出的具有涓细电流 充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时, 还具有闰年补偿等多种功能,而且 ds1302 的使用寿命长,误差小;数字显示是采用的 8 位数码管来显示,可以同时显示年、月、日、星期、时、分、秒等信息。 5 第一章第一章 总体要求总体要求 1.1 设计任务及要求设计任务及要求 1.1.1 设计任务设计任务 (1) 设计一以单片机为核心控制的万年历,具有多项显示和控制功能; (2)了解单片机版工作原理及整个万年历的程序编写。 1.1.2 设计要求设计要求 (1)能用八段数码管实时显示当前年、月、日、星期、时、分、秒; (2)断电有实时时钟; (3)可以对界面进行切换,对时间进行加的操作; 1.2 系统总体设计系统总体设计 1.2.1 控制方面的方案控制方面的方案选择选择 方案一:可采用 altera 公司的 flex10k 系列 pld 器件。设计起来结构清晰, 各个模块,从硬件上设计起来相对简单,控制与显示的模块间的连接也会比较方便。 但是考虑到本设计的特点,eda 在功能扩展上比较受局限,而且 eda 占用的资源也 相对多一些。从成本上来讲,用可编程逻辑器件来设计也没有什么优势。 方案二: 16 位单片机有丰富的中断源和时基。它的准确度相当高,并且 c 语言 和汇编兼容的编程环境也很方便来实现一些递归调用。i/o 口功能也比较强大,方便使 用。用 16 位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制 播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。但 是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性 不是很高,而且就需要完成万年历这个不太复杂的设计可以不必用 16 位单片机来完成, 采用 51 单片机既能够实现既定功能,成本也不高。综合考虑最后选择用 51 单片机来 作为中心控制器件。 硬件控制电路主要用了 at89s51 芯片处理器、四位八段数码管显示等。根据各自 芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子 万年历的时间控制程序、时间显示及星期显示程序等组成。主控程序中对整个程序进 行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时 间控制程序是电子万年历中比较重要的部分。时间控制程序体现了年、月、日、时、 分、秒及星期的计算方法。时间控制程序主要是定时器 0 计时中断程序每隔 10ms 中断 6 一次当作一个计数,每中断一次则计数加 1,当计数 100 次时,则表示 1 秒到了,秒变 量加 1,同理再判断是否 1 分钟到了,再判断是否 1 小时到了,再判断是否 1 天到了, 再判断是否 1 月到了,再判断是否 1 年到了,若计数到了则相关变量清除 0。先给出一 般年份的每月天数。如果是闰年,第二个月天数不为 28 天,而是 29 天。再用公式 sv1 +(y1/4(y1/100+(y1/400+ d 计算当前显示日期是星期几, 当调节日期时,星期自动的调整过来。闰年的判断规则为,如果该年份是 4 或 100 的 整数倍或者是 400 的整数倍,则为闰年;否则为非闰年。在我们的这个设计中由于只 涉及 100 年范围内,所以判断是否闰年就只需要用该年份除 4 来判断就行了。 1.2.2 显示部份的方案选择显示部份的方案选择 方案一:液晶显示方式;液晶显示效果出众,但是在显示时,屏幕会有明显的闪 烁。而且存储空间有限,大大影响了电子万年历的性能。 方案二:相比液晶显示,采用八段数码管既经济实惠,在效果上也显示的比较稳 定,操作比较液晶显示来说虽然略显繁琐,但总体也可以做到比较人性化。 所以,两者比较下,最后选择 led 数码管做显示部分。 1.2.3 系统结构框图设计及说明系统结构框图设计及说明 图 1-2-3 为电子万年历的系统方框图,本系统由主控制器 at89s51、时钟电路、 键扫描电路、显示电路等组成的。 图 1-2-3 电子万年历电路系统构成框图 第二章第二章 系统硬件设计系统硬件设计 2.1 晶体振荡器电路晶体振荡器电路 晶体振荡器电路给数字钟提供一个频率稳定准确的 32768hz 的方波信号,可保证 数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶 体荡器电路。 时钟控制 主控模块 at89s51 芯片 键盘接口模块 显示模块 7 2.2 串口通信电路串口通信电路 max232 芯片是美信公司专门为电脑的 rs-232 标准串口设计的单电源电平转换芯 片,使用+5v 单电源供电。本设计中采用 max232cpe 来做串口通信,连接电脑将程 序从电脑上烧写进系统版。 2.3 复位电路复位电路 设计中复位电路当系统与电脑连接时将程序指针指向 0000h,就是将程序从头开 始运行,这个电路是防止程序乱码时进行按键复位,恢复系统正常运作。电阻给电容 充电,电容的电压缓慢上升直到 vcc,没到 vcc 时芯片复位脚近似低电平,于是芯 片复位,接近 vcc 时芯片复位脚接近高电平,于是芯片停止复位,复位完成。 2.4 时钟电路时钟电路 内部时钟电路是指在 xtal1 和 xtal2 引脚上外接定时元件,内部振荡电路就产 生自激振荡。定时元件通常石英晶体和电容组成的并联谐振回路,晶体振荡器选择 32768khz,电容采用 30pf。如图 2-4; 图 2-4 ds1302 的时钟电路 ds1302 是美国 dallas 公司推出的一种高性能、低功耗的实时时钟芯片,附加 31 字节静态 ram,采用 spi 三线接口与 cpu 进行同步通信,并可采用突发方式一次 传送多个字节的时钟信号和 ram 数据。实时时钟可提供秒、分、时、日、星期、月和 年,一个月小与 31 天时可以自动调整,且具有闰年补偿功能。工作电压宽达 2.55.5v。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供 了对后背电源进行涓细电流充电的能力。ds1302 用于数据记录,特别是对某些具有特 殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用 8 于测量系统中。vcc1:主电源;vcc2:备份电源。当 vcc2vcc1+0.2v 时,由 vcc2 向 ds1302 供电,当 vcc21; /数据右移 sclk=0; _nop_(); /延时等待 sclk=1; sclk=0; uchar readds_byte() uchar i,k; k=0; for(i=0;i1; /将各位数据右移一位,因为先读出的是字节的最低位 if(io) /如果读出的数据是 1 k=k|0x80; /将一取出,写在 dat 的最高位 sclk=1; /将 sclk 置于高电平,为下降沿读出 _nop_(); /稍微等待 sclk=0; /拉低 sclk,形成脉冲下降沿 sclk=0; return (k);) /将读出的数据返回 void writeds_add(uchar add,uchar dat) /将指令或数据写入对应寄存器 rst=0; / 14 sclk=0; rst=1; writeds_byte(add); writeds_byte(dat/10 #include #define uchar unsigned char #define uint unsigned char sbit p2_0 = p20; sbit p2_1 = p21; sbit p2_2 = p22; sbit p2_3 = p23; sbit p2_4 = p24; sbit p2_5 = p25; sbit p2_6 = p26; sbit p2_7 = p27; sbit p3_7 = p37; sbit p0_7 = p07; sbit p1_0 = p10; sbit p1_1 = p11; sbit p1_2 = p12; sbit p1_3 = p13; 22 sbit p3_0 = p17; sbit key1 = p32; sbit key2 = p33; sbit key3 = p34; sbit key4 = p35; sbit rst=p13; sbit io=p12; sbit sclk=p11; unsigned char gy=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; unsignedchar sec=0,jishu=0,j=0,x=0,min=19,hour=23,number=0,d_hour=20,d_min=20,number1=0,number 2=0; uchar tab_13027=0,42,15,29,7,2,11; void ds1302(); void writeds_byte(uchar); uchar readds_byte(); void ds1302_init(); void writeds_add(uchar,uchar); uchar readds_add(uchar); void js_cs(void) tmod=0x11; th0=0x3c; tl0=0xaf; ea=1; et0=1; tr0=1; void time0(void) interrupt 1 ;定时中断 23 th0=0x3c; tl0=0xaf; jishu+; if(jishu=10) sec+; j=j; jishu=0; voiddelay_1ms(void) ;延时 1ms unsigned i; for(i=0;i1; sclk=0; _nop_(); sclk=1; sclk=0; uchar readds_byte() ;读字节 uchar i,k; k=0; for(i=0;i1; if(io) k=k|0x80; sclk=1; _nop_(); sclk=0; 25 sclk=0; return (k); void writeds_add(uchar add,uchar dat) ;写地址 rst=0; sclk=0; rst=1; writeds_byte(add); writeds_byte(dat/104)|(dat%10); sclk=0; rst=0; uchar readds_add(uchar add) ;读地址 uchar temp,dat1,dat2; rst=0; sclk=0; rst=1; writeds_byte(add); temp=readds_byte(); sclk=0; rst=0; dat1=temp/16; dat2=temp%16; temp=dat1*10+dat2; return (temp); void ds1302_init() ;初始化 1302 26 uchar i,add; add=0x80; writeds_add(0x8e,0x00); for(i=0;i7;i+) writeds_add(add,tab_1302i); add+=2; writeds_add(0x90,0xa6); writeds_add(0x8e,0x80); void ds1302() uchar i,add=0x81; writeds_add(0x8e,0x00); for(i=0;i7;i+) tab_1302i=readds_add(add); add+=2; writeds_add(0x8e,0x80); void xianshi_67(unsigned char y) unsigned char d,c; d=y/10; c=y%10; p0=gyc; p0_7=j; p2_0=0; 27 delay(100); p2_0=1; p0=gyd; p0_7=j; p2_1=0; delay(100); p2_1=1; void xianshi_45(unsigned char y) unsigned char d,c; d=y/10; c=y%10; p0=gyc; p0_7=j; p2_3=0; delay(100); p2_3=1; p0=gyd; p0_7=j; p2_4=0; delay(100); p2_4=1; xianshi_d() p0=0xff; p0_7=j; p2_2=0; delay(100); 28 p2_2=1; void xianshi_12(unsigned char y) unsigned char d,c; d=y/10; c=y%10; p0=gyc; p2_6=0; delay(100); p2_6=1; p0=gyd; p2_7=0; delay(100); p2_7=1; main() ;主程序 wb_cs(); js_cs(); ds1302_init(); p3_0 = 1; while(1) if(key1=0) delay_nms(5); if(key1=0) number+; 29 if(number=2) number=0; while(key1=0) xianshi_67(tab_13020) ; xianshi_45(tab_13021) ; xianshi_12(tab_13022) ; if(key2=0) delay_nms(5); if(key2=0) number1+; if(number1=6) number1=0; while(key2=0) if(key4=0) delay_nms(5); 30 if(key4=0) number2+; if(number2=3) number2=0; while(key4=0) if(number1=1 if(key3=0) delay_nms(5); if(key3=0) tab_13021+; if(tab_13021=60) tab_13021=0; ds1302_init(); while(key3=0) xianshi_67(tab_13021) ; 31 if(number1=2 if(key3=0) delay_nms(5); if(key3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论