数字信号处理课程设计报告.docx
《数字信号处理课程设计报告.docx》由会员分享,可在线阅读,更多相关《数字信号处理课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
数字信号处理课程设计报告
目录
1、课程设计名称
2、课程设计前期介绍(凌阳单片机)
1、源来
2、简介
3、优点
4、语音模块
3、课程设计内容及要求
4、课程设计原理
1、硬件设计
2、软件设计
5、主程序代码
6、调试
7、心得及体会
8、附录
1、原件清单
2、原理图
3、实物图
1、课程设计名称
基于凌阳16位单片机的定时报警器
2、课程设计前期介绍(凌阳单片机)
2.1源来
随着单片机功能集成化的发展,其应用领域也逐渐地由传统的控制,扩展为控制处理数据处理以及数字信号处理,DSP(DigitalSignalProcessing)等领域。
凌阳的16位单片机就是为适应这种发展而设计的。
2.2简介
它的CPU内核采用凌阳最新推出的MicrocontrollerandSignalProcessor16位微机处理器芯片,以下简称µ’nSP。
围绕micro;’nSP所形成的16位u’nSP系列单片机,以下简称µ’nSP家族。
采用的是模块式集成结构,它以µ’nSP内核为中心集成不同规模的ROMPAM和功能丰富的各种外设部件。
µ’nSP内核是一个通用的和结构。
除此之外的其它功能模块均为可选结构。
以及这种结构可大可小可有可无,借助这种通用结构附加可选结构的积木式的构成,便可成为各种系列的派生产品,以适合不同场合,这样做无疑会使每种派生产品具有更强的功能和更低的成本。
µ’nSP家族有有以下特点:
体积小,集成度高,可靠性好易于扩展。
µ’nSP家族把各功能把各功能部件模块化地集成在一个芯片里。
内部采用总线结构,因为减少了各功能部件之间的连接,提高了其可靠性和抗干扰能力,另外,模块化的结构易于系列的扩展,以适应不同用户的需求。
具有较强的中断处理能力。
μ’nSPTM家族的中断系统支持10个中断向量及10余个中断源,适合实时应用领域。
高性能价格比:
μ’nSPTM家族片内带有高寻址能力的ROM,静态RAM和多功能的I/O口,另外μ’nSPTM的指令系统提供出具有较高运算速度的16位,16位的乘法运算指令和内积运算指令,为其应用添加了DSP功能,使得μ’nSPTM家族运用在复杂的数字信号处理方面既很便利又比专用的DSP芯片廉价。
2.3优点
功能强、效率高的指令系统:
μ’nSPTM的指令系统的指令格式紧凑,执行迅速,并且其指令结构提供了对高级语言的支持,这可以大大缩短产品的开发时间。
低功耗、低电压:
μ’nSPTM家族采用CMOS制造工艺,同时增加了软件激发的弱振方式,空闲方式和掉电方式,极大地降低了其功耗,另外,μ’nSPTM家族的工作电压范围大,能在低电压供电时正常工作,且能用电池供电,这对于其在野外作业等领域中的应用具有特殊的意义。
2.4语音模块
支持语音识别,语音产生。
凌阳单片机的语音识别模块自带语音的API函数,其中包括A2000格式和S480格式自动播放及手动播放的播放函数,S240、MS01格式自动播放的播放函数、DVR格式的语音录放函数和语音识别函数,让凌阳单片机不但可以作为普通的单片机开发系统,而且还可以作为一个语音系统进行语音播放、语音录放和语音识别,大大降低了凌阳单片机的开发难度,并增强了凌阳单片机的使用领域和功能。
三、课程设计内容及要求
所谓的定时报警器,就是调节时间,进行倒计时,时间到时,播放报警语音。
此次设计,是需要通过3个按键实行时间调整以及开启倒计时。
其中一个为复选键,即第一个键按下第一次,可以调节分的数字,第二下,可以调节秒数,第三下时,开启定时器,进行倒计时。
而第二个键以及第三个键则分别调整加以及减。
由于本次采用的是4位数码管,并经过程序设计,最大定时为一个小时。
四、课程设计原理
4.1硬件设计
本次试验采用4位共阴数码管,以及三个点触开关。
数码管:
4位一体数码管,其内部段已连接好,引脚如图所示(正面朝自己,小数点在下方)。
a、b、c、d、e、f、g、dP为段引脚,1、2、3、4分别表示四个数码管的位。
1af23b
。
。
。
。
。
。
。
。
。
。
。
。
eddpcg4
即:
12-9-8-6为公共端,A-11B-7C-4D-2E-1F-10G-5DP-3
**4位数码管区分共阴阳极的方法
首先数码管有共阴极和共阳极之分,区别他们的方法是若公共端接地,其他端接电源,若各段测试能亮,说明是共阴的,反之共阳的;若公共端接电源,其他端分别接的,测得各端亮,则说明是共阳的,反之为共阴的。
世面上的四位一体的数码管一般都没有datasheet,所以掌握他们管脚的分布是很重要的一个环节。
点触开关:
这里采用点触开关,就犹如电子手表调节时间按键,触发一次,数字相应的变换一次。
我将点触开关连接在了IOA15~IOA13,初始化时,将IOA15~IOA13给了高电平,在硬件连接时,三个开关的一端接在一起,引出一个端口接在单片机的-端口,将开关按下,对应的IO端口得到低电平,软件中的键扫描程序将作出相应的反应。
4.2软件设计
软件设计时,主要是两个部分。
一是时间通过定时器倒计时,二是按键调节时间。
相对来讲,前者较简单,先完成前面部分,再逐一完善整个程序。
模块一:
时间
首先计算共阴极数码管0~9的代码为:
0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f
进行单片机中IOA,IOB中32个接口的初始化,我设计的试验中,将IOA低八位作为数码管段选端,IOA高三位作为3个点触开关信号的输入端,IOB低四位作为四位数码管的位选端。
根据相应的需要设置为高、低电平。
这里开timerA,采用8192Hz作为时间脉冲,初值可计算,为fccch,以及中断源的初始化:
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1;//设置定时器TimerA:
8192Hz
*P_TimerA_Data=0xfccc;//计数初值,定时时间为0.1s
*P_INT_Ctrl=C_IRQ1_TMA;
开始主程序,我们需要在程序中设置全局变量fent,fen,sect,sec分别代表数码管的1~4位。
并在主程序中设置初值,比如sec=sect=fent=0,fen=1(定时一分钟)。
时间显示会逐一变化,是因为中断中,定时器A将开始计时,并以8192Hz的频率,进行访问,当fccc减至0时,0.1s时间到,我们需要在main.c中设一个中断函数,即:
voidIRQ1(void)__attribute__((ISR));//中断函数
voidIRQ1(void)
{
temp++;
*P_INT_Clear=C_IRQ1_TMA;//清除中断标志控制单元
}
每0.1s,temp++,当temp为10时,即为1s时间,即可在程序中作出相应响应。
模块二:
按键
按键扫描是一个比较麻烦的问题,由于程序运行周期很快,按键的时间相对来讲,显得很慢,每当按下键,程序可能已经运行了几十遍甚至上百遍。
也就是数字会变化很快,不能达到预想目的,也就是,按一下第二个键,分钟或秒钟就加1,按第三个键,相应的减1。
所以程序中需要一个延时函数,即:
voiddelay(z)//延时函数
{
intx,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
*P_WatchDog_Clear=0x0001;
而第一个键作为复选键,需要在实行它的功能时做相应的条件,比如第三下开启定时器,也就是打开中断:
__asm("INTIRQ");//安装定时,开放IRQ的总中断允许位,但FIQ中断仍禁止
i==0;
而时间变化的逻辑顺序,参考主程序源代码。
模块三:
报警功能的实现
首先是找到相应的音频文件,我实在酷狗中寻找的盗车报警器,然后用酷狗的铃声制作中将其转化为.wav格式,再用凌阳单片机的格式转化工具,这里采用s480,所以转化为.48k格式,并将其复制到你所建立的工程文件夹中,具体实现自动语音播放请参照《16位单片机原理及应用》彭宣戈主编第十章。
课本采用的是A2000,步骤都是一样的。
5、主程序代码
#include"SPCE061V004.h"
#include"hardware.h"
#include"s480.h"
#defineP_WatchDog_Clear(volatileunsignedint*)0x7012
#defineKEY_ALL0xff00//使用IOA8~IOA15作为键盘输入口
staticintb[10]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};//共阴
inttemp,fent,fen,sec,sect,i;
intGetKey(void);
voidplay();
voiddisplay(intfent,intfen,intsect,intsec);
voiddelay(intz);
voidkeyscan(void);
main()
{
*P_IOA_Attrib=0x00ff;//设置A口低8位为同向低输出,高8位为同向上拉输入bw
*P_IOA_Dir=0x00ff;
*P_IOA_Data=0xff00;
*P_IOB_Attrib=0x00ff;//初始化IB0~IB3,控制数码管的位选
*P_IOB_Dir=0x00ff;
*P_IOB_Data=0x0000;
*P_TimerA_Ctrl=C_SourceA_8192Hz+C_SourceB_1;//设置定时器TimerA:
8192Hz
*P_TimerA_Data=0xfccc;//计数初值,定时时间为0.1s
*P_INT_Ctrl=C_IRQ1_TMA;
fent=fen=sec=sec=temp=i=0;
while
(1)
{
delay(10);
if(GetKey()==0x8000)//IOA15复选键
{
delay(500);
if(i==3)
{
__asm("INTIRQ");//安装定时,开放IRQ的总中断允许位,但FIQ中断仍禁止
i==0;
}
i++;
}
if(GetKey()==0x4000)//IOA14加法键
{
delay(500);
if(i==1)
{
fen++;
if(fen==10)
{
fent++;
if(fent==6)
fent=0;
fen=0;
}
}
elseif(i==2)
{
sec++;
if(sec==10)
{
sect++;
if(sect==6)
{
sect=sec=0;
}
sec=0;
}
}
}
if(GetKey()==0x2000)//IOA12
{
delay(500);
if(i==1)
{
fen--;
if(fen<0)
{
fent--;
if(fent<0)
{
fent=5;
fen=9;
}
fen=9;
}
}
elseif(i==2)
{
sec--;
if(sec<0)
{
sect--;
if(sect<0)
{
sect=5;
sec=9;
}
sec=9;
}
}
}
if(temp==10)
{
sec--;
if(sec<0)
{
sec=9;
sect--;
if(sect<0)
{
sect=5;
fen--;
if(fen<0)
{
fen=9;
fent--;
if(sec==sect==fen==fent==0)
{
sec=sect=fen=fent=0;
play();
}
}
}
}
temp=0;
fent=0;
}
display(fent,fen,sect,sec);//显示四位数值
*P_WatchDog_Clear=0x0001;
}
}
voiddisplay(fent,fen,sect,sec)//数码管的位选,片选状态
{
*P_IOA_Data=b[fent];
*P_IOB_Data=0xfffe;//IOB0选中
delay(5);
*P_IOA_Data=b[fen]+0x0080;//IOB1选中的小数点点亮
*P_IOB_Data=0xfffd;//IOB1选中
delay(5);
*P_IOA_Data=b[sect];
*P_IOB_Data=0xfffb;//IOB2选中
delay(5);
*P_IOA_Data=b[sec];
*P_IOB_Data=0xfff7;//IOB3选中
delay(5);
}
voiddelay(z)//延时函数
{
intx,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
*P_WatchDog_Clear=0x0001;
}
#include"SPCE061V004.h"
voidIRQ1(void)__attribute__((ISR));//中断函数
voidIRQ1(void)
{
temp++;
*P_INT_Clear=C_IRQ1_TMA;//清除中断标志控制单元
}
intGetKey(void)//按键扫描
{
unsignedintKeyvalue;//Keyvalue
unsignedinti=0;
unsignedintk=0;
*P_IOA_Dir&=~KEY_ALL;//初始化IOA的相t应端为上拉输入
*P_IOA_Attrib&=~KEY_ALL;
*P_IOA_Buffer|=KEY_ALL;
//等待有键按下,即有端口变为零
i=(*P_IOA_Data&KEY_ALL)^KEY_ALL;//获取按键值
delay
(1);//停顿片刻,判断是否为干扰
k=(*P_IOA_Data&KEY_ALL)^KEY_ALL;//再获取一次
if(i==k)//如果两次相同,输出该值
Keyvalue=k;
else
Keyvalue=0;
returnKeyvalue;
*P_WatchDog_Clear=C_WDTCLR;
}
voidplay()
{
SACM_S480_Initial
(1);//自动方式播放初始化
SACM_S480_Play(0,3,3);
while((SACM_S480_Status())&0x0001)
{
SACM_S480_ServiceLoop();
*P_WatchDog_Clear=0x0001;
}
}
6、调试
调试期间,硬件是没有问题的,12个管脚中,4个位选,8个段选,虽然数码管不是按一定的顺序引出的管脚,但在万能版上可以走线。
而最容易出现的问题,就是时间变化的逻辑关系,我在调试的时候,首先调试的是按键功能,按键的键扫描,本来安装软件中,是含有key.asm,是一个键扫描的子程序,并且61开发板中含有key1,key2,key3三个键的,由于刚开始的时候不知道它对应的端口在哪,也就在万能版中自己焊接了三个点触开关。
数码管显示,是直接给相应的段低电平,可以显示出想要的结果。
播放语句,是调试最久的一个模块,虽然之前做过自动播放的试验,可这次却各种调试都有问题,喇叭有电流,可就是不播放音乐,甚至想直接用蜂鸣器代替是,和同学一起努力下,发现了问题,播放音乐程序中没有相应的判断播放问题,只是在中断之前就已经播放,没有考虑到播放后程序的运行,致使语音指挥脉冲信号。
7、心得及体会
1、通过这次课程设计,加强了我们动手、思考和解决问题的能力。
在整个设计过程中,我们通过这个方案包括设计了一套电路原理,和数码管的选择。
这个课程设计硬件部分总共使用了一块四位共阴数码管,三个点触开关
2、在设计过程中,经常会遇到这样那样的情况,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了,因此耗费在这上面的时间用去很多。
3、我沉得做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。
平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。
而且还可以记住很多东西。
比如一些中断,IO口,平时看课本,这次看了,下次就忘了,通过动手实践让我们对整个61开发板映象深刻。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
所以这个期末测试之前的课程设计对我们的作用是非常大的。
4、在制作硬件部分时,发现细心耐心,恒心一定要有才能做好事情,首先是线的布局上既要美观又要实用和走线简单,兼顾到方方面面去考虑是很需要的,否则只是一纸空话。
5、在画好原理图后的做硬件时,由于61开发板的各个端口地址的不熟悉,导致各个端口的初始化,增加了布线难度,也产生很多不曾注意的问题,今后要牢记这个教训,使以后布线更加顺利。
6、经过一个星期的实习,过程曲折可谓一语难尽。
在此期间我们也失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。
生活就是这样,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
通过实习,我才真正领略到“艰苦奋斗”这一词的真正含义,我才意识到老一辈电子设计为我们的社会付出。
我想说,设计确实有些辛苦,但苦中也有乐,在如今单一的理论学习中,很少有机会能有实践的机会,但我们可以,而且设计也是一次自我挑战,和同学一起的做可以让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里一年的相处还赶不上这一个礼拜的合作,我感觉我和同学们之间的距离更加近了;我想说,确实很累,但当我看到自己所做的成果时,心中也不免产生兴奋;正所谓“三百六十行,行行出状元”。
我们同样可以为社会作出我们应该做的一切,这有什么不好?
我们不断的反问自己。
也许有人不喜欢这类的工作,也许有人认为设计的工作有些枯燥,但我们认为无论干什么,只要人生活的有意义就可。
社会需要我们,我们也可以为社会而工作。
既然如此,那还有什么必要失落呢?
于是我们决定沿着自己的路,执着的走下去。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师和同学的辛勤指导下,终于游逆而解。
同时,在老师的身上我们学也到很多实用的知识。
7、此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。