基于单片机的具有语音报时电子钟.doc

上传人:夺命阿水 文档编号:9872 上传时间:2022-06-23 格式:DOC 页数:27 大小:2.39MB
返回 下载 相关 举报
基于单片机的具有语音报时电子钟.doc_第1页
第1页 / 共27页
基于单片机的具有语音报时电子钟.doc_第2页
第2页 / 共27页
基于单片机的具有语音报时电子钟.doc_第3页
第3页 / 共27页
基于单片机的具有语音报时电子钟.doc_第4页
第4页 / 共27页
基于单片机的具有语音报时电子钟.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《基于单片机的具有语音报时电子钟.doc》由会员分享,可在线阅读,更多相关《基于单片机的具有语音报时电子钟.doc(27页珍藏版)》请在课桌文档上搜索。

1、学号毕业论文毕业设计毕业实习报告基于凌阳片机的电子钟系部 电子机械工程 专业名称年 级学生指导教师24 / 27摘要本系统采用凌阳公司的SPCE061A单片机为控制核心;采用DS1302实时时钟系统,由单片机控制DS1302的读写,将读回来的时间数据通过数码管显示出来,修改时间采用操作友好的矩阵键盘,语音报时系统使用凌阳单片机本身具有的特色语音功能, 并将报时、报日历键分开,整机系统设计比较完善,有显示、键盘、报时、报日历的功能,除些之外还介绍了51单片机C语言编程移植到凌阳单片机的一些经验和方法,以便将51单片机的C语言经过局部的修改就可以移植到凌阳单片机上,节约重新开发的时间。最后总结了一

2、些关于在做基于凌阳单片机的电子钟时所遇到的问题和困难,以及将凌阳单片机与51单片机的各方面性能进行了比较,其语音还是凌阳单片机最大的特点,也是它应用较为广泛的原因。关键词: SPCE061A单片机,实时时钟,语音报时,数码管显示,矩阵键盘目 录前言1一、方案设计与论证1二、硬件电路设计.12.1整体电路方框图与说明.12.2各部分电路设计.22.2.1数码管显示驱动电路.22.2.2单片机系统电路.32.2.3语音播放电路.42.2.4电源电路部分.52.2.5 复位电路.62.2.5 键盘电路.6三、软件设计.63.1软件流程图及设计思路说明.63.2模块设计.73.2.1语音播放部分. 8

3、3.2.2DS1302实时时钟部分 8四、整机测试10五、对C51程序在凌阳单片机上移植分析.10六、总结10七、致11参考文献12附录12前言由于科学技术的快速发展,电子技术在20世纪取得了惊人的进步,特别是近几十年来单片机技术和其他高技术的飞速发展,致使工业、农业、科技和国防等领域以及人们的社会生活发生了令人瞩目的变革。凌阳单片机就是在这样的环境下发展起来,旗下的SPCE061A 单片机在语音方面也有了很大的发展,在消费电子中除了显示之外再加上语音的功能可以让产品更具人性化,本文将设计一个基于凌阳单片机的具有语音功能的电子钟。一、方案设计与论证方案一:本方案采用凌阳SPCE061A十六位单

4、片机,通过单片机控制DS1302实时时钟芯片进行读写,并对数码管、矩阵键盘进行扫描,语音报时采用凌阳单片机自带的语音系统。方案二:本方案采用AT89S51单片机,亦是控制对DS1302实时时钟的读写,并对数码管、矩阵键盘进行扫描,语音报时系统采用ISD1420,键盘采用矩阵键盘。方案确定:比较两个方案,如果是不考虑语音报时系统,则采用方案二,但本系统侧重语音,并且就51单片机C语言在凌阳SPCE061A上的移植做分析,所以最终采用方案一。二、硬件电路设计2.1.1整体电路方框图与说明系统原理框图如图2.1所示。主控元件采用凌阳SPCE061A单片机,属于凌阳unSP.系列产品的一个16位结构的

