跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序

跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序,第1张

void Timer3_Init()

{

TMR3CN = 0x02;

TMR3R = -44236; //定时2ms

TMR3 = 0xffff;

EIE2 &= ~0x01;

TMR3CN |= 0x04;

}

void ADC0_Init(void)

{

AMX0SL=0x00; //选择通道0

AMX0CF=0x00; //选择AIN0和AIN1为独立输入

REF0CN=0x03; //选择外部的电压为基准电压

ADC0CF=(SYSCLK/2500000)<<3;//时钟为 ,增益为1

ADC0CN=0x84;//ADC0使能且为ADCBUSY的开启方式

EIE2|=0x02;//开启ADC0的中断

}

void ADC0_ISR() interrupt 15

{

static unsigned int_dec=INT_DEC;

static long accumulator=0L;

AD0INT = 0; // 清 ADC 中断标志位

accumulator += ADC0; // 累加ADC采样数据

int_dec--; // 指针减1

if (int_dec == 0) // 累加完了吗?

{

int_dec = INT_DEC; // 指针复位

result = accumulator >> 8;

accumulator = 0L; // 累加和变量清0

t=1;

}

}ADC0转换,定时器3开启的方式

x=-10:10;%x的取值范围

n=length(x)%x的向量长度

a=2+rand(1,n);%产生一个以2~3之间的随机数组

b=5+rand(1,n);%产生一个以5~6之间的随机数组

y=a+bx^2

;%产生y

plot(x,y,'o')%画图,蓝色圈圈

pp=polyfit(x,y,2)%2次拟合,pp为回归系数

xx=-10:01:10;

%再产生新的xx

yy=polyval(pp,xx);%通过回归系数和xx得到yy

hold

on%

在同一个地方画图

plot(xx,yy,'r')%用回归系数和xx作图,红色

图形见:

#include <stdioh>

#include <conioh>

#include <stdlibh>

#include <mathh>

main()

{

int i,j,m,n=7,poly_n=2;

double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};

double a[3];

void polyfit(int n,double x,double y,int poly_n,double a[]);

system("cls");

polyfit(n,x,y,poly_n,a);

for (i=0;i<poly_n+1;i++)/这里是升序排列,Matlab是降序排列/

printf("a[%d]=%g\n",i,a[i]);

getch();

}

/==================polyfit(n,x,y,poly_n,a)===================/

/=======拟合y=a0+a1x+a2x^2+……+apoly_nx^poly_n========/

/=====n是数据个数 xy是数据值 poly_n是多项式的项数======/

/===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====/

void polyfit(int n,double x[],double y[],int poly_n,double a[])

{

int i,j;

double tempx,tempy,sumxx,sumxy,ata;

void gauss_solve(int n,double A[],double x[],double b[]);

tempx=calloc(n,sizeof(double));

sumxx=calloc(poly_n2+1,sizeof(double));

tempy=calloc(n,sizeof(double));

sumxy=calloc(poly_n+1,sizeof(double));

ata=calloc((poly_n+1)(poly_n+1),sizeof(double));

for (i=0;i<n;i++)

{

tempx[i]=1;

tempy[i]=y[i];

}

for (i=0;i<2poly_n+1;i++)

for (sumxx[i]=0,j=0;j<n;j++)

{

sumxx[i]+=tempx[j];

tempx[j]=x[j];

}

for (i=0;i<poly_n+1;i++)

for (sumxy[i]=0,j=0;j<n;j++)

{

sumxy[i]+=tempy[j];

tempy[j]=x[j];

}

for (i=0;i<poly_n+1;i++)

for (j=0;j<poly_n+1;j++)

ata[i(poly_n+1)+j]=sumxx[i+j];

gauss_solve(poly_n+1,ata,a,sumxy);

free(tempx);

free(sumxx);

free(tempy);

free(sumxy);

free(ata);

}

void gauss_solve(int n,double A[],double x[],double b[])

{

int i,j,k,r;

double max;

for (k=0;k<n-1;k++)

{

max=fabs(A[kn+k]); /find maxmum/

r=k;

for (i=k+1;i<n-1;i++)

if (max<fabs(A[in+i]))

{

max=fabs(A[in+i]);

r=i;

}

if (r!=k)

for (i=0;i<n;i++) /change array:A[k]&A[r] /

{

max=A[kn+i];

A[kn+i]=A[rn+i];

A[rn+i]=max;

}

max=b[k]; /change array:b[k]&b[r] /

b[k]=b[r];

b[r]=max;

for (i=k+1;i<n;i++)

{

for (j=k+1;j<n;j++)

A[in+j]-=A[in+k]A[kn+j]/A[kn+k];

b[i]-=A[in+k]b[k]/A[kn+k];

}

}

以上就是关于跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序全部的内容,包括:跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序、用Matlab写拟合曲线的程序、想用C语言编写多项式拟合的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10157890.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存