buf[i]=buf[i+1];
buf[N-1]=a;
}
而获得这一系列中的某一个数据就用了一个函数就可以了,直接返回队列中的第n项的数据。
这个程序如下:
ucharget_data(n)
{
change();
returnbuf[n];
}
3.2AD转换器
因为START为转换启动信号,在其上跳变时,所有内部寄存器清零,在其下调变时,开始进行AD转换。
所以设计程序时,要先让STAR■为0,在让START为1,最后让START为0。
开始采集数据后就要让OE为1,进行数据输入。
同时数据采集结束时,利用查询语句,查看EOC是否为1,如果是1,则处于等待状态,如果变成1,则可以进行数据输入了。
AD转换的程序如下:
START=0;
START=1;
START=0;
while(EOC==0);
OE=1;
a=P0;
这里a是一个变量,用来存储AD输入的数据
3.3滤波算法的选择
我在电路上采用的是开关控制选择,所以这里只需要一系列的if选择语句就可以完成率把算法的选择。
程序如下:
if(con==0)
{if((con1==0)&&(con2==0)&&(con3==0))
res=filter1();
if((con1==0)&&(con2==0)&&(con3==1))
res=filter2();
if((con1==1)&&(con2==0)&&(con3==0))
res=filter5();
if((con1==1)&&(con2==0)&&(con3==1))
res=filter6();
if((con1==1)&&(con2==1)&&(con3==1))
res=filter8();
}
else
res=a;
con用来控制是否要进行
con1、con2、con3三位用来控制滤波算法的选择,
滤波。
3.4总体程序
总体程序见附录。
3.5程序流程图
4仿真结果和分析
输入波形与未经滤波器滤波波形如下:
图5输入波形与未经滤波器滤波波形
以下几幅图是经滤波后的波形(蓝色的波):
图6经限幅滤波后的波形
图7经中值滤波后的波形
@1
L
-
W
iintrfB
30
i
AW
NN
匡
ClnnieiO
C1141B1AIC
tMNTT
PottfSon
图8经滑动平均滤波后的波形
图9经中位值平均滤波后的波形
罩Lt*lOicillo'icep*
ChiinnNHCtMfNNiD
LE
FJ-L
Scum
图10经加权递推平均滤波后的波形
限幅滤波的效果是和A值有关的,一般情况下,A值越小,则代表允许的噪声要越小,限幅滤波很适用于使幅值突变的噪声。
中值滤波由于要求中值,所用到的排序算法会大大消耗时间,因此延时比较严重,但是总的来说选择排序比冒泡排序的延时情况要好。
中位值平均滤波,由于滤波算法中会求平均值在,所以在原波是方波时会出现某一次求平均后编程中间值,另外由于和中值滤波一样要进行排序,因此也会产生很大的延时。
加权递推平均算法和上面一样,因为会求平均值,因此也会有时候产生中间值,但是如果把当前值得权值设的很大,而越久远之前的权值设的越小,则可明显改善此问题,另外由于加权递推平均滤波中用到的乘法,因此会有一定的延时。
5心得与体会
这次整个课程设计通过了软件和硬件上的调试。
我想这对于自己以后的学习和工作都会有很大的帮助。
在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。
对于数字滤波系统,其程序不是很难的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。
因此在整个设计过程中大部分时间是用在程序上面的。
很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对系统的结构很熟悉。
因此可以说系统的设计是软件和硬件的结合,二者是密不可分的。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
其次,这次课程设计让我充分认识到要学会借鉴别人的思想的重要性,很多时候你做的东西别人也许已经做出来了,我们可以直接拿来用。
虽然这不好,又偷懒的嫌疑,但是这却加快了效率,而且,以后再研究中也要实时关注新的东西,如果你花了很多时间和精力做的东西,已经早有人做了,这就很得不偿失了。
俗话说“三人行必有我师”嘛,更何况是这么多人的思想,这也是一种学习的方法。
另外在课程设计的过程中,当我们碰到不明白的问题时,指导老师总是耐心的讲解,给我们的设计以极大的帮助,使我们获益匪浅。
因此非常感谢老师的教导。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
我觉得作为一名软件工程专业的学生,这次课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我伤透了脑筋。
程序接线什么的都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。
参考书毕竟只是一个参考,设计这种东西最后还是要靠自己动脑筋。
然后我从平时做的实验、老师上课的举例、书本上的知识以及老师的辅导和其他同学的帮助下终于完成了。
虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。
我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
小组人员的配合、相处,以及自身的动脑和努力,都是以后工作中需要的。
所以我认为这次的课程设计意义很深,和其他4位同学的共同学习、配合、努力的过程也很愉快,另外还要感谢老师的耐心辅导。
参考文献
[1]李群芳.单片微型计算机与接口技术.电子工业出版社.2007
[2]彭冬明.单片机实验教程.北京理工大学出版社.2007
[3]何立民.单片机应用技术选编.北京航空航天大学出版社.2000
[4]余发山.单片机原理及及应用技术.中国矿业大学出版社.2003
[5]周航慈.单片机程序设计基础.北京航空航天大学出版社.2001附录:
总体程序如下:
#include#include#defineucharunsignedchar#defineA0.005
#defineN11
sbitcon1
=P2A3;
sbitcon2
=P2A4;
sbitcon3
=P2A5;
sbitcon=
P2A6;
sbitOE=P2P;
sbitSTART=P2A1;
sbitEOC
=P2A2;
uchara;
ucharbuf[N]={0};
voidchange()
{
inti;
for(i=0;ibuf[i]=buf[i+1];
buf[N-1]=a;
}
ucharget_data(n)
{
change();
returnbuf[n];
}
//限幅滤波
ucharfilter1()
{
ucharnew_value,value;
value=get_data(N-2);
new_value=get_data(N-1);
if((new_value-value>A)||(value-new_value>A))returnvalue;
returnnew_value;
//中值滤波
ucharfilter2()
ucharvalue_buff[N],temp;
//
定义存储数据的数组
获取数据
intcount,i,j,k;
for(count=0;countvalue_buff[count]=get_data(count);
{k=j;
for(j=i+1;j{temp=value_buff[k];
value_buff[k]=value_buff[i];
value_buff[i]=temp;
returnvalue_buff[(N-1)/2];
//滑动平均滤波
ucharfilter5()
{
ucharvalue_buff[N];
inti=0;
intcount;
intsum=0;
value_buff[i++]=get_data(count);if(i==N)
i=0;
for(count=0;countsum+=value_buff[count];
return(uchar)(sum/N);
}
//中位值平均滤波
ucharfilter6()
{
ucharcount,i,j,temp;
ucharvalue_buf[N];
intsum=0;
for(count=0;count}
for(j=0;j{
for(i=0;i{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}for(count=1;countreturn(uchar)(sum/(N-2));
}
//加权递推平均滤波
ucharfilter8()
{
ucharcodecoe[N]={1,1,1,2,2,2,3,3,3,3,1100};
ucharcodesum_coe=1+1+1+2+2+2+3+3+3+3+1100;
ucharcount;
ucharvalue_buf[N];
intsum=0;
for(count=0;count{
value