5、微控制器。在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只嵌32K字的闪存FLASH,但用在此系统上已经足够。较高的处理速度使unSP.能够非常容易地、快速地处理复杂的数字信号。因此以unSP.为核心的SPCE061A微控制器也适用在数字语音识别应用领域。SPCE061A在2.6V3.6V工作电压围的工作速度围为0.32MHz49.152MHz,较高的工作速度使其应用领域更加拓宽。2K字SRAM和32K字FLASH仅占一页存储空间,32位可编程的多功能I/O端口;两个16位定时器/计数器;32768Hz实时时钟;低电压复位/监测功能;8通道10位模-数转换

6、输入功能并具有置自动增益控制功能的麦克风输入方式;双通道10位DAC方式的音频输出功能,这就为本系统的语音播报打下了基础,整体系统框架如图2.1。键盘控制电路音频放大电路语音播放凌阳SPCE061A单片机DS1302实时实时时钟芯片数码管显示图2.1 系统原理框图整体具体工作原理是单片机控制DS1302实时时钟芯片的读写时序,将时间数据读出,再对数码管进行扫描,将时间正确显示出来。与此同时扫描键盘是否有报时键按下,有则调用语音报时函数进行报时。2.2 各部分电路设计2.2.1数码管显示驱动电路图2.2位选驱动电路 图2.3段选驱动电路2.2.2单片机系统电路单片机系统是整个硬件系统的核心,也是

7、协调整机工作的控制器,又是数据处理器。图2.4 单片机系统电路2.2.3 语音播放电路 音频部分的原理图2.5所示,在图7中可以看到两个跳线,其作用在于可以测量DAC的输出波形;另外拔掉跳线,可以断开DAC到喇叭放大的通路,使得DAC通道处于开路状态。这样便于用DAC做其他用途,用户可以用过这个跳线来加入自己的外围电路。 凌阳音频压缩算法根据不同的压缩比分为以下几种:SACM-A2000:压缩比为8:1,8:1.25,8:1.5SACM-S480: 压缩比为80:3,80:4.5 SACM-S240: 压缩比为80:1.5 按音质排序:A2000S480S240 用凌阳Compress Too

8、l事先把所需要的语音信号录制好,本系统共包括十多个语音资源,整个语音信号经凌阳SACM_S2000压缩算法压缩占了26K存储空间,SPCE061A单片机具有32k闪存,使用部flash即可满足要求。凌阳SPCE061A单片机自带双通道DAC音频输出, DAC1、DAC2转换输出的模拟量电流信号分别通过AUD1和AUD2管脚输出, DAC输出为电流型输出,所以DAC输出经过SPY0030音频放大,以驱动喇叭放音,放大电路如图7,这为单片机的音频设计提供了极大方便。在它们后面接一个简单的音频放大电路和喇叭即可实现语音播报功能,音频的具体功能主要通过程序来实现。图2.5 语音播放电路2.2.4电源电

9、路部分:图2.6是电源电路的部分,5V直流电压经过SPY0029后给整个系统供电,当然也可选用其它芯片。SPY0029是凌阳公司设计的电压调整IC,采用CMOS工艺。SPY0029具有静态电流低、驱动能力强、线性调整好等优点。图2.6电源电路2.2.5 复位电路:图2.7 复位电路2.2.6键盘电路:图2.8 4*4矩阵键盘三、软件设计 3.1 总程序流程图及设计思路说明初始化读DS1302显示时间扫描键盘Y显示-等待输入调用报时/日历函数输入完毕 报时N对DS1302进行写操作修改时间/日历 修改时间结束图3.1 程序流程图 程序开始运行,初始化IO口,如IO口的方向和属性向量,然后对读取D

