文档库 最新最全的文档下载
当前位置:文档库 › 快速傅里叶变换程序设计

快速傅里叶变换程序设计

沈阳工程学院设计(论文)

- 0 - 目录

课程设计(论文)任务书 (Ⅰ)

课程设计(论文)成绩评定表 (Ⅲ)

中文摘要.................................................. ........VI 1设计任务描述.. (1)

1.1 设计题目 (1)

1.2 设计要求 (1)

1.2.1 设计目的 (1)

1.3 基本要求 (1)

2设计思路 (2)

3 软件流程图 (3)

4 快速傅里叶变换的实现 (4)

4.1 快速傅里叶变换介绍 (4)

4.2 快速傅里叶变换算法原理 (4)

4.3 基2FFT的蝶形运算流图 (5)

4.4时间抽取算法FFT的运算特点 (5)

4.4.1 原位运算 (6)

4.4.2 输入、输出的倒位序规律 (7)

4.4.3 蝶距的计算 (7)

4.4.4 旋转因子的计算 (7)

4.5 FFT算法的DSP实现方法 (7)

5 各部分程序设计及参数计算 (8)

5.1初始化部分 (8)

5.2主函数部分 (8)

5.3主程序部分 (9)

5.3.1 实现输入序列倒序 (9)

5.3.2 实现N点复数FFT运算 (10)

5.3.3 功率谱计算及波形实现 (10)

6小结 (13)

7致谢 ........................................................... .14 8参考文献 (15)

附录A1 程序清单 (16)

附录A2 程序图形 (19)

快速傅里叶变换程序设计

1 设计任务描述

1.1 设计题目

快速傅里叶变换程序设计

1.2设计要求

1.2.1 设计目的

1)理解FFT的算法以及利用DSP实现的方法。

2)能熟练的调试程序并能观察其结果。

3)熟悉TMS320C54x系列DSP芯片的软件设计方法。

1.3基本要求

1)研究FFT原理以及利用DSP实现的方法。

2)编写FFT程序。

3)调试程序,观察结果。

19

沈阳工程学院设计(论文)

2 设计思路

根据此次课程设计的要求,我们选择用C语言设计程序。我设计的快速傅里叶变换程序包括三大部分:初始化定义部分,主函数部分,子程序部分。其中子程序部分由四个功能函数组成:FFT初始化函数、计算功率谱函数、波形发生函数、倒序运算函数。四个函数在主函数需要时相应的进入运算操作中,实现一个完整的快速傅里叶变换。

初始化定义部分要根据每部分程序的需求定义相应的变量,这里重点要强调定义π值和采样点数。这里就需要我们熟悉前面知识所学到的各种基本数据类型的格式,如数组、结构、联合等构造类型数据。主函数部分要清晰的了解工作的顺序,明确应在何时调用子程序,何时进行输入输出。主函数部分是整个程序的框架,一进入程序,最先完成的就是主函数部分。子程序部分是程序的主要内容,尤其是FFT初始化函数,是整个程序的重点部分,快速傅里叶的变换部分主要由这部分完成。调用这部分时,需要提供的参数为FFT 运算点数、时域序列的时部和虚部。波形发生函数部分主要控制输入类型,在我的程序中,为了得到多类型的傅里叶变换程序,我设计了两种输入,即正弦波输入和方波输入。相对于合适的输入,也会有相应的功率谱输出,这部分由计算功率谱函数完成。在整个程序中,倒序运算函数是最大的难点,完成这部分需要对数字信号处理课程中的快速傅里叶变换的特点熟悉的掌握,这样才能知道倒序产生的原理,理清思路,利用C语言的字符语句达到倒序处理的目的。

最后应注意,由于在程序代码中调用了pow、log、cos、sin函数,该函数所在的C文件应包含头文件math.h。我们选择的是平时应用过的CCS软件调试该程序,所以熟悉CCS 软件的工作环境,了解工程文件建立方法、程序调试和运行方法也是我们需要注意的地方。

- 2 -

快速傅里叶变换程序设计

3 软件流程图

图3-1 128点实序列FFT运算程序流程图

19

沈阳工程学院设计(论文)

- 4 -

4快速傅里叶变换的实现

4.1快速傅里叶变换介绍

快速傅里叶变换(FFT )并不是一种新的变换,而是离散傅里叶变换(DFT )的一种快速算法。

