1、9.5 MC68HC908GP32 MCU A/D转换编程实例本节给出的A/D转换程序,包含了中值滤波与平均值滤波的复合滤波方式,不含软件滤波的A/D转换程序很少能够实际应用的。本程序中的中值滤波,就是对三次采样值比较大小,取中间的一个。所谓平均值滤波,就是N个采样值求平均。而中值滤波与平均值滤波的复合滤波方式,就是先进行中值滤波,再进行平均值滤波。9.5.1 A/D转换汇编语言编程实例(1)A/D转换有关子程序ADsub.ASM*-*文件描述:本文件包含了A/D转换的3子程序,分别为: * *(1)advalue:获取1路A/D转换结果 *(2)admid:获取中值滤波后的A/D转换结果 *
2、(3)adave:获取均值滤波后的A/D转换结果 *-嵌入式应用技术基础教程-*/*相关位定义COCOBit EQU 7 ;转换完成标志位*advalue:1路A/D转换子程序-*功能描述:对某通道进行A/D转换,结果放入A *入 口:A=通道号 *出 口:A=该通道的A/D转换结果 *堆栈深度:2+1=3 *-*/ advalue: AIS #-!1 AND #%00011111 STA !1,SP ;暂存通道号 ;选取通道ADCH4-ADCH0=00000-00111 LDA ADSCR AND #%11100000 ORA !1,SP STA ADSCR BRCLR COCOBit,AD
3、SCR,* ;取A/D转换结果 LDA ADR AIS #!1 RTS *admid:1路A/D转换子程序(中值滤波)-*功能描述:对某通道进行三次采样,中值滤波结果放入A *入 口:A=通道号 *出 口:A=该通道中值滤波后的A/D转换结果 *堆栈深度:2+5=7 *-*/ admid: PSHX ;保护X AIS #-!4 ;在堆栈区开辟临时变量 STA $4,SP ;暂存通道号 ;取三次A/D转换结果 LDA $4,SP JSR advalue STA !1,SP LDA $4,SP JSR advalue STA !2,SP LDA $4,SP JSR advalue STA !3,S
4、P ;从三次A/D转换结果中取中值 ;取出堆栈前2个数比较,小的放在(SP+1),大的放在(SP+2) LDA !1,SP CMP !2,SP BLS admid1 ;若(SP+1)(SP+2),转admid2 CMP !1,SP ;否则与(SP+1)比较 BHI admid3 LDA !1,SP BRA admid_Exitadmid2:LDA !2,SP BRA admid_Exitadmid3:LDA !3,SPadmid_Exit AIS #!4 ;释放临时变量 PULX ;恢复X RTS*adave:1路A/D转换子程序(均值滤波)-*功能描述:求某通道X次均值滤波结果,并放入A中
5、*入 口:A=通道号 X=平均次数(1-255) *出 口:A=该通道中值滤波后的A/D转换结果 *堆栈深度:2+5=7 *-*/ adave:AIS #-!4 ;在堆栈区开辟临时变量 STX !4,SP ;暂存平均次数 STA !3,SP ;暂存通道号 LDA #!0 ;初始化X次和值 STA !2,SP STA !1,SP ;求X次的和adave_1:LDA !3,SP ;取通道号 JSR admid ADD !1,SP ;相加 STA !1,SP CLRA ADC !2,SP STA !2,SP DBNZX adave_1 ;求平均值 LDA !2,SP ;高位-H PSHA PULH
6、LDA !1,SP ;低位-A LDX !4,SP ;除数-X DIV ;(H:A)/X-A 忽略余数 AIS #!4 ;释放临时变量 RTS(2)A/D转换测试程序汇编主程序实例编号:A04 路径:ASMA04_ AD模数转换实验 (AD.ASM)*-*文 件 名:AD.ASM *硬件连接:PTB0/AD0 接模拟量输入端 *程序描述:获取1路A/D转换结果,并滤波,通过串口发送出去 *目 的:掌握AD转换的基本编程方法 *注 意:用SD-1实验板测试时,把液晶拔出,否则可能影响结果 *-嵌入式应用技术基础教程教学实例-*头文件$include GP32ASM.H*=*主程序 org $80
7、00 ;程序起始地址MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI LDHX #$023F ;堆栈初始化 TXSJSR GP32Init ;调系统初始化子程序GP32InitJSR SCIInit ;调串行口初始化子程序SCIInit;A/D初始化,用内部总线时钟,2分频LDA #%00110000STA ADCLKMainLoop:LDA #$00 ;采集通道0,并求20次的平均值LDX #!20JSR adave ;调A/D转换均值滤波子程序 JSR SCISend1 ;串口发送转换结果 BRA MainLoop *外部子程序存放处,这些子程序都在当前目录中$INCLU
8、DE ADsub.asm$INCLUDE H08SCI.asm $INCLUDE GP32init.asm $INCLUDE SCIInit.asm*中断向量 ORG $FFFE ;复位矢量 DW MainInit9.5.2 A/D转换08C语言编程实例(1)A/D转换有关C语言子函数ADsub.c/*-*文件描述:本文件包含了A/D转换的3个子函数,分别为: *(1)advalue:获取1路A/D转换结果 * unsigned char advalue(unsigned char channel) *(2)admid:获取中值滤波后的A/D转换结果 * unsigned char admid
9、(unsigned char channel) *(3)adave:获取均值滤波后的A/D转换结果 * unsigned char adave(unsigned char n, unsigned char channel) *-嵌入式应用技术基础教程-*/以下为子程序源代码/包含头文件#include GP32C.H#define COCOBit 7 /转换完成标志位/*advalue:1路A/D转换函数-*功能:获取通道channel的A/D转换结果 *参数:channel=通道号 *返回:该通道的A/D转换结果 *-*/unsigned char advalue(unsigned char
10、 channel)/选取通道号ADCH4-ADCH0=00000-00111unsigned char tmp;channel&=0b00011111;tmp=ADSCR&0b11100000;tmp=tmp|channel;ADSCR=tmp;/取A/D转换结果while(1)if(ADSCR&(1j) tmp=i; i=j; j=tmp; if (k=j)tmp=j;elseif (k=i) tmp=k;else tmp=i;return tmp;/*adave:1路A/D转换函数(均值滤波)-*功能:对通道channel的A/D转换结果求n次平均值 *参数:n=平均次数,channel=
11、通道号 *返回:该通道均值滤波后的A/D转换结果 *-*/unsigned char adave(unsigned char n,unsigned char channel)/求n次A/D转换的平均值unsigned char i;unsigned int j;j=0;for (i=0;in;i+)j+=admid(channel);j=j/n;return (unsigned char)j;(2)A/D转换08C测试实例主函数实例编号:C04 路径:CC04_AD模数转换实验 (AD.prj)/*-*工 程 名:AD.prj *硬件连接:PTB0/AD0 接模拟量输入端 *程序描述:获取1路
12、A/D转换结果,并滤波,通过串口发送出去 *目 的:掌握AD转换的基本编程方法 *注 意:用SD-1实验板测试时,把液晶拔出,否则可能影响结果*-嵌入式应用技术基础教程教学实例-*/*头文件*/#include GP32C.H/*函数声明*/extern void SCIInit(void); /串行口函数声明extern void SCISend1(unsigned char o);/有关A/D转换函数声明extern unsigned char adave(unsigned char n,unsigned char channel);extern unsigned char advalue(unsigned char channel);extern unsigned char admid(unsigned char channel);/*主程序*/void main(void)SCIInit(); /串行口初始化ADCLK=0b00110000; /A/D用内部总线时钟,2分频while(1)SCISend1(adave(20,0); /采集、滤波并发送