多功能电子万年历设计论文解读.docx
- 文档编号:16402918
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:73
- 大小:961.52KB
多功能电子万年历设计论文解读.docx
《多功能电子万年历设计论文解读.docx》由会员分享,可在线阅读,更多相关《多功能电子万年历设计论文解读.docx(73页珍藏版)》请在冰点文库上搜索。
多功能电子万年历设计论文解读
江苏大学第六届电子设计竞赛
多功能电子万年历作品论文
参赛队员:
胡建冬(电信科技1302)
二零一四年四月
【摘要】该电子万年历实现了阳历年、月、日、星期、时、分、秒、闰平年的显示,以及对应阴历的日期和闰平年的显示,同时实现了定时报警、日程提醒和语音报时功能,并可用按键选择菜单以实现对时间和语音报时模式进行调整。
电子万年历的硬件部分采用STC89C52RC为主控芯片,时钟芯片DS1302、液晶LCD1602、语音芯片NY3P065A、5个轻触开关等组成外围电路。
软件部分是基于51单片机的C语言程序,编译环境是Keil。
【关键词】多功能电子万年历单片机时钟芯片液晶语音芯片
目录
1、设计任务与要求4
1.1设计任务4
1.2要求4
(1)基本要求4
(2)选做部分4
1.3完成功能4
(1)基本要求4
(2)选做部分4
1.4未完成功能4
2、方案比较与选择4
2.1主控模块4
2.2时钟模块5
2.3显示模块5
2.4语音报时模块6
2.5按键模块6
2.6存储模块7
3、硬件电路的设计与仿真7
3.1硬件电路设计7
(1)主控模块7
(2)时钟模块8
(3)显示模块9
(4)语音报时模块9
(5)按键模块10
3.2硬件电路仿真10
4、万年历软件设计11
4.1阳历转阴历程序11
4.2main函数24
4.3时钟模块55
4.4显示模块60
4.5语音报时模块65
4.6存储模块70
4.7液晶显示汉字程序73
4.8延时子函数模块74
作者简介75
1、设计任务与要求
1.1设计任务
用实验室提供的或自主购买的MSP430开发装置,设计一个具有多种功能的电子万年历。
1.2要求
(1)基本要求
a)能显示阳历年、月、日、星期、小时、分、秒
b)显示模块采用LCD液晶显示,要求能用按键调整时间。
c)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。
d)具有定时报警功能,能够进行整点和半点语音报时。
(2)选做部分
a)掉电存储功能,可存储掉电前用户定时设置。
b)具有日程管理,可以设定指定日期的日程,可以设置日程的提醒时间,并可用语音进行提示。
c)可以保存30个日程设定,每个日程的提醒采用音乐提醒,至少有5首歌曲进行选择播放,提示音乐具有重复播放功能。
1.3完成功能
(1)基本要求
a)能显示阳历年、月、日、星期、小时、分、秒
b)显示模块采用LCD液晶显示,能用按键调整时间。
c)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。
d)具有定时报警功能,能够进行整点和半点语音报时。
(2)选做部分
a)掉电存储功能,可存储掉电前用户定时设置。
b)具有日程管理,可以设定指定日期的日程,可以设置日程的提醒时间,并用语音进行提示。
1.4未完成功能
可以保存30个日程设定,每个日程的提醒采用音乐提醒,至少有5首歌曲进行选择播放,提示音乐具有重复播放功能。
2、方案比较与选择
2.1主控模块
方案一:
采用MSP430为主控芯片。
MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器。
MSP430处理能力强、运算速度快、片内资源丰富,它们分别是看门狗(WTD)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-ΔADC、DMA、I/O端口、基本定时器(BasicTimer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。
方案二:
采用STC89C52RC为主控芯片。
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构)。
相比较而言,MSP430虽然片内资源丰富,但价格较高,且电子万年历只需单片机的少部分资源,如果选用MSP430会造成资源浪费;而STC89C52RC价格相对较低,且内部资源已能满足电子万年历的需要,所以选择方案二。
2.2时钟模块
方案一:
采用DS12C887为时钟芯片。
DS12C887可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿;自带晶体振荡器和锂电池,在没有外部电源的情况下可工作10年,对于一天内的时间记录,有12小时制和24小时制两种模式;在12小时制模式中,用AM和PM区分上午和下午,可选用夏令时模式,时间表示方法有两种:
一种用二进制数表示,一种用BCD码表示。
方案二:
采用DS1302为时钟芯片。
DS1302可提供年、月、日、星期、时、分、秒,一个月小与31天时可以自动调整,且具有闰年补偿功能,即每月的天数和闰年的天数可自动调整;时钟操作可通过AM/PM指示决定采用24或12小时格式。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
相比较而言,DS12C887虽然功能齐全,但价格较高,约是DS1302的20倍;而如果给DS1302配上晶振与备用电源也能达到与DS12C887相同的效果,且DS1302的价格较低。
所以选择方案二。
2.3显示模块
方案一:
选用LCD12864作为显示模块。
LCD12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。
利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字。
也可完成图形显示.低电压低功耗是其又一显著特点。
方案二:
选用LCD1602作为显示模块。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔。
用户可以自定义CGRAM,显示8个自定义字符。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
相比较而言,LCD12864的显示功能强大,可以显示汉字,做出良好的人机界面,缺点是价格较高;LCD1602虽不能显示汉字,但用来显示万年历已够用,并且价格只有LCD12864的1/3左右。
所以选择方案二。
2.4语音报时模块
语音报时模块选用NY3P065A芯片。
NY3P065A是一次性烧录的语音OTP芯片,具有体积小巧、质量稳定、价格低廉等优点。
可以串行控制、并行控制、按键控制等。
是一种理想的语音OTP。
NY3P065A还可以直接驱动喇叭(PWM)。
该电子万年历采用的就是直接驱动喇叭(8欧姆,0.25瓦)。
下图就是该语音芯片所能报的内容:
图1语音芯片内容
2.5按键模块
按键模块采用5个轻触开关。
其中4个分别为K1、K2、K3、K4用作万年历的调整。
K1用来在时间显示与菜单选择之间进行切换:
K2是选择/确定键;K3与K4分别用作所调整的地方减1、加1。
剩余的1个作为万年历的复位开关,用来处理系统故障。
选择轻触开关作为按键模块,既能实现所需功能,又可以节省成本。
2.6存储模块
存储部分用的是STC89C52RC内部的EEPROM。
STC89C52RC内带2K字节EEPROM存储空间,(其实是采用ISP/IAP技术读写内部FLASH来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
3、硬件电路的设计与仿真
该电子万年历采用单片机STC89C52RC作为主控模块,由时钟芯片DS1302、液晶LCD1602、语音芯片NY3P065A,5个轻触开关等组成外围电路。
3.1硬件电路设计
原理图如下:
(1)主控模块
单片机最小系统电路图如下:
图2单片机最小系统
该电路时单片机最小系统。
其中电容C1、C2、晶振Y1构成振荡电路为单片机时钟信号,电容C8与电阻R3构成上电复位电路;按键K0与VCC相连构成手动复位电路。
复位后单片机各部件恢复为初始状态。
STC8952RC的I/O口分配如下:
3个I/O口用于控制时钟芯片,16个I/O口用于液晶显示,3个I/O口用于语音芯片,5个I/O口用于按键模块。
电源部分采用3节1.5V干电池串联的方式,形成4.5V的电压给万年历各个部件供电。
(2)时钟模块
图3时钟电路
上图是时钟模块的电路图。
X1、X2脚外接32768Hz的晶振Y2,为芯片提供计时脉冲。
BATTERY为后备电池,VCC2为主电源;VCC1为备份电源。
当VCC1>VCC2+0.2V时,由VCC1向DS1302供电,当VCC1 DS1302的SCLK、I/O、RST三个管脚分别连接单片机的3个I/O口,单片机通过控制这3I/O口来读取DS1302里的时间,然后通过LCD1602来显示时间。 (3)显示模块 图4液晶电路 上图是显示模块的LCD1602的连接电路。 P0~P7为数据口,连接到单片机的P0口;电容C7用来滤波(接其它电源);VO连接电位器,用来调节液晶的对比度;RS、RW、E分别连接到单片机的3个I/O口,控制液晶的显示;15、16脚是液晶的背光电源端与接地端。 (4)语音报时模块 图5语音芯片电路 上图是语音报时模块的电路图。 与VL连接的电路作用是去耦;电容C5的作用是滤波;PWM-1、PWM-2直接驱动喇叭(8欧姆,0.25瓦);IO2、OKY1、IO1接到单片机的3个I/O口,用来控制语音芯片。 (5)按键模块 图6按键模块电路 该电路是万年历的按键模块。 K1~K4连接单片机的4个I/O口用来调整万年历,复位电路见主控模块。 3.2硬件电路仿真 图7Proteus仿真图 注: 由于Proteus提供的液晶中的点阵是5*7,而LCD1602中的点阵是5*8,所以仿真图中的汉字少了最下面一行。 下图是实际的显示: 图8实际显示图 第一行: 左半部分是阳历日期的显示;右边的英文字母是星期的缩写;最右边的汉字表示2014年是阳历闰年。 第二行: 左半部分是时间的显示: 右边的“03-08”表示阴历三月初八;最右边的汉字表示2014年是阴历闰年。 4、万年历软件设计 源程序: #include #include"lcd1602.h" #include"delay.h" #include"ds1302.h" #include"character.h" #include"eeprom.h" #include"NY3P065A.h" 4.1阳历转阴历程序 #defineucharunsignedchar #defineuintunsignedint #include /* 公历年对应的农历数据,每年三字节, 格式第一字节BIT7-4位表示闰月月份,值为0为无闰月,BIT3-0对应农历第1-4月的大小 第二字节BIT7-0对应农历第5-12月大小,第三字节BIT7表示农历第13个月大小 月份对应的位为1表示本农历月大(30天),为0表示小(29天) 第三字节BIT6-5表示春节的公历月份,BIT4-0表示春节的公历日期 */ codeucharyear_code[597]={ 0x04,0xAe,0x53,0x0A,0x57,0x48,0x55,0x26,0xBd,0x0d,0x26,0x50,0x0d,0x95,0x44,0x46,0xAA,0xB9,0x05,0x6A,0x4d,0x09,0xAd,0x42,0x24,0xAe,0xB6,0x04,0xAe,0x4A,0x6A,0x4d,0xBe,0x0A,0x4d,0x52,0x0d,0x25,0x46,0x5d,0x52,0xBA,0x0B,0x54,0x4e,0x0d,0x6A,0x43,0x29,0x6d,0x37,0x09,0x5B,0x4B,0x74,0x9B,0xC1,0x04,0x97,0x54,0x0A,0x4B,0x48,0x5B,0x25,0xBC,0x06,0xA5,0x50,0x06,0xd4,0x45,0x4A,0xdA,0xB8,0x02,0xB6,0x4d,0x09,0x57,0x42,0x24,0x97,0xB7,0x04,0x97,0x4A,0x66,0x4B,0x3e,0x0d,0x4A,0x51,0x0e,0xA5,0x46,0x56,0xd4,0xBA,0x05,0xAd,0x4e,0x02,0xB6,0x44,0x39,0x37,0x38,0x09,0x2e,0x4B,0x7C,0x96,0xBf,0x0C,0x95,0x53,0x0d,0x4A,0x48,0x6d,0xA5,0x3B,0x0B,0x55,0x4f,0x05,0x6A,0x45,0x4A,0xAd,0xB9,0x02,0x5d,0x4d,0x09,0x2d,0x42,0x2C,0x95,0xB6,0x0A,0x95,0x4A,0x7B,0x4A,0xBd,0x06,0xCA,0x51,0x0B,0x55,0x46,0x55,0x5A,0xBB,0x04,0xdA,0x4e,0x0A,0x5B,0x43,0x35,0x2B,0xB8,0x05,0x2B,0x4C,0x8A,0x95,0x3f,0x0e,0x95,0x52,0x06,0xAA,0x48,0x7A,0xd5,0x3C,0x0A,0xB5,0x4f,0x04,0xB6,0x45,0x4A,0x57,0x39, 0x0A,0x57,0x4d,0x05,0x26,0x42,0x3e,0x93,0x35,0x0d,0x95,0x49,0x75,0xAA,0xBe,0x05,0x6A,0x51,0x09,0x6d,0x46,0x54,0xAe,0xBB,0x04,0xAd,0x4f,0x0A,0x4d,0x43,0x4d,0x26,0xB7,0x0d,0x25,0x4B,0x8d,0x52,0xBf,0x0B,0x54,0x52,0x0B,0x6A,0x47,0x69,0x6d,0x3C,0x09,0x5B,0x50,0x04,0x9B,0x45,0x4A,0x4B,0xB9,0x0A,0x4B,0x4d,0xAB,0x25,0xC2,0x06,0xA5,0x54,0x06,0xd4,0x49,0x6A,0xdA,0x3d,0x0A,0xB6,0x51,0x09,0x37,0x46,0x54,0x97,0xBB,0x04,0x97,0x4f,0x06,0x4B,0x44,0x36,0xA5,0x37,0x0e,0xA5,0x4A,0x86,0xB2,0xBf,0x05,0xAC,0x53,0x0A,0xB6,0x47,0x59,0x36,0xBC,0x09,0x2e,0x50,0x0C,0x96,0x45,0x4d,0x4A,0xB8,0x0d,0x4A,0x4C,0x0d,0xA5,0x41,0x25,0xAA,0xB6,0x05,0x6A,0x49,0x7A,0xAd,0xBd,0x02,0x5d,0x52,0x09,0x2d,0x47,0x5C,0x95,0xBA,0x0A,0x95,0x4e,0x0B,0x4A,0x43,0x4B,0x55,0x37,0x0A,0xd5,0x4A,0x95,0x5A,0xBf,0x04,0xBA,0x53,0x0A,0x5B,0x48,0x65,0x2B,0xBC,0x05,0x2B,0x50,0x0A,0x93,0x45,0x47,0x4A,0xB9,0x06,0xAA,0x4C,0x0A,0xd5,0x41,0x24,0xdA,0xB6,0x04,0xB6,0x4A,0x69,0x57,0x3d,0x0A,0x4e,0x51,0x0d,0x26,0x46,0x5e,0x93,0x3A,0x0d,0x53,0x4d,0x05,0xAA,0x43,0x36,0xB5,0x37,0x09,0x6d,0x4B,0xB4,0xAe,0xBf,0x04,0xAd,0x53,0x0A,0x4d,0x48,0x6d,0x25,0xBC,0x0d,0x25,0x4f,0x0d,0x52,0x44,0x5d,0xAA,0x38,0x0B,0x5A,0x4C,0x05,0x6d,0x41,0x24,0xAd,0xB6,0x04,0x9B,0x4A,0x7A,0x4B,0xBe,0x0A,0x4B,0x51,0x0A,0xA5,0x46,0x5B,0x52,0xBA,0x06,0xd2,0x4e,0x0A,0xdA,0x42,0x35,0x5B,0x37,0x09,0x37,0x4B,0x84,0x97,0xC1,0x04,0x97,0x53,0x06,0x4B,0x48,0x66,0xA5,0x3C,0x0e,0xA5,0x4f,0x06,0xB2,0x44,0x4A,0xB6,0x38,0x0A,0xAe,0x4C,0x09,0x2e,0x42,0x3C,0x97,0x35,0x0C,0x96,0x49,0x7d,0x4A,0xBd,0x0d,0x4A,0x51,0x0d,0xA5,0x45,0x55,0xAA,0xBA,0x05,0x6A,0x4e,0x0A,0x6d,0x43,0x45,0x2e,0xB7,0x05,0x2d,0x4B,0x8A,0x95,0xBf,0x0A,0x95,0x53,0x0B,0x4A,0x47,0x6B,0x55,0x3B,0x0A,0xd5,0x4f,0x05,0x5A,0x45,0x4A,0x5d,0x38,0x0A,0x5B,0x4C,0x05,0x2B,0x42,0x3A,0x93,0xB6,0x06,0x93,0x49,0x77,0x29,0xBd,0x06,0xAA,0x51,0x0A,0xd5,0x46,0x54,0xdA,0xBA,0x04,0xB6,0x4e,0x0A,0x57,0x43,0x45,0x27,0x38,0x0d,0x26,0x4A,0x8e,0x93,0x3e,0x0d,0x52,0x52,0x0d,0xAA,0x47,0x66,0xB5,0x3B,0x05,0x6d,0x4f,0x04,0xAe,0x45,0x4A,0x4e,0xB9,0x0A,0x4d,0x4C,0x0d,0x15,0x41,0x2d,0x92,0xB5, }; ///月份数据表 codeucharday_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; codeuintday_code2[3]={0x111,0x130,0x14e}; /* 函数功能: 输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年) 调用函数示例: Conversion(c_sun,year_sun,month_sun,day_sun) 如: 计算2004年10月16日Conversion(0,0x4,0x10,0x16); c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世 纪,c_sun=1为19世纪 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据 */ bitc_moon; dataucharyear_moon,month_moon,day_moon,week; /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/ bitget_moon_day(ucharmonth_p,uinttable_addr) { uchartemp; switch(month_p) { case1: { temp=year_code[table_addr]&0x08; if(temp==0)return(0);elsereturn (1); } case2: { temp=year_code[table_addr]&0x04; if(temp==0)return(0);elsereturn (1); } case3: { temp=year_code[table_addr]&0x02; if(temp==0)return(0);elsereturn (1); } case4: { temp=year_code[table_addr]&0x01; if(temp==0)return(0);elsereturn (1); } case5: { temp=year_code[table_addr+1]&0x80; if(temp==0)return(0);elsereturn (1); } case6: { temp=year_code[table_addr+1]&0x40; if(temp==0)return(0);elsereturn (1); } case7: { temp=year_code[table_addr+1]&0x20; if(temp==0)return(0);elsereturn (1); } case8: { temp=year_code[table_addr+1]&0x10; if(temp==0)return(0);elsereturn (1); } case9: { temp=year_code[table_addr+1]&0x08; if(temp==0)return(0);elsereturn (1); } case10: { temp=year_code[table_addr+1]&0x04; if(temp==0)return(0);elsereturn (1); } case11: { temp=year_code[table_addr+1]&0x02; i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 电子 万年历 设计 论文 解读