《毕业设计(论文)基于单片机的多功能电子万历设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于单片机的多功能电子万历设计.doc(29页珍藏版)》请在三一办公上搜索。
1、多功能电子万年历Multi-Function Electronic Calendar摘要日月如梭,斗转星移!从远古的铜壶滴漏、日咎计时,到16世纪因伽利略等时性定律而诞生的摆钟,到现今100万年才有1秒误差原子钟。科学不断的在进步,技术时刻在更新!多功能电子万年历更是适应现代化个性生活的一个新需求。该系统以STC89C58单片机作为系统控制处理器,采用美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时。同时通过具有录放音质好,时间长的ISD4004语音芯片和集成功率放大器LM386进行语音提示,并采用AT24C04数据存储
2、器实现掉电数据存储功能.系统各个界面通过LCD12864显示,具有闹钟,日程管理的功能。关键词:STC89C58, 12864LCD, ISD4004, AT24C04, DS1302AbstractWith the rapid development of science and technology and the passing by of time, from the view of the sun, the electronic clock pendulum clock to now, human being have been constantly studied, innovat
3、ed and created new records.With a STC89C58 single-chip as the system control processors, the system uses the low-power real-time clock circuit DS1302 of small trickle charge current, which is produced by DALLAS American companie. It can time in year, month, day, weekday, hour, minute and second, als
4、o has multiple functions, such as a leap year compensation, and long life of the DS1302, the error small. At the same time, through the voice chip ISD4004 voice prompts and 12864LCD display and use of data memory to achieve AT24C04-down data storage function, with alarm clock, schedule management fu
5、nction.Key words:STC89C58, 12864LCD, ISD4004, AT24C04, DS1302目录摘要2关键词21 系统方案51.1 比较与选择51.1.1 界面显示和语音提示:51.1.2 时间的实现51.1.3 处理器的选择51.2 方案描述62 理论分析与计算72.1 日程设定与日期计算72.1.1 日程设定72.1.2 日期计算73 电路与程序设计103.1 硬件设计103.1.1 硬件系统分析103.1.2 硬件描述113.2 软件系统设计143.2.1 软件流程图143.2.2 各模块功能主程序154 测试方案与测试结果184.1 各模块调试方案184.
6、1.1STC89C58主芯片调试184.1.2 DS1302 时钟芯片调试194.1.3 ISD4004语音芯片调试214.1.4 AT24C04数据存储器模块224.1.5 12864LCD显示模块24结论25系统功能25操作说明25参赛总结26附录27附录一 系统原理图27附录二 实物图29附录三 原程序代码301 系统方案1.1 比较与选择 1.1.1 界面显示和语音提示:方案一:用LCD1602显示,蜂鸣器定时报警语音提示。用LCD1602显示,黄绿色背光,价格便宜,操作简单,但是无法显示汉字,无法完成题目阴历显示要求。用蜂鸣器实现定时报警语音提示功能,成本较低,且控制容易,但其声音单
7、调,所播放的音乐效果不佳。方案二: 用12864液晶显示,ISD4004语音芯片实现语音提示。12864液晶显示,蓝色背光,显示分辨率为12864,具有灵活的接口方式和简单、方便的操作指令。可以显示4行32个汉字,且具有低电压低功耗的特点。用ISD语音芯片,录音时间长,音质好,保存长久,控制功能灵活等优点。另通过LM386功放和8欧0.5喇叭播放实现语音提示,语音效果良好,且更具人性化 1.1.2 时间的实现 方案一: 用DS12C887实现时钟计数。DS12C887内部带有锂电池和晶振,掉电可自动行走,并带有闹钟功能、内带114字节RAM等功能。但是要控制Intel或Motorola总线时序
8、复杂,并行通信占用I/O口多,而且体积大,管脚多,价格昂贵。方案二:用DS1302实现时钟计数。DS1302是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM。采用SPI方式进行通信仅需用到三个I/O口。DS1302需外加晶振和电池,故其体积小,占用管脚少,功耗低,价格便宜操作简单。 1.1.3 处理器的选择 AT89S58和STC89C58单片机都兼容标准MCS-51指令系统及80C51引脚结构,32K Bytes Flash片内ROM,1284Bytes的片内RAM,32个的I/O口,5个中断优先级2层中断嵌套中断,3个16位可编程定时计数器,2个全双
9、工串行通信口,看门狗电路,片内时钟振荡器等功能。其中AT公司的稳定性好,但价格偏贵,下载复杂,不便于最后调试。而STC芯片价格比较便宜,且下载器制作简单(只需使用MAX232电平转换和连接串行口),体积少,下载方便。1.2 方案描述l 该方案以STC89C58单片机作中央处理器,采用C语言程序作软件设计,控制其I/O口。l 时间获取通过模拟SPI通信方式控制DS1302时钟芯片的时间设定与读取,并通过LCD12864液晶显示,同时可通过控制四个按键来实现对时间、闹钟及日程的设定与修改。日程与闹钟功能是通过不断的读取设定时间与当前时间相比较,一旦符合条件就调用相应的子程序来实现特定的显示或语音提
10、示。l 语音报时和语音日程是MCU根据当前的时间,发送不同的控制指令和地址来实现ISD4004芯片在指点的位置进行录放。l 最后用AT24C04数据存储器,实现掉电后对闹钟时间,日程时间,和相关的变量等数据进行保存。图1.1 方案结构图2 理论分析与计算2.1 日程设定与日期计算 2.1.1 日程设定日程设定功能分别有三种模式,分别为日常模式、输入模式、语音模式。每种模式均可设定时间日期和相应的提醒音乐,每个日程具有掉电保存的功能。 2.2.1.1日常模式 日常模式归为三大类30个日程,其收集了日常生活中经常遇到日程琐事。l 生活:1.生日 2.聚会 3.约会 4.旅游 5.假日 6.逛街 7
11、.缴费 8.购物 9 晨运10.遛狗;l 学习: 1.班会 2.活动 3.讲座 4.运动 5.考试 6.作业 7.论文 8.比赛 9.还书 10.看书;l 工作:1.会议 2.出差 3.见客 4.交易 5.航班 6.上市 7.汇报 8.调查 9出纳 10.策划。(用一个二维数组储存:如运动就是schedule224) 2.1.1.2 输入模式:自主模式是一种可自行输入的日程管理,当进入此菜单就会弹出字符表,可供选择输入16个字母的句子(把该16个字母相应赋给一个数组的元素)并保存。当我们选择了一项日程或输入完一个日程后,就可以设定提醒的日期与时间和日程存放的地址和选择的提醒音乐,按确认健存储刚
12、才设定日程序号,提醒日期,或字符数组,音乐序号等对应的变量到IICAT24C04。 2.1.1.3语音模式: 语音模式是一种可录音一分钟的日程管理。用户设定相应的提醒时间后,按下录音键开始录音,(此时MCU向ISD4004发送开始录音指令和录音地址),界面实时显示该录音日程剩下的长度(用MCU定时器1进行准确的倒计时),60秒到或者用户按下确认健停止录音(MCU发送停止指令),用户可试听或重录刚才的录音(MCU向ISD4004发送开始播放指令和刚才录音的首地址),按确认健保存刚才设定日程序号,提醒日期,录音秒数到IIC。 2.1.2 日期计算 2.1.2.1 阳历计算阳历通过DS1302时钟芯
13、片读取。首先用MCU驱动时钟芯片,设置其片内时间,然后再分别读取年、月、日、时、分、秒读出来的年月日都是BCD码,则应在将它们送到LCD显示之前得先把他们转换为十进制形式。l 先读秒寄存器的数据,然后将其赋给变量time,因为秒的数据寄存器有一个字节的大小,即8位,其中低四位是用来存放秒的个位的,5、6、7位是用来存放秒的十位的,最高位CH是控制时钟的启动的当CH=1时,时钟振荡停止,CH=0时,时钟启动。转换为十进制则秒的十位为(time&0x70)4,个位为(time&0x0f),十位跟个位组合起来后赋给变量miao=(time&0x70)4)*10+(time&0x0f);l 同理根据分
14、、小时,星期、日期、月份、年份分别根据相应的数据寄存器读出来分别赋给一个变量,再送到LCD显示出来fen=(time&0x70)4)*10+(time&0x0f); /分的十进制形式shi=(time&0x70)4)*10+(time&0x0f); /小时的十进制形式day=(time&0x07); /星期的十进制形式ri=(time&0x30)4)*10+(time&0x0f); /日期的十进制形式yue=(time&0x10)4)*10+(time&0x0f); /月份的十进制形式nsg=(time&0xf0)4)*10+(time&0x0f) /年份的十进制形式l DS1302保存的年份
15、数据寄存器的数据范围为099,因此读出来之后不能直接放到LCD显示,得加上年份的千百位,比如要显示2009,得先往年份寄存器写入9,再读出来,加上2000,再放到LCD显示。所以要真正的做到时钟显示年份正确还得设置年的千百位变量(unsigned char)nqb,将其乘上100即nqb*100,再加上从ds1302读出来的年份的十个位nsg,才是完整的年份的时间。要达到保存的效果,在断电之前还得将年份的千百位保存到AT24C04,在恢复电源时将其读回来,加上从ds1302读回来的年份的十个位在赋给(unsigned int)nian=nqb*100+nsg.再将其送到LCD显示。 2.1.2
16、.2 阴历计算通过查找资料,找到阴阳历转化方法,经过整理修改,最终合成我们需要的函数。l 阳历年对应的阴历数据,每年三字节, 例如:0x0C,0x96,0x45, /2000年0x5C,0x95,0xBA, /2009年l 第一字节BIT 7-4位表示闰月月份,值为0为无闰月,BIT 3-0对应阴历第1-4月的大小 第二字节BIT 7-0对应阴历第5-12月大小,第三字节BIT 7表示阴历第13个月大小,月份对应的位为1 表示本阴历月大(30天),为0表示小(29天) 第三字节BIT 6-5 表示春节的阳历月份,BIT 4-0表示春节的阳历日期 l 首先,先读取我们当前阳历时间:2009-5-
17、20;然后代入以下函数转换(具体函数见附录程序1)l 阴历年份的确定 1864年1月0日是农历癸亥年,所以用当年减去1864,用12除得的余数作为年份天干的,用12除得的余数作为年份的地支,数字对应的天干和地支如下。 天干 甲 乙 丙 丁 戊 己 庚 辛 壬 癸地支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥3 电路与程序设计3.1 硬件设计 3.1.1 硬件系统分析 3.1.1.1 硬件选择 51单片机STC89C58,实时时钟DS1302,IIC芯片AT24C04,语音芯片ISD4004,功率放大器LM386,3.3V稳压管LM1117,液晶12864,温度传感器18B20。 3.1.
18、1.2 硬件框图图3.1 硬件框图 3.1.2 硬件描述3.1.2.1 DS1302时钟芯片DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。它有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚图3.3 DS1302引脚
19、图图3.4 DS1302单字节读时序图3.5 DS1302读写时序图3.1.2.3 ISD4004语音芯片ISD4004是美国ISD公司继ISD33000系列之后最新推出的时限为8分钟的长时语音录放电路。这种录放电路采用了多电平直接模拟量存储技术,将每个采样值直接存储在片内的快闪存储器中,因此能够非常真实、自然地再现语音、音乐,音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和金属声。采样频率越低,录放时间越长,但通频带和音质有所降低。片内信息存于快闪存储器中,可在断电情况下百年不丢失,反复录音超过十万次。l (SS)片选。低电平选中ISD4004 l (MOSI)ISD输入。M
20、CU上升沿之前半个周期将数据放到本端l (MISO) ISD 的串行输出端。ISD 未选中时,本端呈高阻态。l (SCLK) ISD 的时钟输入端,由主控制器产生,用于同步MOSI 和MISO 的数据传输。数据在SCLK 上升沿锁存到ISD,在下降沿移出ISD。l (INT)ISD 在任何操作中检测到EOM 或OVF 时,本端变低 并保持中断状态在下一个SPI 周期开始时清除。l OVF 标志-指示ISD 的录、放操作已到达存储器的未尾。图3.4 ISD4004引脚图 EOM 标志-只在放音中检测到内部的EOM 标志时,为1 图3.7 ISD4004读写时序3.1.2.4 数据存储器串行E2P
21、ROM是基于I2C-BUS的存储器件,遵循二线制协议,其具有接口方便,保存时间长,体积小,数据掉电不挥发等特点,l A0 A1 A2 器件地址选择l SDA 串行数据/地址l SCL 串行时钟l WP 写保护l Vcc +1.8V 6.0V 工作电压l Vss 地图3.8 AT24C04数据存储器图3.9 任一地址写入数据格式图3.10 任一地址读取数据格式3.1.2.5 LCD显示该模块采用带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示器,其显示分辨率为12864, 内置8192个16*16点汉字,和128个
22、16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字,也可完成图形显示,且具有低电压低功耗的特点。3.2 软件系统设计3.2.1 软件流程图图3.11 程序流程图3.2.2 各模块功能主程序3.2.2.1 DS1302时钟芯片的读写/写入一个字节void writeds(uchar date)uchar i=0;ACC=date;for(i=8;i0;i-)IO=ACC0;dscl=1;dscl=0;ACC=ACC1;/读取一个字节uchar readds()uchar i=0;for(i=8;i0;i-)A
23、CC=ACC1;ACC7=IO;dscl=1;dscl=0;return(ACC);/写入ds1302某地址数据Void write1302(uchar add,uchar date)dsrs=0;dscl=0;dsrs=1; /写入写寄存器地址writeds(add); /写入一个字节的数据writeds(date);dscl=1;dsrs=0;/读取ds1302某地址的数据uchar read1302(uchar add)uchar date;dsrs=0;dscl=0;dsrs=1;add+;/读寄存器地址需要在写寄存器地址加一/写入读寄存器地址writeds(add); /读取一个字节
24、数据date=readds();dscl=1;dsrs=0;return (date);/设置时间函数void settime(uchar add,uchar date)/关闭写保护,可以写入数据write1302(0x8e,0x00);/将要写入ds1302的数据转换为BCD码的形式存放write1302(add,(date/10)8;/取出地址的高八位p=p8;/取出地址的高八位p=p4)获得,秒的个位通过取出秒的低四位,即(time&0x0f)获得,最后秒的十进制形式为(time&0x70)4)*10+(time&0x0f)。l 通过查数据手册可知秒的最高位CH是暂停位,当CH=1时,时
25、钟振荡停止,器件被置入低功率备份方式,其电源电流小于100NA,当CH=0时,时钟启动。分寄存器地址 分的数据寄存器同理读出来的分钟的BCD码转换为十进制为(time&0x70)4)*10+(time&0x0f)。小时寄存器地址小时数据寄存器读出来的小时的BCD码转换为十进制为(time&0x70)4)*10+(time&0x0f)。日期寄存器地址 日期数据寄存器读出来的日期的BCD码转换为十进制为(time&0x30)4)*10+(time&0x0f)。星期寄存器地址 星期数据寄存器读出来的星期的BCD码转换为十进制为(time&0x07).。月份寄存器地址 月份数据寄存器读出来的月份的BC
26、D码转换为十进制为(time&0x10)4)*10+(time&0x0f)。年份寄存器地址 年份数据寄存器读出来的年份的BCD码转换为十进制为(time&0xf0)4)*10+(time&0x0f)。 写保护寄存器l 写保护寄存器中的最高位WP是写保护位。在对时钟进行写操作前WP必须为0,否则不可写入,在读操作时总是读0。当WP=1时,可防止如何寄存器进行写操作。4.1.3 ISD4004语音芯片调试图4.3 语音芯片模块出现问题:每播放完一段录音后不会停止,而是继续往下播问题解决:l 开始时是运用ISD400304M芯片调试,该芯片具有4分钟的录音时间,共有1200行储存地址,它是通过SPI
27、与单片机进行同步串行数据传输,对ISD4003 而言,在时钟上升沿锁存MOSI 引脚的数据,其操作码为16位,其中11位为地址码,5位指令码,(包括REC,PLAY,SETREC,SETPLAY,POWERDOWN,POWERUP,STOP等)。l 调试时能够录音(每录完一段发送一个STOP指令让其末尾产生EOM标志),也能放音,但录好的报时语音,不是报完一段就停止(因为理论上播放过程遇到EOM标志就会停止),而是继续往下报第二段。后经查资料可知,4003有1200行地址,录音长度为4分钟,那么一行长度就为240/1200=0.2秒/行。一段报时录音为3秒,理论上需要15行,故编了一个步长为2
28、0的地址数(0x0000,0x00014,0x0028,0x003C),但结果播放出来还是一样。l 一开始猜测EOM标志位被下一段录音给覆盖了,于是把步长增加到30行(6秒),此时发现播放一段完毕后就停止播放了,但这又与理论矛盾,经过查找资料并无数次调试后,发现问题原因,l 因为测试是用MCU判断按键的按下,来向ISD4003发送STOP指令的,但按键是存在抖动的,而测试不是用硬件JK触发器来去抖,而是用软件延时20MS来去抖,加上人的反应时间在开始和结束都占用大概1秒时间(因为从电脑的音频线引出电流,经过8050放大后,直接接到ISD的ANA 音频输入端以避免外界环境的噪音)。最后经过多番的
29、调试后,选择了25行(5秒)的步长作为每段报时语音的存放。l 由于5首40秒的音乐已经占了200秒,加上24段5秒的报时语音已占了120秒。超过4003总长度240秒,故最后改用ISD4004,8分钟芯片。l 4004跟4003操作不一样,它是8位指令码,16位地址码,2400行,480/2400=0.2秒/行,其他性质与功能一样。4.1.4 AT24C04数据存储器模块图4.4 数据存储器模块出现问题:AT24C04内存大小为512字节(5128位)。但是当往AT24C04保存数据的地址超过255(例如地址256、257)的时候,发现把保存在AT24C04的低地址(例如地址1、2)的数据给覆
30、盖了,即地址超过255后又默认从地址1开始保存。问题解决:l 经过分析思考,可能是把AT24C02(256个字节)的操作用在AT24C04的操作上了,即两者的操作有所不同。经过查看AT24C04数据手册后,发现到数据手册里面的一段文字:AT24C02, 2K SERIAL EEPROM: Internally organized with 32 pages of 8 bytes each, the 2K requires an 8-bit data word address for random word addressing.AT24C04, 4K SERIAL EEPROM: Intern
31、ally organized with 32 pages of 16 bytes each, the 4K requires a 9-bit data word address for random word addressing.l 从内容可知AT24C02是传送8位的内部器件地址进行寻址,而AT24C04的是传送9位的内部器件地址进行寻址,这时才知道,确实跟猜测的一样,一直把AT24C04当AT24C02来用。反复查看数据手册后又发现:“The 4K EEPROM only uses the A2 and A1 device address bits with the third bit
32、being a memory page address bit. The two device address bits must compare to their corresponding hard-wired input pins. The A0 pin is no connect. ”图4.5 器件地址l AT24C04的外部器件寻址只用到了6位,其中高四位1010是固定地址,A2跟A1是可编程地址,即最多可以并联4个AT24C04。A0没有用到。P0是AT24C04九位内部器件寻址中的最高位,即当进行器件内部寻址超过255的时候,要将最高位地址P0置1,再减去255,放在另外低8位的
33、地址。l 具体如下,首先把要寻址的地址赋给一个无符号整形(unsigned int)变量add。p=add8;/取出地址的高八位p=p1;/高八位右移一位start();/发出起始信号write(0xa0 | p);/外部器件寻址respond();/响应write(add&0xff);/地址的低八位,器件内部寻址respond();/响应write(date);/写数据respond();/响应stop();/停止这样当要进行器件内部寻址超过255的时候P0将变为1,剩下的减去255将是储存在器件内部地址低八位地址。这样就完成了9位寻址。 4.1.5 12864LCD显示模块图4.6 LCD
34、12864模块出现问题:12864有显示但没有背光问题解决:l LCD12864 PDF标明的背光控制是由其19管脚BLA背光源正极,20管脚BLK背光源负极控制的,但接上后发现背光不亮,后来经过检验发现原来买的LCD的两个管脚接反了。同时为了能灵活控制背光灯,我们加入了PNP9012作为开关电路,低电平导通。整体调试:l 在各个模块都调试成功后,用Protel将话好终电路图并焊接电路,再将调试成功后各模块的子程序,烧录到电路板上,检查电路板是否焊错!l 最后把各子模块程序改为头文件,嵌入主程序中,进行总体调试,观察显示与预测是否一致,不断调试,直到满意为止。结论系统功能大赛要求:(1) 能用LCD显示阳历年、月、日、星期、小时、分、秒;阴历月、日,阴历闰年,可通过按键调整时间。(2) 能够进行整点和半点清晰的语音报时。(3) 能进行闹钟设定,具有掉电存储功能,闹钟提醒。(4) 具有日程管理,可以设定30个指定日期的日程,并设置日程的提醒时间,每个日程采用音乐提醒,具有5首歌曲进行选择播放,歌曲具有重复播放功能。30个日程都能掉电保存!人性化额外设计:l 具有全系统休眠模式,和背光智能控制模式。节能低功耗,增加产品的寿命。l 具有两个1分钟的语音日程,能在指定时间播放预先留言。方便日常生活的语音留言。l 具有提醒音