语音闹钟及定时器完整版附图Word文档格式.docx
《语音闹钟及定时器完整版附图Word文档格式.docx》由会员分享,可在线阅读,更多相关《语音闹钟及定时器完整版附图Word文档格式.docx(39页珍藏版)》请在冰点文库上搜索。
本课题是基于凌阳十六位单片机的语音闹钟定时器的开发,由于之前我们组员都未曾接触过单片机知识,我们首先通过查阅凌阳单片机的相关资料学习单片机相关知识。
由于凌阳十六位单片机自带了语音录放功能,这在很大程度上减小了我们的课题难度,我们首先考虑到实现闹钟定时器功能分两个部分,即软件部分和硬件部分,通过编程可以实现对单片机外围接口的定义,将想要传送的内容(包括语音部分和显示部分)传输出去,而外围电路的设计包括语音部分、显示部分以及输入部分(键盘);
由于要求只显示年月日时分秒,我们采用数码管即可实现显示功能。
此外我们还要做的就是语音采集及时间显示和闹钟的切换。
系统设计框图如下
图2.1.1、系统设计框图
SPCE061A最小系统框图:
图2.1.2
2.2主要电路设计与参数计算
61板硬件框图如图所示:
图2.2.1、61硬件板框图
框图说明:
表2.2.2、框图说明
61板接口说明图:
图2.2.3、61板接口说明
2.2.1基本参数
1、工作电压:
4.5V(三节干电池);
2、时间采用24小时制;
3、采用六位数码管动态显示年月日/时分秒。
2.2.2所需元件及元件参数
1、凌阳十六位单片机组套;
2、三节1.5V干电池;
3、一片SR420561K四位数码管和两片SM420501K一位数码管;
4、20位插排、数据传输线、一些导线和焊锡。
2.2.3注意事项
1、将61板上的J5跳线选择3.3V;
2、在安装电池时注意正负极,否则容易烧坏芯片;
3、在印制电路板上的焊接元器件前要认真对照原理图,仔细查看印制电路板,找到对应的元器件功能区;
4、在电源测试期间请勿将单片机芯片插入座中,以免电源部分有问题造成芯片烧坏。
5、连接外接电路时一定要注意端口对应关系,以免连接错误不能正常显示;
6、在焊接外围电路时,要仔细认真,以免造成个别焊点焊接不良。
2.3输入/输出(I/O)接口
61板将SPCE061A的IOB端口引出,IOB的所有端口均设置为输出端口,IOA的低八位端口设置为输入端口,其中IOA端口的IOA0~IOA2为默认的Key1、Key2、Key3按键接口,IOB端口的IOB7~IOB2设置为数码管的位选端口,高八位IOB15~IOB8设置为数码管的段选接口。
三、调试步骤
3.1软件部分
3.1.1时间显示函数
题目要求我们在原有的万年历的基础上更改程序使之满足闹钟定时器功能,而原有万年历程序部分并未给出外围显示部分,因此我们小组在此基础上添加了时钟时间显示函数display(),程序如下:
//======================================================
//文件名称:
Clock_Display.c
//功能描述:
调整日期和时间的函数集
#include"
spce061a.h"
#include"
Key.h"
staticintLED1[10]={0xfcfb,0x60fb,0xdafb,0xf2fb,0x66fb,0xb6fb,0xbefb,0xe0fb,0xfefb,0xf6fb};
staticintLED2[10]={0xfcf7,0x60f7,0xdaf7,0xf2f7,0x66f7,0xb6f7,0xbef7,0xe0f7,0xfef7,0xf6f7};
staticintLED3[10]={0xfdef,0x61ef,0xdbef,0xf3ef,0x67ef,0xb7ef,0xbfef,0xe1ef,0xffef,0xf7ef};
staticintLED4[10]={0xfcdf,0x60df,0xdadf,0xf27f,0x66df,0xb6df,0xbedf,0xe07f,0xfedf,0xf6df};
staticintLED5[10]={0xfdbf,0x61bf,0xdbbf,0xf3bf,0x67bf,0xb7bf,0xbfbf,0xe1bf,0xffbf,0xf7bf};
staticintLED6[10]={0xfc7f,0x607f,0xda7f,0xf27f,0x667f,0xb67f,0xbe7f,0xe07f,0xfe7f,0xf67f};
//IOB口的高八位接段选,低六位接位选
//共阴接法'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
的代码
voiddisplay(unsignedHour,unsignedMin,unsignedSec)
{
inti;
unsignedintFir_hour;
unsignedintSec_hour;
unsignedintFir_min;
unsignedintSec_min;
unsignedintFir_sec;
unsignedintSec_sec;
Fir_hour=Hour/10;
//时钟十位要显示的数字
Sec_hour=Hour%10;
//时钟个位要显示的数字
Fir_min=Min/10;
//分钟十位要显示的数字
Sec_min=Min%10;
//分钟个位要显示的数字
Fir_sec=Sec/10;
//秒钟十位要显示的数字
Sec_sec=Sec%10;
//秒钟个位要显示的数字
*P_IOB_Attrib=0xffff;
//初始化IOB0~IOB15带数据缓存的高电平输出口
*P_IOB_Dir=0xffff;
*P_IOB_Data=0xffff;
*P_IOB_Data=LED1[Sec_sec];
*P_Watchdog_Clear=0x0001;
for(i=0;
i<
0x00ef;
i++)//延时
{*P_Watchdog_Clear=0x0001;
}
*P_IOB_Data=LED2[Fir_sec];
}
*P_IOB_Data=LED3[Sec_min];
*P_IOB_Data=LED4[Fir_min];
*P_IOB_Data=LED5[Sec_hour];
*P_IOB_Data=LED6[Fir_hour];
0x0011;
}
3.1.1日期显示函数
但是题目要求我们还要显示日期,这样既要求显示日期又要求显示时间,如果我们选择12个数码管当然理论上是可以实现的,但是一方面这样太浪费资源,另一方面在引脚控制上也过于繁琐(要至少有12个位选端口8个段选端口共20个端口),因此我们考虑添加日期显示函数displaydata(),具体程序如下:
voiddisplaydata(unsignedYear,unsignedMon,unsignedDay)
unsignedintFir_year;
unsignedintSec_year;
unsignedintFir_mon;
unsignedintSec_mon;
unsignedintFir_day;
unsignedintSec_day;
Fir_year=Year/10%10;
//年十位要显示的数字
Sec_year=Year%10;
//年个位要显示的数字
Fir_mon=Mon/10;
//月十位要显示的数字
Sec_mon=Mon%10;
//月个位要显示的数字
Fir_day=Day/10;
//日十位要显示的数字
Sec_day=Day%10;
//日个位要显示的数字
*P_IOB_Data=LED1[Sec_day];
*P_IOB_Data=LED2[Fir_day];
*P_IOB_Data=LED3[Sec_mon];
*P_IOB_Data=LED4[Fir_mon];
*P_IOB_Data=LED5[Sec_year];
*P_IOB_Data=LED6[Fir_year];
}
3.1.1时间日期实现交替
然而我们会发现在主程序中要想调用这两个函数显示日期和时间并不是那么容易的,那么如何让数码管既能显示日期又能显示时间呢?
我们考虑到两种方案:
1、通过按键设置来实现日期和时间的切换显示;
2、通过时间条件来交替显示日期和时间。
这里我们选择了第二种方案。
调用程序如下:
if(Clock_GetSec()/5)
display(Clock_GetHour(),Clock_GetMin(),Clock_GetSec());
else
displaydata(Clock_GetYear(),Clock_GetMon(),Clock_GetDay();
即每隔一分钟显示一次日期,日期的显示时间长度为5s。
其他部分这里就不赘述了,完整程序见附录8.1。
3.2硬件部分
硬件部分主要是六位数码管,在连接数码管时要分清位选端和片选段,对数码管的各个引脚应该熟悉。
我们采用的是SR420561K四位数码管和两个SM420501K数码管,他们都是共阴极数码管,他们的引脚图如下:
图3.2.1、SM420501K数码管图3.2.2、SR420561K四位数码管
外围电路接口控制图如下:
图3.2.3、IOB端口引脚连接图
图3.2.4、六位数码管动态显示原理图
图3.2.5、按键控制电路
总体电路图:
图3.2.6总体电路图
实物图连接图如下:
图3.2.7实物连接图
四、测试结果
测试步骤及结果如下:
1、连接好电路并检查无误后,打开电源开关,此时显示的时间为程序设定的初始时间和日期;
2、按Key1第一次,播报时间(Clock_Speech.c);
3、按Key1第二次,调整闹钟(main.c);
再按Key2键为加,按Key3键为减;
4、Key1键长按,调整日期和时间(Clock_Adjust.c);
5、按Key2键,播报日期(Clock_Speech.c);
6、按Key3键,播报闹钟时间;
7、如果达到设定时间闹铃响最长一分钟,若在闹钟时间按Key1键,停止闹铃。
五、结论
5.1本方案的特点
1、本方案设计思路简单易懂,非常适合新手入门;
2、数码管显示采用动态显示方法,便于理解和掌握;
3、程序中对输入输出端口的定义对刚刚接触单片机的同学在理解上有很大帮助;
4、外围电路简单实用,没有过多的器件;
5、凌阳单片机自带的语音功能帮助我们很好的实现了语音播报闹铃等。
5.2本方案的缺点
1、外围电路数码管显示亮度不均较暗,这是由于我们程序采用的是循环延时方式,使得各个数码管的亮灭时间长短不同;
2、闹铃与数码管显示冲突,不能同时进行;
3、按键过少,使得初次实用者操作不便;
5.3本方案的改进扩展部分
1、如果仍采用循环延时显示方法,需要改进的是将各个数码管延时时间调成一致,从而使数码管亮度均匀;
2、可以减小外电路的保护电阻阻值,或者通过加入三极管放大电路放大电流,从而提高数码管的亮度;
3、可以采用中断机制,从而达到亮度均匀,以及闹铃与数码管显示互不干扰的目的;
4、可以外接键盘组模,从而更加便于操作;
5、语音闹钟部分可以拓展为音乐盒,闹钟铃声可以外接键盘选择;
6、数码管显示毕竟不如液晶显示更为先进,因此可以考虑改用液晶做外接显示;
5.5小结
虽然以上改进部分可以使我们的课程设计更加完美,但是由于时间有限,并
且我们组员都是初学者,没有那么多时间补充完整,因此这部分我们将在以后的学习中继续学习补充。
此外,本方案设计也基本符合课程设计题目要求,达到了预期目的。
六、本作品使用说明
操作说明:
1、首先检查焊接电路是否有问题,确定连接线路无误后方可打开电源开关,此时显示初始时间和日期;
图6.1时分秒(9:
40:
29)图6.2年月日(2011.7.26)
2、按Key1第一次,播报时间——小时、分钟;
3、按Key1第二次,语音提示调整闹钟;
同时有语音提示;
4、Key1键长按,语音提示调整日期和时间;
5、按Key2键,语音播报日期——年、月、日;
7、如果达到设定时间闹铃响最长一分钟,闹铃为本组录制,可通过程序更改铃声;
若在闹钟时间按Key1键一次,停止闹铃。
七、课程设计心得体会
7.1马守江的心得体会:
通过本次课程设计我学到了很多东西,单片机方面的知识我们在之前接触较少,因此在刚开始做这个课程设计时,我感觉有些吃力,但是经过一个星期左右的学习,我基本上掌握了单片机的基本原理和利用单片机做硬件开发的相关思路。
我们这次选的课题是利用凌阳十六位单片机实习闹钟和定时器功能,可以说这对于单片机开发者来说是最基础最简单的课题了,然而我在学习的过程中却四处碰壁,对于网上的很多解答都不能想得很透彻,这样郁闷的状态大概持续了五六天的样子,这期间我不断的问,虽然有时候对于他们是很简单的问题,有时候心里也确实有所顾忌,然而我知道不懂必须要问,即使被别人看不起也要厚着脸皮去问去学。
还好这样最终我还是把课题的知识体系理清楚了,结合C语言知识,后面我已经可以自己对程序进行调试修改补充了,直到昨天我还在对程序进行最后的修正补充,我相信功夫不负有心人,最终我们还是顺利完成了课程设计。
说说在做课程设计过程中遇到的问题吧,我不想说的太繁琐,只想提一点,那就是单片机的输入输出(IO)接口问题,这个问题是我在做课程设计时一直困扰我的,如果把端口定义端口连接机制搞清楚了,那么我认为这个单片机就已经是你的了,你就可以随心所欲的对外围电路进行控制了。
我们闹钟定时器的外围电路相当简单,复杂一点也就是键盘组模、三极管放大电路、数码管显示三个部分而已,但是如果对外围接口不清楚,那就完全失去方向了,当我搞清楚IO端口定义时,这时我们的课题设计才有了实质性的进步,然后我们才设计出了数码管的动态显示电路,键盘控制操作等等。
因此我个人认为,虽然我们做的是硬件,但是更多的知识却是储存在软件编程里的,所以我认为学习单片机不仅要学会设计各种电路系统,还应该掌握编程技术,软件与硬件结合起来,就好比真理与实践结合起来一样的道理。
可以说这次实习的时间还是不够用的,毕竟我们既是在学习又是在实践,短短的十多天时间毕竟不能完全掌握一门知识,但是通过这种锻炼学习,我们却掌握了硬件开发的基本思路框架,这对于我们在以后的学习和工作都是非常有用的。
在这次的课程设计过程中,我还学到的一点就是,多一个人多一份力,原本是打算一个人做的,但是到现在看来,如果一个人的话中间会有多少不便就难说了,就拿外围电路来说,虽然说软件部分是我做的,但是我做硬件方面却欠缺的很,电路连接布线布局很不美观,最后的电路板是由我的队友贺鹏同学全程焊接的,在此谢谢他,辛苦了。
实习即将结束,暑假即将开始,真是一个充实的暑假生活。
7.2贺鹏的心得体会:
本次课程设计,我们组选的课题是:
基于凌阳61单片机可显示时间的语音闹钟。
总体而言,此课题不算复杂。
本课题的核心有两部分:
一是凌阳单片机,这是最为核心的部件;
二是显示时间的外围电路,这一部分是需要我们动手设计的。
焊接单片机是本次课程设计的第一步。
当时,领到的器件有:
小个子元器件(20个),包括晶振(1个)、二极管(3个)、SPY0029A(1个)、电阻(18个);
中个子元器件(45个),包括瓷片电容(5个)、独石电容(19个)、电解电容(12个)、按键(4个)、发光二级管(2个)、芯片座(3个);
大个子元器件(13个),包括排针(9个)、接座(3个)、电位器(1个);
成型的PCB板一块;
芯片(3个)。
面对这一大堆凌乱的元器件,给我的感觉是无从着手。
好在之前看过师兄师姐的单片机成品,并且我从互联网上也查过单片机的资料,再加上跟随器件一起的使用手册,于是我摸索着焊接自己的单片机。
焊接61板,首先,需要进行61裸板检测。
这一步很简单,也很重要,如果裸板存在问题,那么以后的工作都将是徒劳。
然后是检测元器件,并做元器件的整形。
这样做的目的是确保以后用到的每一个元器件都是完整并且正常工作的,否则某个元器件出了问题,查找起来也不是件容易的事儿。
再就是对元器件进行分类,这样做是为了后面进行焊接工作时更为清晰,不容易遗漏元器件。
最后是按照焊接单片机的18个步骤进行焊接。
这一步很复杂,花费的时间也是最多的,往往一不小心就出错了。
最终导致的结果是整个单片机无法工作。
我在这个步骤中就犯了不少错误。
一是我将两个电解电容的位置弄错了,修正时不得不把两个电容重新拔出来对换位置,这样一折腾,电容的性能就很让人担心了;
二是我将两个发光二极管的正负极性接反了,究其缘由是我当初焊接电路是想当然,没有去查资料,也没有用万用表检测其极性,完全是凭着自己的主观臆断去焊接发光二极管,折腾一番后,两个发光二极管都被我弄坏了,不得不用新的发光二极管替换;
三是我将单排插针焊在了五针座的位置上,结果又是一番折腾。
不过最后我焊接的单片机还是成功的运行了自检程序。
对于单片机的焊接,我犯的这些错误都是由于我不够细心而造成的。
不过我更为欣慰的是:
虽然错误犯了不少,但经过我的修正,最终我的单片机还是正常运行起来了。
正所谓,知识有时候是在不断犯错误中积累起来的。
外围电路的设计是本次课程设计的意义所在。
第一步焊接单片机时有现成的原理图可以参照,而外围电路的每一个步骤都需要自己动手完成。
这是真正意义上从无到有的过程。
因为之前对单片机的整体构造有了了解,所以在设计外围电路时,能够大致确定外围电路所需要的器件。
首先,数码管是显示电路必不可少的部件;
其次,为了保证数码管的亮度,我们曾设想使用三极管作为驱动电路,但最后,经过实践发现,增加三极管对于电路的布局有诸多的不利:
第一,电路板的面积很有限;
第二,数码管采用的是一个四合一数码管和两个一位的数码管,其引脚总共达到了32个!
在有限的电路板上焊接32个引脚,并且引脚间的连接采用的是导线,这使得电路布局十分紧凑。
如果再加上三极管和相应的保护电阻,这无疑会增加焊接难度。
更为重要的是,在不使用三极管和保护电阻的情况下,数码管的显示亮度已经达到了预定效果。
因此,我们选择舍弃了这些鸡肋部件,就这样焊接好了外围电路。
当然在焊接外围电路时也遇到过麻烦,究其原因是焊接的密度太大。
另一方面,在焊接之前,我在纸上对电路进行了详细布局,所以在查找问题时,很容易就解决了。
此次实习,从其整个过程来看,是一次硬件设计的初体验。
于我而言,硬件设计不是我最佳的追求,但这的确是一次美好的体验,至少让我知道,有些东西注定要亲身尝试,没有去尝试,你永远不知道你的潜力有多大。
八、附录
8.1主要程序
Main()函数:
//=======================================================
//工程名称:
61_BardianClock
个性闹钟,用按键设定闹钟时间,到达设定时间扬声器发出音乐。
//Key1-按一下,报时;
再按一下,定时;
//长按Key1键达到1.5秒,则进入调时模式
//Key2-在调时/定时模式下,使年、月、日、时、分、秒增加;
//Key3-在调时/定时模式下,使年、月、日、时、分、秒减小
//涉及的库:
SacmV26e.lib
//组成文件:
main.c,Sound.c,Clock.c,Clock_Speech.c,Clock_Adjust.c,
//Clock_Display.c
//Key.asm,hardware.asm,ISR.asm
//A2