由于有限长序列在其频域也可离散化为有限长序列(DFT ),因此离散傅里叶变换(DFT )在数字信号处理中是非常有用的。例如,在信号的频谱分析、 系统的分析、 设计和实现中都会用到DFT 的计算。 但是,在相当长的时间里, 由于DFT 的计算量太大,即使采用计算机也很难对问题进行实时处理,所以并没有得到真正的运用。直到1965年首次发现了DFT 运算的一种快速算法以后,情况才发生了根本的变化。人们开始认识到DFT 运算的一些内在规律,从而很快地发展和完善了一套高速有效的运算方法, 这就是现在人们普遍称之为快速傅里叶变换(FFT )的算法。 FFT 出现后使DFT 的运算大大简化,运算时间一般可缩短一二个数量级之多,从而使DFT 的运算在实际中真正得到了广泛的应用。

4.2 快速傅里叶变换算法原理

若给定由N 个信号样本{x (0),x (1),…,x (N -1)}组成的信号序列x (n ),DFT 可用式2-1给出:

1

0()()N n k N n X k x n W -==∑

k =0,1,…,N -1 (4-1)

式2-1中,n k N W 称为旋转因子或蝶形因子,n k N W =2/j nk N e π-。从中可以看出:当信号

样本为复数时,计算单个()X k 需经过N 次复数乘法和N -1次复数加法运算,相当于4N 次实数乘法和2(2N -1)次实数加法。完成全部N 点DFT 共需2N 次复数乘法和N (N -1)复数加法运算。可见,随着N 不断增加,整个DFT 运算量是相当庞大的,而FFT 算法通过对计算过程的深入分析,利用旋转因子n k N W 具有的周期性与对称性,实现了降低运算复杂

度的目的。

当序列长度N 为偶数时,信号序列x (n )可被分解为奇、偶两个子序列,相应的N 点DFT 被分解为两个N /2点的DFT :

()()()k

N X k G k W H k =+ k =0,1, …,N /2-1 (4-2)

