《基于数字滤波的单片机仿真和C语言开发精品资料.doc》由会员分享,可在线阅读,更多相关《基于数字滤波的单片机仿真和C语言开发精品资料.doc(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程设计任务书学生姓名: 周国阳 专业班级: 电信1001 指导教师: 阮军 工作单位: 信息工程学院 题 目: 基于数字滤波的单片机仿真和C语言开发 初始条件:本课程设计,要求用使用Proteus仿真软件进行系统设计与仿真。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、课程设计工作量:1周内完成对系统的设计、仿真。2、技术要求:1)设计一种数字滤波器,比如:中值滤波算法、算术平均滤波算法、加权平均滤波算法、滑动平均滤波算法等,自行设计输入信号的形式(了解各种GENERATORS的使用)。要求进行电路仿真实验,并使用C语言进行程序的开发。 2)要求学生
2、主动思考,自主发挥,实现系统的特色功能。3、查阅至少5篇参考文献。按武汉理工大学课程设计工作规范要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规范。提交报告的主要内容:(使用Proteus 7.5 sp3)1) 题目2) 仿真所完成的主要功能和特色简介摘要(特别是自己扩展的功能,根据特色功能评优)3) Proteus仿真的基本流程4) 所使用芯片以及引脚功能简介(需要提供对应芯片DataSheet的下载链接)5) 设计方案与工作原理,给出仿真电路图6) 实验记录与结果分析时间安排:1) 第1天, 查阅相关资料,学习设计原理。2) 第23天, 方案选择和电路设计仿真。3) 第4天, 设计说
3、明书撰写。4) 第5天, 上交报告,同时进行答辩。 指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录摘要IAbstractII1. 开发环境11.1仿真工具11.2编程工具12硬件模块22.1 MCS-51单片机22.2 AD转换器22.3 DA转换器23.数字滤波器的算法33.1中值滤波器设计33.2加权平均滤波33.3限幅滤波43.4 滑动平均滤波44.系统的设计54.1系统框图65.系统电路图76.仿真结果97.系统分析118.总结12参考文献13附录一 程序代码14武汉理工大学能力拓展训练课程设计说明书摘要本次项目是要我们利用51单片机设计出几种数字滤波器。随着现在
4、对滤波器的要求越来越高,模拟滤波器已经不能满足工业的要求。在这种情况下,数字滤波器得到了很大的发展。数字滤波器的实现过程的实现过程是把输入的模拟信号数字化,也就是由采样器对输入的模拟信号进行周期性的采样,并对每个样本进行量化和编码,即模数转换。从ADC输出的数字信号送入到数字信号处理器进行处理变化,处理器输出的数字信号再通过数模转换为模拟信号,这个过程要用到DAC来转换实现模拟信号的输出。关键字:51单片机;数字滤波器;ADC;DACAbstract The project is for us to take advantage of 51 single design several digi
5、tal filters. With the filter now increasingly demanding, analog filters can not meet the industry requirements. In this case, the digital filter has been greatly developed. Realization of the process of realization of a digital filter to the analog input signal is digitized, that is sampled by the a
6、nalog input signal is periodically sampled and each sample is quantized and coded, i.e., analog to digital conversion. ADC output digital signal is fed to the digital signal processor for processing the change, and then outputs the digital signal processor is converted to analog by digital to analog
7、 signals, to use this process to convert the DAC output analog signal.Keywords: 51 single; digital filter; ADC; DACII武汉理工大学能力拓展训练课程设计说明书1. 开发环境1.1仿真工具我们这次在进行硬件仿真时运用的proteus工具,它具有以下功能:(1)能实现单片机仿真和SPICE电路仿真的结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真等功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号
8、发生器等。(2)支持主流单片机系统的仿真。目前支持的单片机类型有68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。(3)提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。(4)具有强大的原理图绘制功能。1.2编程工具 Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
9、Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。 掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。2硬件模块2.1 MCS-51单片机51单片机内包含下列几个部件:一个8位CPU;一个片内振荡器及时钟电路;4KB ROM程序存储器;128B RAM数据
10、存储器;可寻址64KB外部数据存储器和64KB外部程序存储器空间的控制电路;32条可编程的I/O线(4个8位并行I/O端口);两个16位的定时/计数器;5个中断源、两个优先级嵌套中断结构。2.2 AD转换器本次课程设计仿真使用的是ADC0808,ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。ADC0808是CMOS
11、单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。2.3 DA转换器 DAC0832引脚功能电路应用原理图DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。D/A转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接。3.数字滤波器的算
12、法3.1中值滤波器设计中值滤波是先对某一参数连续采样N次(一般N取奇数),然后把N次采样值按从小到大排列,取中间值为本次采样值。该滤波方法实际上是一种排序方法,我在此采用的是冒泡法排序。由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,
13、y)=medf(x-k,y-l),(k,lW) ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。中值滤波能有效地克服偶然因素引起的波动或采样器不稳定引起的误码等脉冲干扰。对温度、液位等缓慢变化的被测参数采用此算法能收到良好的滤波效果,但对于流量、压力等快速变化的数据,不宜采用中位值滤波。3.2加权平均滤波在算术平均滤波和移动平均滤波中,N次采样值在输出结果中的权重是均等的,取1/N。用这样的滤波算法,对于时变信号会引入滞后,N值越大,滞后越严重。为了增加新采样数据在移动平均中的权重,以提
14、高系统对当前采样值中所受干扰的灵敏度,可采用加权平均滤波,它是移动平均滤波算法的改进。加权平均滤波是对连续N次采样值分别乘上不同的加权系统之后再求累加和,加权系统一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的辨识。各个加权系统均为小于1的小数,且满足总和等于1的约束条件。这样,加权运算之后的累加和即为有效采样值。为方便计算,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后便是有效采样值。3.3限幅滤波限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值
15、Y比较,如果两次采样值的差值超过了允许的最大偏差值Y,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除。剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效。可用如下公式表示:|Yn-Yn-1|Y;则Yn有效|Yn-Yn-1|Y;则Yn-1有效。3.4 滑动平均滤波把连续取N个采样值看成一个队列,队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=412;温度,N=14。对周期性干扰有良好的抑制作用,平滑度
16、高适用于高频振荡的系统。4.系统的设计在我们这个项目中要求我们选取其中的一种数字滤波器来设计,但在做的过程中我们发现这些数字滤波器在我们学习MATLAB时很多都是接触过的,它们的算法都可以找到。所以我在做项目时把四种方式都加上去了,我们可以根据实际的波形灵活选择滤波器的方式。在一开始输入的波形是模拟波形,我们要把它转换成数字波形,这样我们才能用数字滤波的方法对它进行滤波,所以我们用到了AD转换器。当使用算法进行滤波后,现在的波是数字方式存在,我们要输出它,要以模拟波形的方式输出,所以我们用到了DA转换器。在选择波形的时候,在这里我们选择了在键盘。键盘中按键数量较多时,为了减少I/O口的占用,通
17、常将按键排列成矩阵形式。式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。4.1系统框图开始 待键盘信号系统初始化选择K1AD采样量化是 中值滤波单片机处理否选择K2是DA转换输出 加权平均滤波否选择K3 是结束限幅滤波否选择K4 是 滑动平均滤波 否图1 程序框图5.系统电路图图2系统电路图 我们在做个项目时在控制部分我们用的是51系列单片机AT89C51,利用这个单片机进行编程,实现对输入信
18、号的滤波。我使用了P0口作为接受AD转换的结果的端口,而P1口则输出数据到DA转换器。另外还利用了P2作为控制端口,P2.0-P2.2用来控制AD转换器,而P2.3-P2.6外接四个开关,用来实现滤波方式的选择。在采集波形电路部分,ADC0809是带地址锁存的模数转换器件,ADDA、ADDB、ADDC为模拟通道选择,编码为000111分别选中IN0IN7。ALE为地址锁存信号,其上升沿锁存ADDA、ADDB、ADDC的信号,译码后控制模拟开关,接通八路模拟输入中相应的一路。CLK为输入时钟,为AD转换器提供转换的时钟信号,典型工作频率为640KHz。START为AD转换启动信号,正脉冲启动AD
19、DAADDC选中的一路模拟信号开始转换。OE为输出允许信号,高电平时候打开三态输出缓存器,是转换后的数字量从D0D7输出。EOC为转换结束信号,启动转换后EOC变为低电平,转换完成后EOC编程高电平。在数模转换电路中,我用了DA0832来进行数模转换。DA0832有三种数模转换方法,直通方式、单缓冲方式、双缓冲方式,因为单片机输出后可以直接进行数模转换,所以这里我采用了不需要单片机控制的最为简单的直通方式,但是DA0832若用于直通方式。若用于直通方式下,则GND均接地,而VCC和ILE则接正电源。VREF是参考电源。IOUT1、IOUT2是两个输出端。DA0832输出的是电流,要利用运算放大
20、器转换成电压信号。在电路的供电部分,由于此次系统的芯片工作电压为+5v,所以用常用的三端稳压器LM317和LM337构成的电源系统供电,其中ADC0809要提供一个准确的参考电源才能正常的工作,而LM317正好能够达到要求。6.仿真结果限幅滤波波形图中值滤波波形图加权平均滤波波形图滑动平均滤波波形图7.系统分析通过仿真我们发现,系统中所设计出的四种滤波器滤波方法基本上都能够得到了实现。限幅滤波的效果是和A值有关的,一般情况下,A值越小,则代表允许的噪声要越小,限幅滤波很适用于使幅值突变的噪声。中值滤波由于要求中值,所用到的排序算法会大大消耗时间,因此延时比较严重,但是总的来说选择排序比冒泡排序
21、的延时情况要好。加权递推平均算法和上面一样,因为会求平均值,因此也会有时候产生中间值,但是如果把当前值得权值设的很大,而越久远之前的权值设的越小,则可明显改善此问题,另外由于加权递推平均滤波中用到的乘法,因此会有一定的延时。8.总结参考文献1. 李全利,单片机原理及接口技术, 北京:高等教育出版社,2004 2. 张毅刚,单片机原理及应用,北京:高等教育出版社,20073. 徐仁贵,微型计算机接口技术及应用,北京:机械工业出版社,2007 4. 诸昌钤,单片机原理,成都:电子科技大学出版社,2004 5. 梅开乡,数字逻辑电路,北京:电子工业出版社,2003附录一 程序代码#include #
22、define uchar unsigned char#define A 0.005#define N 11sbit OE = P20;sbit START = P21;sbit EOC = P22;sbit key1=P10;sbit key2=P11;sbit key3=P16;sbit key4=P17;uchar a,z1,z2,z3,z4;ucharbufN =0;void change()int i;for(i=0;iN-1;i+)bufi=bufi+1;bufN-1=a;ucharget_data(n)change();returnbufn;ucharKeyscan(void) /
23、判断按键P1=0x3f;if(key1=0) /行扫描z1=1,z2=0;if(key2=0)z2=1,z1=0;if(z1=1) /列扫描 P1=0xfc;if(key4=0)z3=1;if(key3=0)z3=2;if(z2=1)P1=0xfc;if(key4=0)z3=3;if(key3=0)z3=4;return z3; uchar filter1()/中值滤波ucharvalue_buffN,temp; intcount,j,k;for(count=0;countN;count+) value_buffcount=get_data(count);for(j=0;jN-1;j+) k=
24、j;for(j=j+1;jN;j+)if(value_buffj A ) | ( value - new_value A ) )return value; returnnew_value; uchar filter3() /滑动平均滤波ucharvalue_buffN;int i=0;int count;int sum=0;value_buffi+=get_data(count);if(i=N) i=0;for(count=0;countN;count+)sum+=value_buffcount;return (uchar)(sum/N);uchar filter4() /加权平均滤波ucha
25、r code coeN = 1,1,1,2,2,2,3,3,3,3,1100; uchar code sum_coe = 1+1+1+2+2+2+3+3+3+3+1100; uchar count; ucharvalue_bufN; int sum=0; for (count=0;countN;count+) value_bufcount = get_data(count); for (count=0;countN;count+) sum += value_bufcount*coecount; return (uchar)(sum/sum_coe); uchar ADC0808_READ(vo
26、id)uchar res; START = 0; START = 1; START = 0;while(EOC=0); OE = 1; a = P0; z4=Keyscan();if(z4=1)res=filter1();if(z4=2)res=filter2();if(z4=3)res=filter3();if(z4=4)res=filter4();return res; void main()z3=1;while(1) P3 = ADC0808_READ(); 附录资料:不需要的可以自行删除SHA算法的实现C语言程序:#include #include /定义vector数组 #inclu
27、de /记录消息using namespace std; const int NUM = 8; /一个字由32比特(或者8个16进制数)const int BIT = 512; /消息认证码要以512比特一组 /字常量 string H0 = 67452301; string H1 = EFCDAB89; string H2 = 98BADCFE; string H3 = 10325476; string H4 = C3D2E1F0; /定义SHA1(安全哈希算法)类 class SHA1 public: /将一个字符串形式的字转化为vector数组 vector hex_into_dec(s
28、tring word); /将vector转化为string字符串形式 string num_into_message(vector A); /两个字X和Y的逻辑和 vector word_AND(vector A,vector B); /两个字X和Y的逻辑或 vector word_OR(vector A,vector B); /两个字X和Y的逻辑异或 vector word_XOR(vector A,vector B); /两个字X和Y的逻辑补 vector word_COMPLEMENT(vector A); /两个字X和Y的摸232整数加 vector word_ADD(vector
29、A,vector B); /将字X循环左移s个位置 vector ROTL(vector A,int s); /SHA-1的填充方案,我们设定msg由ASCII码组成 vectorvector SHA_1_PAD(string msg); /将SHA-1压成以字为单位 vectorvectorvector compress(vectorvector result); /定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出 vector Ft(int t,vector B,vector C,vector D); /定义字常数K vector K(int t); /开始进行
30、SHA-1(安全Hash算法)的加密 vectorvector SHA_1(string msg); ; /将vector转化为string字符串形式 string SHA1:num_into_message(vector A) int i; string msg = ; for(i = 0;i = 0 & Ai = 10 & Ai = 15) msg += A + (Ai - 10); return msg; /将一个字符串形式的字转化为vector数组 vector SHA1:hex_into_dec(string word) int i; vector result(NUM,0); fo
31、r(i = 0;i = 0 & wordi = A & wordi = F) resulti = 10 + wordi - A; return result; /两个字X和Y的逻辑和 vector SHA1:word_AND(vector A,vector B) vector result(NUM,0); int i; for(i = 0;i NUM;i+) resulti = Ai & Bi; return result; /两个字X和Y的逻辑或 vector SHA1:word_OR(vector A,vector B) vector result(NUM,0); int i; for(i
32、 = 0;i NUM;i+) resulti = Ai | Bi; return result; /两个字X和Y的逻辑异或 vector SHA1:word_XOR(vector A,vector B) vector result(NUM,0); int i; for(i = 0;i NUM;i+) resulti = Ai Bi; return result; /两个字X和Y的逻辑补 vector SHA1:word_COMPLEMENT(vector A) vector result(NUM,0); int i; for(i = 0;i NUM;i+) resulti = 15 - Ai;
33、 return result; /两个字X和Y的摸232整数加 vector SHA1:word_ADD(vector A,vector B) vector result(NUM,0); int i; for(i = NUM - 1;i = 0;i-) resulti = Ai + Bi; if(i != 0) int temp = resulti / 16; resulti-1 += temp; resulti %= 16; return result; /将字X循环左移s个位置 vector SHA1:ROTL(vector A,int s) vector result = A; vect
34、or temp(NUM,0); int i,j; for(i = 0;i = 0;j-) if(resultj / 8 = 1) tempj = 1; resultj = 1; resultj %= 16; if(j NUM - 1) resultj += tempj + 1; else if(resultj / 8 = 0) tempj = 0; resultj = 1; resultj %= 16; resultNUM - 1 += temp0; return result; /SHA-1的填充方案,我们设定msg由ASCII码组成 vectorvector SHA1:SHA_1_PAD(
35、string msg) int len = msg.length(); int bit_num = len * 8; int i,j; int num,lest = bit_num % 512; if(lest != 0) /看消息长度是否超过512字节,我们需要将它补成512的倍数 num = bit_num / 512 + 1; else num = bit_num / 512; /首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素 vectorvector result; result.resize(num); for(i = 0;i num;i+) resulti.resize(64); for(i = 0;i num;i+) for(j = 0;j 64 & i * 64 + j len;j+) resultij = msgi * 64 + j; /下面开始为未够512比特的消息分组进行补长度操作 if(lest != 0) int x = num - 1,last_len = lest / 8; resultxlast_len = 128; /先补一个1 for(i = last_len + 1;i = 56) resultxj = last_l % 128; last_l /= 128; j-
限制150内