10、S1302时间寄存器的数据,然后将时间数据通过数码管扫描显示,扫描4*4矩阵键盘判断是否有键按下,如有则读出相应键值,如果是报时键则调用报时间函数,如果是报日历键则调用报日历函数,如果是修改键,则使数码管显示-等待键盘输入数值,输入完毕等待确认修改时间还是日历,确认完成之后调用修改时间或者日历函数,调整DS1302中相应的时间或者日历寄存器值,达到修改时间的目的,到这里程序运行完毕,进入下一轮的开始。3.2 模块设计3.2.1语音播放部分本设计是采用凌阳SACM_S2000语音播报,流程图如图3.2。初始化获取所需音频数据SACM_S2000初始化开始播放放 N播放完毕?Y结束图3.2 语音播

11、放程序流程图3.2.2 DS1302实时时钟部分 DS1302 是DALLAS 公司推出的涓流充电时钟芯片含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个IO口线分别是RST复位、I/O数据线、 SCLK串行时钟,其部还有32*8bit的RAM,以供存储重要数据,如闹钟时间等。DS1302的读写操作如图3.3:图3.3 DS1302读写操作其部寄存器如图3.

12、4:图3.4 DS1302部寄存器具体的操作时序请见附表A中DS1302操作部分四、整机测试由于该系统设计比较简单,所以调试也较容易,运行效果良好,都能够实现设计的要求与功能。语音播放部分已经录制并压缩好,播放起来效果也不错。五、对C51程序在凌阳单片机上移植分析 从51单片机移植到凌阳单片机上主要注意的问题是要了解这两种单片机的部结构的差别,以及性能上的不同,首先是IO口的操作,凌阳单片机的IO口输入输出要手动更改,不像51那么方便,其次是要注意清看门狗,由于凌阳单片机为了程序运行能够更加稳定,所以加入了看门狗,清狗周期必需要小于0.75S,刚开始接触凌阳单片机经常会忘记这一步,最后就在于中

13、断、定时器、选频等特殊功能寄存器的操作上。下面就凌阳的位操作进行举例说明: 这是定义set_IO是将IO置1,clr_IO 则定义为清零。#define set_IO *P_IOA_Data|=0x2000 /IO=1#define clr_IO *P_IOA_Data&=0xdfff /IO=0这是输出,输入则需要将该引脚定义为输入如:*P_IOA_Dir&=0xdfff; /IOA13口定义为输入*P_IOA_Attrib|=0x2000; /IOA13口定义为悬浮式每次需要对IO口进行读写的时候都要改变IO口的属性及方向向量。这样就可以对DS1302进行读写操作了。51单片机的汇编语言移

14、植造成的程序改变量太大,无疑于重新编写,但是凌阳单片机的汇编语言已经和C语言很类似,不会再使用MOV这种指令,所以重新编写所造成的工作量不是非常大。六、总结凌阳单片机我从来没有接触过,只是听学长们说过,记得有一位学长说凌阳单片机有些不稳定,这个我没有深入研究过,但是在调试的时候发现在了个问题,在对数码管进行扫描的时候,偶尔会显示乱码,需要复位才能恢复正常。虽然之前没有学习过凌阳单片机,但是有了51单片机的基础之后,学起来不会很吃力,凌阳单片机和51单片机的差别就只是在于对一些特殊功能寄存器的操作和IO口的位操作上,相对于习惯使用51单片机而言凌阳单片机使用起来不太方便,这就是51单片机和凌阳单

15、片机的最大差别,凌阳虽然相比32位的ARM等高级的单片机相差甚远,但是对比51单片机还有许多优势,特别是在语音功能上,具有很大的优势。我学习凌阳单片机的目的除了它拥有强大的语音功能之外,还有一个目的就是如果能掌握凌阳单片机,那么就说明一样能掌握其它的单片机,比如说AVR、PIC、ARM,这说明各种单片机具有的共通性。这更说明平常对基础的积累相当重要,不管是学习单片机或者其它的一切事情都需要脚蹋实地才能继续做下去。七、致我的的毕业设计是在*老师的指导下才能顺利完成的,在此我对*老师表示衷心的感。参考文献1雷思孝,伯成,雷向莉编著.SPCE061A单片机原理及其应用技术-凌阳16位单片机原理及应用

