基于数字滤波的单片机仿真和C语言开发.docx
《基于数字滤波的单片机仿真和C语言开发.docx》由会员分享,可在线阅读,更多相关《基于数字滤波的单片机仿真和C语言开发.docx(23页珍藏版)》请在冰豆网上搜索。
基于数字滤波的单片机仿真和C语言开发
目录
1软件介绍1
1.1protues软件介绍1
1.2Keil软件2
2主要元器件介绍3
2.151单片机相关知识3
2.2ADC0808相关知识5
2.3DAC0832相关知识5
3数字滤波器设计原理及方法6
3.1中值滤波器设计原理计算法6
3.2AD转换电路8
3.3DA转换模块9
4创新拓展模块9
4.12*2矩阵键盘9
4.2增加的三类滤波器介绍11
5整体电路图设计12
6程序代码12
7仿真结果及分析17
7.1仿真波形图17
7.2结果分析19
8心得体会20
9参考文献21
1软件介绍
1.1protues软件介绍
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件.它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
(1)实现了单片机仿真和SPICE电路仿真相结合.具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等.
(2)支持主流单片机系统的仿真.目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片.
(3)提供软件调试功能.在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件.
(4)具有强大的原理图绘制功能.总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大.本章介绍ProteusISIS软件的工作环境和一些基本操作.
特点:
支持ARM7,PIC,AVR,HC11以及8051系列的微处理器CPU模型,更多模型正在开发中:
交互外设模型有LCD显示、RS232终端、通用键盘、开关、按钮、LED等;强大的调试功能,如访问寄存器与内存,设置断点和单步运行模式;支持如IAR、Keil和Hitech等开发工具的源码C和汇编的调试;一键“make”特性:
一个键完成编译与仿真操作;内置超过6000标准SPICE模型,完全兼容制造商提供的SPICE模型;DLL界面为应用提供特定的模式;基于工业标准的SPICE3F5混合模型电路仿真器.14种虚拟仪器:
示波器、逻辑分析仪、信号发生器、规程分析仪等.
1.2Keil软件
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用.Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起.运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统.如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍.KeilC51开发系统基本知识KeilC51开发系统基本知识
(1)系统概述
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面.另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解.在开发大型软件时更能体现高级语言的优势.下面详细介绍KeilC51开发系统各部分功能和使用.
(2)KeilC51单片机软件开发系统的整体结构
C51工具包的整体结构,uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程.开发人员可用IDE本身或其它编辑器编辑C或汇编源文件.也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS).ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中.
KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解.在开发大型软件时更能体现高级语言的优势.
2主要元器件介绍
2.151单片机相关知识
1.MCS-51单片机的结构及编程方法
MCS-51单片机的组成:
CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、I/O口(串口、并口)、内23部总线和中断系统等.组成框图如下:
8051单片机的组成框图
(1)cpu中央处理器
由运算器和控制器组成,是8位的cpu,具有布尔运算和8位寻址功能.运算器
完成算术运算和逻辑运算.CPU根据PC中的地址将欲执行指令的指令码从存储器中取出,存放在IR中,ID对IR中的指令码进行译码,定时控制逻辑在OSC配合下对ID译码后的信号进行分时,以产生执行本条指令所需的全部信号.
(2)
存储器
MCS-51单片机按程序存储器可分为内部无ROM
型(如8031)和内部有ROM型(如8051)两种,
连接时引脚有区别.程序存储器结构如右图所示:
程序存储器:
一般将只读存储器(ROM)用做程序
存储器.可寻址空间为64KB,用于存放用户程序、
数据和表格等信息.
数据存储器:
一般将随机存储器(RAM)用做数据存储器.可寻址空间为64KB.MCS-51数据存储器可分为片内和片外两部分.
(3)特殊功能寄存器(SFR)
MCS-51有21个特殊功能寄存器(也称为专用寄存器),包括算术运算寄存器、指针寄存器、I/O口锁存器、定时器/计数器、串行口、中断、状态、控制寄存器等,它们被离散地分布在内部RAM的80H~FFH地址单元中(不包括PC),共占据了128个存储单元,构成了SFR存储块.其字节地址可被8整除的SFR可位寻址.SFR反映了MCS-51单片机的运行状态.
80C51内部结构
(4)I/O接口
I/O接口是MCS-51单片机对外部实现控制和信息交换的必经之路,用于信息传送过程中的速度匹配和增加它的负载能力.8051内部有4个8位并行接口P0,P1,P2,P3,有1个全双工的可编程串行I/O接口.
(5)定时器/计数器
8051内部有两个16位可编程序的定时器/计数器,均为二进制加1计数器,分别命名为T0和T1.
(6)中断系统
8051可处理5个中断源(2个外部,3个内部)发出的中断请求,并可对其进行优先权处理.外部中断的请求信号可以从P3.2,P3.3引脚上输入,有电平或边沿两种触发方式;内部中断源有3个,2个定时器/计数器中断源和1个串行口中断源.8051的中断系统主要由中断允许控制器IE和中断优先级控制器IP等电路组成.
2.2ADC0808相关知识
本次课程设计仿真使用的是ADC0808,ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件.其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换.ADC0808是ADC0809的简化版本,功能基本相同.一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换.
ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器.
ADC0808引脚图
2.3DAC0832相关知识
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:
直通方式、单缓冲方式和双缓冲方式.主要性能如下:
(1)分辨率为8位;
(2)电流稳定时间1us;
(3)可单缓冲、双缓冲或直接数字输入;
(4)只需在满量程下调整其线性度;
(5)单一电源供电(+5V~+15V);
(6)低功耗,20mW.
DAC0832引脚功能电路应用原理图DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等).所以这个芯片的应用很广泛,关于DAC0832应用的一些重要资料见下图:
D/A转换结果采用电流形式输出.若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现.运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接.DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接.
DAC0832的逻辑框图和引脚排列
3数字滤波器设计原理及方法
3.1中值滤波器设计原理计算法
数字滤波方法有很多种,如中值滤波、算术平均滤波、加权平均滤波,限幅滤波等等.本次课程设计我选用的是中值滤波.
中值滤波是先对某一参数连续采样N次(一般N取奇数),然后把N次采样值按从小到大排列,取中间值为本次采样值.该滤波方法实际上是一种排序方法,我在此采用的是冒泡法排序.由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点.方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列.二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)},其中,f(x,y),g(x,y)分别为原始图像和处理后图像.W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等.
该算法的程序如下:
#defineN11 //N值可根据实际情况调整
charfilter()
{
charvalue_buf[];
charcount,i,j,k,temp;
for(count=0;count{
value_buf[count]=get_data();
delay();
}
for(j=0;i {k=j;
for(j=i+1;j if(value_buf[j] temp=value_buf[k];
value_buf[k]=value_buf[j];
value_buf[j]=temp;
}
returnvalue_buf[(N-1)/2];
}
中值滤波能有效地克服偶然因素引起的波动或采样器不稳定引起的误码等脉冲干扰.对温度、液位等缓慢变化的被测参数采用此算法能收到良好的滤波效果,但对于流量、压力等快速变化的数据,不宜采用中位值滤波.
3.2AD转换电路
ADC0808中,ADDA、ADDB、ADDC为模拟通道选择,编码为000~111分别选中IN0~IN7.ALE为地址锁存信号,其上升沿锁存ADDA、ADDB、ADDC的信号,译码后控制模拟开关,接通八路模拟输入中相应的一路.CLK为输入时钟,为AD转换器提供转换的时钟信号,典型工作频率为640KHz.OE为输出允许信号,高电平时候打开三态输出缓存器,是转换后的数字量从D0~D7输出.EOC为转换结束信号,启动转换后EOC变为低电平,转换完成后EOC编程高电平.START为AD转换启动信号,正脉冲启动ADDA~ADDC选中的一路模拟信号开始转换,在其上跳变时,所有内部寄存器清零,在其下跳变时,开始进行AD转换.所以设计程序时,要先让START为0,在让START为1,最后让START为0.
AD转换的程序如下:
START=0;
START=1;
START=0;
while(EOC==0);
OE=1;
a=P0;
AD转换电路图
3.3DA转换模块
DA0832有三种数模转换方法,直通方式、单缓冲方式、双缓冲方式,因为单片机输出后可以直接进行数模转换,所以这里我采用了不需要单片机控制的最为简单的直通方式,但是DA0832若用于直通方式.若用于直通方式下,则GND均接地,而VCC和ILE则接正电源.VREF是参考电源.IOUT1、IOUT2是两个输出端.DA0832输出的是电流,要利用运算放大器转换成电压信号.
DA转换电路图
4创新拓展模块
本次课设拓展模块设计了一个2*2矩阵键盘,通过矩阵键盘的控制达到中值、限幅、加权平均、滑动平均四种滤波器交替实现的目的.
4.12*2矩阵键盘
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式.式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显.由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的.
本次课设设计了一个2*2最简矩阵键盘.如下图所示:
2*2矩阵键盘
2*2矩阵键盘程序设计如下:
ucharKeyscan(void)//判断按键
{
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;
}
returnz3;
}
4.2增加的三类滤波器介绍
1.加权平均滤波
在算术平均滤波和移动平均滤波中,N次采样值在输出结果中的权重是均等的,取1/N.用这样的滤波算法,对于时变信号会引入滞后,N值越大,滞后越严重.为了增加新采样数据在移动平均中的权重,以提高系统对当前采样值中所受干扰的灵敏度,可采用加权平均滤波,它是移动平均滤波算法的改进.
加权平均滤波是对连续N次采样值分别乘上不同的加权系统之后再求累加和,加权系统一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的辨识.各个加权系统均为小于1的小数,且满足总和等于1的约束条件.这样,加权运算之后的累加和即为有效采样值.为方便计算,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后便是有效采样值.
2.限幅滤波
限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值ΔY比较,如果两次采样值的差值超过了允许的最大偏差值ΔY,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除.剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效.可用如下公式表示:
|Yn-Yn-1|≤ΔY;则Yn有效|Yn-Yn-1|>ΔY;则Yn-1有效.
3.滑动平均滤
把连续取N个采样值看成一个队列,队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:
流量,N=12;压力:
N=4;液面,N=4~12;温度,N=1~4.对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统.
5整体电路图设计
整体电路图
6程序代码
#include
#defineucharunsignedchar
#defineA0.005
#defineN11
sbitOE=P2^0;
sbitSTART=P2^1;
sbitEOC=P2^2;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^6;
sbitkey4=P1^7;
uchara,z1,z2,z3,z4;
ucharbuf[N]={0};
voidchange()
{
inti;
for(i=0;ibuf[i]=buf[i+1];
buf[N-1]=a;
}
ucharget_data(n)
{
change();
returnbuf[n];
}
ucharKeyscan(void)//判断按键
{
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;
}
returnz3;
}
ucharfilter1()//中值滤波
{
ucharvalue_buff[N],temp;
intcount,j,k;
for(count=0;countvalue_buff[count]=get_data(count);
for(j=0;j{k=j;
for(j=j+1;jif(value_buff[j]{temp=value_buff[k];
value_buff[k]=value_buff[j];
value_buff[j]=temp;
}}
returnvalue_buff[(N-1)/2];
}
ucharfilter2()//限幅滤波
{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;
}
ucharfilter3()//滑动平均滤波
{
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);
}
ucharfilter4()//加权平均滤波
{
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_buf[count]=get_data(count);
}
for(count=0;countsum+=value_buf[count]*coe[count];
return(uchar)(sum/sum_coe);}
ucharADC0808_READ(void)
{
ucharres;
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();
returnres;
}
voidmain()
{
z3=1;
while
(1)
{
P3=ADC0808_READ();
}
}
7仿真结果及分析
7.1仿真波形图
中值滤波波形图
限幅滤波波形图
滑动平均滤波波形图
加权平均滤波波形图
7.2结果分析
限幅滤波的效果是和A值有关的,一般情况下,A值越小,则代表允许的噪声要越小,限幅滤波很适用于使幅值突变的噪声.中值滤波由于要求中值,所用到的排序算法会大大消耗时间,因此延时比较严重,但是总的来说选择排序比冒泡排序的延时情况要好.加权递推平均算法和上面一样,因为会求平均值,因此也会有时候产生中间值,但是如果把当前值得权值设的很大,而越久远之前的权值设的越小,则可明显改善此问题,另外由于加权递推平均滤波中用到的乘法,因此会有一定的延时.
8心得体会
大三下学期了,马上就要进入大四,此次课设也是大学仅剩的几个课设之一了,我想通过自己的努力,好好做一下,好好锻炼自己的专业能力.作为一名电信专业的大三学生,我觉得这个单片机是十分有意义的,而且是十分必要的.在已度过的大学时间里,我们大多数接触的是专业课.我们在课堂上掌握的仅仅是专业课的理论知识,学习单片机和智能仪器已经有一年了,已经掌握了单片机的原理和如何用汇编语言编写程序,但是很少有机会取实践.如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计,就为我们提供了良好的实践平台,这样能使我们对单片机及其应用认识和应用更加熟练,为我们以后走向社会工作打下良好基础.
在做单片机课程设计的过程中,我感触最深的当属查阅大量的设计资料了.为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的.我们是在做一个符合要求的单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计.为了写好程序,完成任务需查阅很多的资料,首先要先搞懂原理,比如ADC0808是如何工作的,DAC0832又是如何工作的,只有搞懂这些才能更好的设计出一个完善的系统.
最后,要做好这个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;在设计过程中遇到问题是很正常的,但我们