第七组电子语音万年历_第1页
第七组电子语音万年历_第2页
第七组电子语音万年历_第3页
第七组电子语音万年历_第4页
第七组电子语音万年历_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、浙江工业职业技术学院电气工程分院设计报告浙江工业职业技术学院课程设计报告 电子语音万年历组 名 第七组 成 员 张立杭 王晨宇 童伟东 分 院 电气电子工程分院 专 业 电子信息工程技术程技术 班 级 12电子电气工程分院2班 指导教师 金永敏 完成日期 2014年 6月9日 电子语音万年历 摘 要 随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。为了在观测时间的同时,能够了解其它与人类关系相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能与一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,

2、具有广阔的市场前景,该电子万年历主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、DS18B20温度传感芯片提供温度数据、LCD液晶显示屏显示。AT89C51单片机是由Atmel公司推出的,功耗小,电压可选用46V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;DS18B20温度芯片是一种测量精度高的数字温度传感器,具有只需要一个数据电缆传输数据,电路连接简单的特点;数字显示是采用的LCD液晶显示屏来显示,可以

3、同时显示年、月、日、星期、时、分、秒和温度等信息。此外,该电子万年历还具有时间校准等功能。 关键词 时钟芯片DS1302;LCD液晶显示;单片机AT89C51;时钟电路;数字显示;DS18B20温度传感芯片;第一章 绪论 随着电子技术的高速发展,对电子方面人才的要求越来越高,不仅要求其具备相关的专业理论知识,还要求其具有较强的设计、制作等实践动手能力.此次学校举行的电子设计无疑是对从事电子相关专业的人的一次很好的锻炼和考验,是培养信息人才的一次良好的机会,为其提供了一个理论知识与实践相结合的平台。  通过本次课程设计,引导学生结合所学的电路理论和程序设计的知识,思考设计方案

4、,以小组合作方式,分工完成各个部分,从而掌握相关的硬件结合软件显示电路的设计和调试技术,一方面提高了学生的实践动手和协作能力,另一方面培养了学生综合运用所学理论知识进行工程设计的能力本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。 除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LCD液晶屏输出,分别用来显示年、月、日、使、分、秒、星期、温度,其最大特点是:硬件电路简单,方案方便易于实现,软件设

5、计独特,可靠。AT89C51是由ATMEL公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存储器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。 首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优势以及课题的开发意义;接着介绍了AT89C51单片机的硬件结构和本课程设计所要外扩的LCD显示的方法,并在此基础上实现了万年历基本电路的设计;然后使用C语言进行万年历程序的设计,程序采用模块化结构,使得逻辑关系简单明了。一、课程设计目的和任务1.通过本项课

6、程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固高级程序语言编程的过程,掌握软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关,更加了解c语言的好处和其可用性,同时增加了同学之间的团队合作精神,更加也体会到以后在工作中团队合作的重要性和必要性。 2.通过高级语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。3为了使同学们掌握结构化数据流分析技术,用C语言设计一个年历系统,满足以下功能要求 :(1)