16、M.: 电子科技大学.20042马忠梅,籍顺心,凯,马岩编著.单片机的C语言应用程序设计 M.: 航空航天大学.2003附录#includereg061.h#include a2000.h#include consist.h#define uint unsigned int #define P_IOA_Data 0x7000#define P_IOA_Buffer 0x7001#define P_IOA_Dir 0x7002#define P_IOA_Attrib 0x7003#define P_IOA_Latch 0x7004#define P_IOB_Data 0x7005#define

17、P_IOB_Buffer 0x7006#define P_IOB_Dir 0x7007#define P_IOB_Attrib 0x7008#define P_Watchdog_Clear 0x7012#define set_RST *P_IOA_Data|=0x8000 /RST=1#define clr_RST *P_IOA_Data&=0x7fff /RST=0#define set_IO *P_IOA_Data|=0x2000 /IO=1#define clr_IO *P_IOA_Data&=0xdfff /IO=0#define set_CLK *P_IOA_Data|=0x4000

18、 /CLK=1#define clr_CLK *P_IOA_Data&=0xbfff /CLK=0void SpeakTime;void nop; /替代51中的NOPvoid Display;/扫描数码管程序void DelayMs;/延时用void WriteByte;/写一个字节到1302uint ReadByte;/从1302读一个字节void WriteDate;/写数据到1302uint ReadDate;/从指定地void GetTime; /获取时间void SetTime;/读取时间void SetDay;/获取日历void Ajus_disp; /调整时间显示unsigne

19、d int key_num;uint ds1302_data7;uint set1302_data7=0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011; /1302读写缓存uint DispBuf6=1,2,3,4,5,6;/显示缓冲区uint DispCode11=0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f,0x0040; /段选unsigned int table_wei= 0x0100,0x0200,0x0400,0x0800,0x1000,0x

20、2000,0x4000;/位选/*向DS1302写入1B数据* 名称: void WriteByte* 功能: 向DS1302写入1B的指令或数据* 调用: 无* 输入: data* 返回值: 无* XX职业技术学院* 时间:2008.11.10*/void WriteByte/写一个字节到1302 /向DS1302写入1B数据 int i; unsigned int temp; *P_IOA_Dir|=0x2000; *P_IOA_Attrib|=0x2000; temp=data;/ACC clr_CLK;nop;nop; clr_IO; nop; for0;i- if set_IO; n

21、op;nop; /IO=ACC0 else clr_IO; nop; nop; set_CLK;nop;nop;/CLK=1 clr_CLK;nop;nop;/CLK=0 temp=1; /for/*从DS1302读出1B数据* 名称: ReadByte* 功能: 从DS1302读出1B数据* 调用: 无* 输入: 无* 返回值: 1B数据* XX职业技术学院* 时间:2008.11.10*/uint ReadByte/从1302读一个字节 /从DS1302读出1B数据 int i; unsigned int temp=0; /设IOA14为输入口 DS1302的IO口 *P_IOA_Dir&