(/2

)()(k N X N k G k W H k +=- k =0,1, …,N /2-1 (4-3)

快速傅里叶变换程序设计

19

式(2-2)和(2-3)中,G (k)和()H k 分别表示x (n )分解后得到的N /2点偶序列点奇序列的DFT 。式(2-2)和式(2-3)表明,只要求出G (k)和()H k ,x (n )前N /2点和后N /2点的DFT 就得到了,整个序列的DFT 也就得到了。这样做的好处是计算N 点DFT 只需要约2N /2次复数乘法,总运算量约为直接DFT 运算量的一半

同理,当N /2为偶数时,每个N /2点的DFT 又可被分解成两个N /4点的DFT ,进一步减少了DFT 运算的复杂度。依次类推,直到不能继续分解为止。分解结束时,最小DFT 的点数称为称为基数,当N =2L (L 为正整数)时,经过L -1次分解,N 点DFT 最终可被分解为N /2个两点的DFT ,即得到基数为2的FFT 运算,使得DFT 所需复数乘法次数降

至2(/2)log N N 。

4.3 基2FFT 的蝶形运算流图

基2FFT 的蝶形运算过程可用图2-1所示,此时N =8,L =2log N =3。

图4-1 8点基2FFT 运算过程

4.4 时间抽取算法FFT 的运算特点

快速傅立叶变换(FFT)算法基本上分为两大类:按时间抽取的FFT 运算和按频率抽取的FFT 运算。两者在算法的时间和空间复杂度上是一致的,只是序列在计算前后的排列有所不同。在本论文里,采用的是按时间抽取的FFT(DIT —FFT)算法。

沈阳工程学院设计(论文)

- 6 -

4.4.1 原位运算

当数据输入到存储器中以后,每一级运算的结果仍然存储在同一组存储器中,直到最后输出,中间无需其它存储器,这叫原位运算。

DIT —FFT 的运算就是原位计算,从图2-2可以看出这种运算是很有规律的,每级(每列)计算都是由N /2个蝶形运算构成的,每一个蝶形结构完成下述基本迭代运算

1111()()()()()()r m m m N r m m m N A i A i A j W A j A i A j W ----?=+??=-??

(4-4)

式中:m 表示第m 列迭代;,i j 则分别为该蝶形单元两个输入数据所在行数。式(4-4)的蝶形运算如图2-2 所示。

图4-2 按时间抽取算法基本蝶形运算单元

由前面介绍过的完整的DIT-FFT 运算流程图2-2可以看出,第m 级蝶形运算的输出数据仅与该级蝶形运算的输入数据有关,与前1m -级蝶形的输入数据无关,且第1m -级蝶形运算的输出数据为第m 级蝶形运算的输入数据。某任何一个蝶形运算的两个输入节点i 和

j 的节点变量进行蝶形运算后,

得到的结果为该蝶形运算两个输出节点,,i j 两节点的节点变量,而和其他节点变量无关,因而可以采用原位运算。

4.4.2 输入、输出序列的倒位序规律

由流程图2-1可以看出,当进行原位运算时,发现当运算完成后,FFT 的输出()X k 按自然顺序排列在存储单元中,即按(0)X ,(1)X ,…,(7)X 的顺序排列;但是这是输入()x n 却不是按自然顺序存储的,而是按(0)x ,(4)x ,…,(7)x 的顺序存入存储单元,这种方式 就称之为倒位序。

快速傅里叶变换程序设计

19

表4-1 码位倒置顺序 4.4.3 蝶距的计算

设N =2L ,则整个运算流图中包含L 级蝶形运算,每一级则有/2N 个蝶形单元。蝶距即每个蝶形单元两个输入(出)节点的序号差。以8N =为例,结合图2-1可知共包含3级蝶形运算,每一级蝶形单元的蝶距如下:第一级,蝶距为1,可以看作由11022-=得到:第二级,蝶距为2,可以看作由21122-=得到;第三级,蝶距为4,可以看作由31222-=得到。因此得:第m 级蝶形单元的蝶距为:12m -。

4.4.4 旋转因子的计算

由FFT 算法原理过程可知,若N =2L ,则共有L 级蝶形运算,各级蝶形运算中旋转因子分别如下:第L 级的旋转因子为r N W (r =0,1,…,/21N -);第L -1级的旋转因子为/2r N W (r =0,1,…,2/21N -);…;第一级的旋转因子为1

/2L r N W -(r =0,1,…,/21L N -)。由此可见, 第m 级蝶形运算中旋转因子为/2L M r N W -,r =0,1,…,1/21L M N -+-。

4.5 FFT 算法的DSP 实现方法

设FFT 运算的输入数据为实数,则2N 点实数FFT 算法的实现步骤为:第一步,把2N 实数输入序列组合成N 点的复数序列。然后把该复数序列进行位倒序操作后存储在输入区。第二步,进行N 的FFT 运算。第三步,把N 点FFT 输出拆成2N 的复数序列,这2N 的复数序列对应于2N 点时实数输入序列的DFT 输出。第四步,结果输出及功率谱计算。

沈阳工程学院设计(论文)

5 各部分程序设计及参数计算

5.1初始化部分

#include"math.h" ;数学函数头文件

#define PI 3.1415926

#define N 128 ;采样次数N

void InitForFFT(); ;FFT初始化函数

void MakeWave(); ;波形发生函数

void finv(int N1,float *xr,float *xi); ;倒序运算函数f(N1,Xr,Xi),对输

;入函数倒序

int INPUT[N],DA TA[N];

float fWaveR[N],fWaveI[N],w[N];

float sin_tab[N],cos_tab[N]; ;正余弦函数表

int Mum; ;Mum为蝶形运算的级数

在此段程序中设置了复数数据的个数为128,FFT运算的级数为7级,还设置了正弦表和余弦表。

5.2主函数部分

main()

{

int i;

InitForFFT(); ;FFT初始化函数

MakeWave(); ;波形发生函数

for(i=0;i

{

fWaveR[i]=INPUT[i];

fWaveI[i]=0.0;

w[i]=0.0;

}

Mum=(int)(0.5+log(N)/log(2)); ;Mum为蝶形运算的级数

- 8 -

快速傅里叶变换程序设计

FFT(fWaveR,fWaveI);

for(i=0;i

while(1);

}

5.3 子程序部分

5.3.1实现输入序列倒序

;倒序运算函数finv(N1,Xr,Xi),对输入序列倒序

;N1为序列长度,Xr[ ],Xi[ ]分别为输入序列的实部和虚部

;倒序原理:倒序数的加1是在最高位加1,满2向次高位进1,最高位变0,依次往下;从当前倒序值可求下一倒序值

void finv(int N1,float *xr,float *xi) ;倒序运算函数f(N1,Xr,Xi),对输入序列倒序{

int m,n,N2,k; ;m为正序数;n为倒序数;k为各个权值;N2

;为最高位权值

float T; ;临时变量T

N2=N1/2; ;最高位加1相当于十进制加上最高位的权N1/2

n=N2; ;第一个倒序值

for(m=1;m<=N1-2;m++) ;第0个和第一个不倒序

{

if(m

{

T=xr[m];xr[m]=xr[n];xr[n]=T;

T=xi[m];xi[m]=xi[n];xi[n]=T;

}

k=N2; ;最高位权值

while(n>=k)

{

n=n-k; ;次高位位1,继续上下进位,满2置0

k=(int)(k/2+0.5); ;向下权值依次比上级减半

}

n=n+k; ;得到下一倒序值

}

19

沈阳工程学院设计(论文)

}

5.3.2实现N点复数FFT运算

void FFT(float Xr[N],float Xi[N]) ;时间抽取法FFT程序,要求

;采样点数N为2的整数幂次方{ ;Xr[ ],Xi[ ]分别为输入序列的

;实部和虚部

int S,B; ;S为旋转因子的幂数,B为蝶

;形运算输入数据的距离,也即

;为各级旋转因子的个数int m,j,k;

float X,Y;

finv(N,Xr,Xi); ;倒序运算函数,对输入序列倒序for(m=1;m<=Mum;m++)

{

B=(int)(pow(2,m-1)+0.5); ;B=2^(m-1)

for(j=0;j

{

S=j*(int)(pow(2,Mum-m)+0.5);

for(k=j;k<=N-1;k+=(int)(pow(2,m)+0.5));每种蝶形运算在某一级中需要进

;行N/pow(2,m)次

{ ;蝶形运算展开,结果的实部和虚部分别

;存储在原实部和虚部位置

X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S];

Y=Xi[k+B]*cos_tab[S]-Xr[k+B]*sin_tab[S];

Xr[k+B]=Xr[k]-X;

Xi[k+B]=Xi[k]-Y;

Xr[k]=Xr[k]+X;

Xi[k]=Xi[k]+Y;

}

}

}

5.3.3功率谱计算及波形实现

对信号进行傅里叶变换,取sin部分为实部,cos部分为虚部,直接算实部和虚部的平

- 10 -

快速傅里叶变换程序设计

方和,得到的就是功率谱分布。功率信号的功率谱反应了信号功率随频率分布的特点,功率谱是信号先自相关再作FFT变换。在CCS下进行程序调试和结果显示为输入信号时域波形图、输入信号频域波形图和输出信号功率谱。三个图见附录。

程序如下即可实现计算功率谱:

for(m=0;m<=N/2;m++)

{

w[m]=sqrt(Xr[m]*Xr[m]+Xi[m]*Xi[m]);

}

在生成波形时,首先要建立正余弦函数表,然后继续选择输入的波形,最后进行波形发生。在我们的程序中,为了使功率谱的效果更加明显,我们不仅保留了书中提出的正弦波输入,还自己添加了方波输入。具体程序分别如下:

void InitForFFT()

{

int i;

for(i=0;i

{

sin_tab[i]=sin(PI*2*i/N);

cos_tab[i]=cos(PI*2*i/N);

}

}

正弦波输入

void MakeWave()

{

int i;

f or(i=0;i

{

INPUT[i]=sin(PI*2*i/N*3)*1024;

}

}

方波输入

void MakeWave()

{

int i;int j;int l;

for(i=0;i

{

19

沈阳工程学院设计(论文)j=(int)i/20;

l=j%2;

if(l==0)INPUT[i]=1024;

else INPUT[i]=0;

}

}

- 12 -

快速傅里叶变换程序设计

小结

本次课设历时一周,主要是要我们研究FFT原理以及利用DSP实现的方法。FFT原理,即快速傅里叶变换原理,使我们在大三上学期主修的《数字信号处理》一课中学习到的,而DSP编程是我们在本学期学习到的一门相当重要的专业课程。我们本周的任务不仅需要熟练以往知识,还需要利用新的编程知识将其反映在所编程序中。DSP课程在很大一部分上类似于以前我们学习过的单片机,但在数据处理程度上要远远领先于单片机,在课堂上老师也是将二者进行对照,让我们的在学习起来轻松许多。但我们在学习时重点是研究DSP 的汇编方法,这就让我们在面对用C语言编制程序时存在一定的压力。

如每次课设一样,我们的行动步骤为查找资料、分析原理、调试程序、记录结果。但这次课设给我的感觉却不同于每次。我的学习态度并不是十分认真刻苦,以往很多次课设由于小组同一题目的原因,我都会不自觉的依赖小组中能力较强的同学。这一次的情况比较偶然,也不是说我是能力最强的,只是这次自己也在默默地暗示自己,要最大程度上的靠自己把任务完成。

我们这次课设书中所给的程序并不难于看懂,因为C语言的语句比较清晰,所以很容易的把程序分为初始化部分、主函数部分和子程序部分。整个程序中,最重要的内容是子程序中的提取FFT抽样点数以完成蝶形图的部分。这部分内容我就不得不回到课本中去查找,明确什么是旋转因子、什么是蝶形图、蝶形图的级数和FFT的运算特点等。在此基础上才能用C语言将课设目的达成。而难点部分我认为是求子程序中倒序输入的部分,课本中给的说明很清晰,但是想要编出达到效果的程序却不是只倒序这么简单,我们在理解这部分的时候,很困惑权和权值的概念,咨询了老师同学,也查了书本,最后用代值的方法才将各个变量的含义确定。进入程序调试步骤时,我也用了相对长的一段时间,不仅要纠正程序的错误,还要对应课设要求显示INPUT和DATA两个地址处的时域波形和频域谱线。经过多次尝试我们才搞清楚CCS中显示图像的菜单功能,最后我们不仅能观察到图形,还可以调节一部分参数将图形变得尽可能美观些。输入的波形我们我们采用两种,正弦和方波,具体程序都会在附录一里给出。

当看到仿真后输出的图形,想象可以把设计正确的程序运用于实际,心中充满着成就感,努力下解决了困难之后,我们将收获让我们自己都无法想象的知识和乐趣!DSP的课程设计虽然结束了,但通过设计所学到的东西将长久存在。相信这次设计带给我的严谨学习态度和一丝不苟的科学作风将会给我未来的工作和学习打下一个更坚实的基础。

19

沈阳工程学院设计(论文)

致谢

夏过秋来,草长莺飞,我们迎来了大四学期伊始的第一次实训。这次课设给我很多感触,也给我更多自信。

本次设计中,我首先要感谢我们可爱又可敬的吕勇军吕老师。吕老师年岁已高,却每天都会准时到达实验室,及时的对同学们的问题进行细心的启发和引导,不论疲惫与否。很多时候我们找不到思路,吕老师的出现仿佛带来了曙光,将我们从迷惑中解脱。很多同学都说面对吕老师的“支援”时,心里都会有些紧张,因为害怕吕老师会突然提出一些问题或者疑问。但在一年多的磨砺后,我却已经不这样认为了,我觉得这一点更突出了吕老师的水平,每每有和吕老师交谈的机会,我的紧张已被兴奋替代,我希望自己能回答老师的问题,因为希望能看到老师的微笑,但回答不上也不也不会气馁,因为我知道又有了提高自己的机会。

吕老师在我印象里是一位德高望重的老师,不会拿成绩看人,也不拿古板苛刻的教条规范我们,他让我们每个人都能拥有自己的特色,他告诉我们大学四年应该发展什么,不应该丢掉什么。吕老师告诉我,只要我愿意做我就能收获到,我想我现在已经懂了,我想对吕老师说,谢谢您!

再多华丽的言语也是苍白的,在此,谨向我亲爱的老师致以最诚挚的谢意和最崇高的敬意。最后我还要感谢学校能给我们提供这样一个自主创新的平台,让我们大大的提高了动手能力,将理论知识应用在实践当中,今后我将更加努力的学习进步,争取为母校取得更大的成绩!

参考文献

[1] 俞一彪,孙兵. 数字信号处理理论与应用.南京:东南大学出版社,2005

[2] 李行一. 数字信号处理.重庆:重庆大学出版社,2002

[3] 郭森楙,颜允圣. 数字信号处理器体系结构、实现与应用.北京:清华大学

出版社,2005

[4]姜沫岐,许涵,俞鹏,段国强 . DSP原理与应用—从入门到提高. 北京: 机

- 14 -

快速傅里叶变换程序设计

械工业出版社, 2007

[5] 俞卞章. 数字信号处理. 西安: 西北工业大学出版社, 2002

[6] 王安国. 数字信号处理基础.北京: 电子工业出版社, 2003

附录A1 程序清单

$ INCLUDE(C8051F020.INC)

TCMS EQU 1234H

NN DA TA 1334H

INTBit BIT 20H.0

ORG 0

19

沈阳工程学院设计(论文)AJMP MAIN

ORG 7BH

AJMP ADC_ISR

ORG 000BH

AJMP T0

ORG 001BH

AJMP T1

ORG 0100H

MAIN: MOV WDTCN,#0DEH

MOV WDTCN,#0ADH

MOV XBR2,#40H

MOV R4,#2AH

MOV R3,#01H

MOV NN,#2AH

MOV CKCON,#00H

MOV TMOD,#11H

MOV R1,#30H

MOV @R1,#0AH

INC R1

MOV @R1,#0DH

INC R1

MOV @R1,#0CH

INC R1

MOV @R1,#00H

INC R1

MOV @R1,#68H

INC R1

MOV @R1,#68H

CLR INTBit

LCALL PORT_Init

lcall LCD_Init

LCALL Timer3_Init

LCALL ADC_Init

MOV TH0,#3CH

MOV TL0,#0B0H

MOV TH1,#3CH

- 16 -

快速傅里叶变换程序设计

MOV TL1,#0B0H

SETB EA

MOV AMX0SL,#00

LCALL Delay

LOOP: JNB INTBit,LOOP

ANL TMR3CN,#0FBH

CLR INTBit

MOV P7,#02H

MOV P6,#1H

MOV P6,#0H

MOV R1,#39H

MOV A,ADC0L

ANL A,#0FH

MOV @R1,A

MOV A,ADC0L

SWAP A

ANL A,#0FH

DEC R1

MOV @R1,A

MOV A,ADC0H

ANL A,#0FH

DEC R1

MOV @R1,A

CJNE @R1,#0FH,LOP1

CJNE R3,#1H,LOP11

MOV P0,#00H

SETB ET0

SETB EA

SETB TR0

SETB ET1

AJMP LOP11

LOP1: MOV P0,#0FFH

MOV R3,#01H

LOP11: MOV A,ADC0H

SWAP A

19

沈阳工程学院设计(论文)

ANL A,#0FH

DEC R1

MOV @R1,A

MOV A,ADC0H

SWAP A

ANL A,#0FH

MOV @R1,A

MOV P6,#05H

LCALL DELA Y

MOV R1,#30H

MOV R2,#0AH

NDA TA: MOV A,@R1

MOV R0,A

CLR C

SUBB A,#0AH

JC KK

MOV A,R0

ADD A,#37H

AJMP TT

KK: MOV A,R0

ADD A,#30H

TT: MOV P7,A

MOV P6,#05H

MOV P6,#04H

INC R1

LCALL DELA Y

DJNZ R2,NDA TA

ORL TMR3CN,#04H

SJMP LOOP

RET

LCD_Init: MOV P6,#1H

LCALL DELA Y

MOV P7,#38H

MOV P6,#1H

MOV P6,#0H

LCALL DELA Y

MOV P7,#0EH

- 18 -

快速傅里叶变换程序设计

MOV P6,#01H

MOV P6,#0H

LCALL DELA Y

MOV P7,#1CH

MOV P6,#1H

MOV P6,#0H

LCALL DELA Y

MOV P7,#01H

MOV P6,#1H

MOV P6,#0H

LCALL DELA Y

RET

Timer3_Init: MOV TMR3CN,#00H

MOV TMR3RLH,#HIGH(-TCMS)

MOV TMR3RLL,#LOW(-TCMS)

MOV TMR3H,#0FFH

MOV TMR3L,#0FFH

ORL TMR3CN,#04H

RET

ADC_Init: ORL ADC0CN,#84H

ORL REF0CN,#03H

ORL ADC0CF,#50H

ORL AMX0CF,#00H

ORL EIE2,#02H

RET

PORT_Init: ORL P74OUT,#0C0H

MOV P0MDOUT,#0FFH

MOV P0,#0FFH

RET

ADC_ISR: CLR AD0INT

SETB INTBit

RETI

DELAY : MOV R7,#01H

DELAY1 : MOV R6,#80H

DELAY0 : MOV R5,#00H

DJNZ R5,$

DJNZ R6,DELA Y0

19

相关文档
相关文档 最新文档