7、输入任一年将显示出该年的所有月份日期,对应的星期(2) 注意闰年情况其显示格式要求如下:(1)月份:中文英文都可以,(2)下一行显示星期,从周日到周六,中英文都可以(3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐当输入2004显示如下:Input the year:2004The calendar of the year 2004. Januray 1 February 2 Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 2 3 1 2 3 4 5 6 7 4 5 6 7 8 9 10 8 9 1

8、0 11 12 13 14 11 12 13 14 15 16 17 15 16 17 18 19 20 21 18 19 20 21 22 23 24 22 23 24 25 26 27 28 25 26 27 28 29 30 31 29 = = March 3 April 4 Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 1 2 3 7 8 9 10 11 12 13 4 5 6 7 8 9 10 14 15 16 17 18 19 20 11 12 13 14 15 16 17 21 22 23

9、24 25 26 27 18 19 20 21 22 23 24 28 29 30 31 25 26 27 28 29 30 = =二、分析与设计1.程序的基本功能:    输入一个整数year,显示出该年的所有月份日期,对应的星期。2.系统总框图: 将每月的日期填入日期表车程序开始始 定义函数f(),g(),n(),w()wd判断该月日历有几行显示定义两个字符型数组date1267, day_tbl 12利用for循环输出月份和title定义整型变year, w,leap,i,j,k,wd,dayfor循环输出该月日历输入年份year显示日历 leap=year

10、%4=0&&year%100|year%400=0结束程序 利用for循环将日期表置03.定义的函数及说明:(1) f(int year,int month) 如果月份值小于3,则返回值为year-1;否则返回值为year(2) g(int month)如果月份值小于3,则返回值为month+13;否则返回值为month+1例如:2004年1月1日 经过这两个函数的变形成 2003年14月1日,便于计算(3)n(int year,int month,int day)计算某一个日期的n值,便于计算某一日期是周几(4)w(int year,int month,int day) 以1

11、700年3月2日的n值为模版,计算出要求日期是周几(5)main() 主函数4.算法设计:(1)总体而言,根据要求来做一个万年历的C程序,要求输入想要知道日历的年份,然后可按ENTER键显示日历。(2)判断是不是闰年:(year%4=0&&year%100|year%400=0)满足条件是闰年,把一年中所有月份的天数放入二维数组(31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31)。(3)用 f() g() n() w()四个函数计算周几(4)用for循环将每一个日期置0 ,再将每个月的

12、日期填入日期表(5)按照题目所要求的格式输出三、系统实施1.源程序代码#include <stdio.h> #include <conio.h> long int f(int year,int month) if(month<3) return year-1; else return year; long int g(int month) if(month<3) return month+13; else return month+1; long int n(int year,int month,int day) return 1461L*f(year,mo

13、nth)/4+153L*g(month)/5+day; int w(int year,int month,int day) return(int)(n(year,month,day)%7-621049L%7+7)%7); int date1267; int day_tbl 12=31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31; main() int sw,leap,i,j,k,wd,day; int year;char title="Sun Mon Tue Wed Thu Fri Sat

14、 "const char *month="*","January","February","March","April","May","June","July","August","September","October","November","December"printf("Input the year: &qu

15、ot;);scanf("%d%*c",&year);sw=w(year,1,1); leap=year%4=0&&year%100|year%400=0; for(i=0;i<12;i+) for(j=0;j<6;j+) for(k=0;k<7;k+) dateijk=0;for(i=0;i<12;i+)for(wd=0,day=1;day<=day_tblleapi;day+) dateiwdsw=day; sw=+sw%7;if(sw=0) wd+; printf("nThe calendar of the

16、 year %dnn",year);for(i=0;i<12;i+=2)for(wd=0,k=0;k<7;k+)wd+=datei5k+datei+15k;wd=wd?6:5; printf(" %-9s %dttt%-9s %dn",monthi+1,i+1,monthi+2,i+2);printf(" %st%sn",title,title);for(j=0;j<wd;j+)printf(" ");for(k=0;k<7;k+) if(dateijk) printf("%-4d"

17、;,dateijk);else printf("%4s","");printf("%3s","");for(k=0;k<7;k+) if(datei+1jk)printf("%-4d",datei+1jk);else printf("%4s","");printf("%4sn",""); printf("=t=n");puts("n");getch(); 2.程序运行说明

18、(包括结果说明)运行程序:输入 2004 运行结果:运行说明:运行程序后,先出现一黑色背景,上面有一句话:"Input the year:" 输入一个整数值作为要查询的年份值,显示出该年的所有月份日期,对应的星期。结果说明:第一行“The calendar of the year 2004”表明这是2004年的日历。之后的每两个月份并排显示,首行是月份,第二行是星期,日期按其是周几实际情况与上面的星期数垂直对齐。(1) 电路工作原理;本电路包括基本的时钟电路模块、液晶显示模块、语音报时模块、温度传感器模块。各功能模块通过控制芯片连接起来,完成本设计要求。电路实现的基本功能是