22、=0xdfff; *P_IOA_Attrib|=0x2000; for0;i- clr_CLK; nop;/CLK=0 temp=1; temp&=0x7fff; iftemp|=0x8000;nop; / -移植程序时,这个地方也要修改 set_CLK; nop;nop;nop;/CLK=1 /for /将IOA14改回输出口 DS1302的IO口 *P_IOA_Dir|=0x2000; *P_IOA_Attrib|=0x2000;temp=8; temp&=0x00ff; return temp;/*向DS1302写入指令或数据* 名称: void WriteDate* 功能: 向DS13

23、02写入以add为地址的data数据* 调用: void WriteDate* 输入: add,data* 返回值: 无* XX职业技术学院* 时间:2008.11.10*/void WriteDate /add 为写入数据的地址,data为要写入的数据-写入单个的数据 uint temp; clr_RST; nop; nop;/RST=0 clr_CLK; nop; nop;/CLK=0 set_RST; nop; nop;/RST=1,启动数据传输 WriteByte; WriteByte; clr_RST; nop;nop;/RST=0 /*读DS1302里对应寄存器的数据* 名称: u

24、nsigned int ReadDate* 功能: 从DS1302读出以add为地址的数据* 调用: void ReadDate unsigned int WriteDate* 输入: add* 返回值: temp* XX职业技术学院* 时间:2008.11.10*/uint ReadDate/add 为读数据的地址 unsigned int temp; clr_RST; nop; nop;/RST=0 clr_CLK; nop; nop;/CLK=0 set_RST; nop; nop;/RST=1,启动数据传输 WriteByte;/写入地址 temp=ReadByte; clr_RST;

25、 nop;nop;/RST=0 return temp;/ 键盘扫描/unsigned int key_dispunsigned int key_temp;unsigned char i,j;unsigned int a=0x00fe,0x00fd,0x00fb,0x00f7; /P2 = 0xf0; *P_IOA_Dir|=0x00ff; /置输出 *P_IOA_Data&=0xff00; /清低八位 *P_IOA_Data|=0x00f0; /置为0x00f0; *P_IOA_Dir|=0x0000; /置输入 if!=0xf0 DelayMs; if!=0xf0 fori=0;i *P_

26、IOA_Dir|=0x00ff; /置输出 *P_IOA_Data&=0xff00; /清低八位 *P_IOA_Data|= ai; /扫描 if!=0xf0 key_temp = *P_IOA_Data&0xf0; forj=0;j if! break; key_temp=1; while!=0xf0Display;/显示 key_temp = i*4 + j; if9key_temp = key_temp + 6; return; return 21; / 按键处理/unsigned int key_process unsigned int i; unsigned int j; unsig

27、ned int k,num; num = key_disp; if SpeakTime , , ; if if9year/=16; if9month-=6; if9day-=6*; year+=2000; SpeakDate; if forj=0;jDispBufj=10; /全部显示- while num = key_disp; switch case 0: case 1:case 2: case 3: case 4:case 5: case 6:case 7:case 8: case 9: DispBufi=num; i+; if6i=0; Display; /显示 break; case

28、 10: SetTime , , ; goto exit; break; case 11: i-;DispBufi=10; break;case 12: SetDay , , ; goto exit;break; case 13:break;case 14: /SpeakTime , , ; goto exit; break;case 15:goto exit;break; default:break; Display; /显示 exit:; int main System_Initial; P0_Dir = 0xffff; /DS1302全部初始化为输出 P0_Attrib = 0xffff

29、;/DS1302全部初始化为输出 P0 = 0xffff; /DS1302全部初始化为输出 P1_Dir = 0xffff; /显示扫描输出 P1_Attrib = 0xffff; P1 = 0xffff; *P_Watchdog_Clear = 0x0001; SetTime; SetDay; / WriteDate;while *P_Watchdog_Clear = 0x0001; key_process; GetTime; Display; /显示 *P_Watchdog_Clear = 0x0001; void nop /替代NOP指令 uint j; forj=0;j ;void D

30、isplay/*数码管扫描程序*/uint i;for i = 0 ; i P1 = DispCodeDispBufi | table_weii; /位选+段选DelayMs; P1 = 0xff00;*P_Watchdog_Clear = 0x0001; void DelayMs /延时 uint i;whilefor i = 0 ; i *P_Watchdog_Clear = 0x0001; void GetTimeuint Time;Time = ReadDate;/读小时DispBuf0 = Time 4;DispBuf1 = Time & 0x000f; Time = ReadDate;/读分DispBuf2 = Time 4;DispBuf3 = Time & 0x000f

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号