19、电子万年历。通过液晶LCD12864,可显示年月日、时分秒、星期等基本信息。增强功能是具备时钟语音报时功能。即每到整点,系统会自动语音报时,报时信息包括日期及时间。同时具备显示环境温度的功能。 具体工作流程如以下程序流程图:主程序: Lcd显示按键扫描每三秒读取温度一次启用ds1302。初始化lcd以及定时器Ds18b20子程序:提取百、十、个、小数点后一位 读到的数转换为整型向ds1820写数据,跳过rom,读数据复位初始化Ds1302子程序:Dnum=?Dnum=?送到12684显示1:小时减一 2:分减一 3:秒减一4:年减一 5:月减一 6:日减一 7:星期减一计算要显示的数据1:小时

20、加一 2:分加一 3:秒加一4:年加一 5:月加一 6:日加一 7:星期加一 Flag=1?初始化设定lcd光标显示、关闭,判断是否忙的函数完成显示12864 LCD子程序:初始化lcd设定,调用来自其他子程序的数值第四行显示状态信息第三行显示温度第二行显示时间及星期第一行显示日期及平闰年定时器定时设定子程序:设定每3s调整一次的时间循环,以共调用设定每0.5s调整一次的时间循环,以共调用设定工作在定时器0工作方式1TMOD = 0x01 ; 开总中断在年份显示中设置了闰年判断语句:/判断闰年,leap=1表示闰年leap=(nian%4=0 && nian%100!=0)|(

21、nian%400=0)?1:0;/整点自动报时if (fen1=0&&fen2=0&&miao1=0&&miao2=0)&&kaiguan=1)(2) 元件清单。序号型号个数序号型号个数OTP语音芯片NY3P035AP81温度传感器Ds18201晶振12Mhz1电阻10k5时钟晶振32.768k1开关5陶瓷电容30pf10422时钟芯片Ds13021排阻10k1液晶显示屏128641电源插座5.4mm1排针若干自锁开关1单片机芯片Stc89c5211) 电路和程序调试过程与结果:本设计完成了设计任务的所有要求。单片机采用STC89

22、C52,编译环境为keil,程序使用C语音进行编写。电路设计使用proteus仿真软件进行仿真调试,在Altium Designer上设计原理图并绘制PCB图。设计硬件制作比较顺利,很快就把PCB板做好。接着,主要是程序的调试。程序调试的难点在于设计的功能模块过多,程序结构比较复杂,使得调试起来比较费时间调试结果:1、完成设计任务的要求1:显示年月日、时分秒、及星期信息。 2、完成设计任务的要求2:具有可调整日期和时间功能。 3、完成设计任务的要求3:闰年计算功能,液晶显示平、闰年。4、完成设计任务的要求4:实现语音报时。5、增加功能:实时显示环境气温。3.存在的问题:  

23、   整个程序的功能还是不完善的,功能比较单一,比如不能显示具体某一个月或某一天的信息,不能多次查询等。结 论 对C语言在编写程序时的用处有了更明确的认识,懂得了编写C程序的一般法方步骤。最大的收获是:编写程序时一定要有信心和勇气,要相信自己一定可以把这个程序编写出来。分析问题做出算法,想好思路,在心里有个大致的框架。然后按部就班的记下自己想到的每一点内容,把写下的东西认真整理,查缺补漏,把一些细节的地方补上,就这样一个貌似很难的程序就写出来了。其实编程并不难,关键是要投入要钻到里面去。下一步就是读程序,读程序时一定要小心仔细,一条语句一条语句的读,看是否能输出自己想要输出

24、的结果。如果发现错误要马上改过来,再接着向下读,直到把程序调试的完美无缺为至。参考文献附录一:源程序名列表。main.c 文件:void delay_ms(t) /* 对于12M时钟,约延时1ms */void Music(z) /语音芯片驱动程序void main() /主函数LCD12864.c 文件 (液晶显示)void delayNOP() /延时4usbit lcd_busy()/检查LCD忙状态void write_cmd(uchar cmd) /写指令数据到LCD void lcd_wdat(uchar dat) /写显示数据到LCDvoid lcd_init() /LCD初始化设定void lcd_pos(uchar X,uchar Y) /设定显示位置 void display() /主显示程序DS18B20.c 文件 (温度检测)void dsreset(void)/DS18B20复位,初始化bit tempreadbit(void) /读一位数据uchar tempread(void) /读一字节(8位)void tempwritebyte(uchar dat)/向DS18B20写一个字节数据void t

温馨提示

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

评论

0/150

提交评论