STC12C5A60S2 四路AD同时采集程序怎么写

STC12C5A60S2 四路AD同时采集程序怎么写,第1张

能说具体点吗,这个单片机的AD和pwm控制舵机我都用过就是不知道你要什么功能,实在不行我把AD的和控制舵机的程序分别发给你?能说具体点吗,这个单片机的AD和pwm控制舵机我都用过就是不知道你要什么功能,实在不行我把AD的和控制舵机的程序分别发给你?

上次回答了你的问题,难道你上次选择的最佳答案,没有用吗?

--------------------

0~25V,对应于AD_data = 0~111111111(24位二进制);

那么1V就是:6710886(十进制)。

用24位值AD_data除以6710886,得到的整数部分就是0~5,即为电压的整数部分。

再把刚才除得的余数,再除以10,取整数将得到0~9,即为电压的第一位小数;

余数,再除以10,取整数将得到0~9,即为电压的第二位小数;

……

想要取多少位小数,就计算多少次。

----

这种算法,既不会溢出,也没有计算误差,我已经用过多年;

呵呵,但是过去都是处理16位数的数值。

楼主现在使用24位的,分辨率达到了015微伏,估计 也没有什么用处。

不如舍弃低8位,只用高、中8位,按照16数进行数据处理,精度也可以达到0038毫伏,足以满足一般的要求了。

----

呵呵,计算误差,肯定是没有的,误差,是显示位数不够引起的。

你的开发板上的单片机是STC89C52,这个89系列的单片机是没有内部A/D电路的,要进行AD采集电压,要外配A/D转换芯片,这AD芯片不同,采集的程序就不同的。

如下图所示,STC89系列单片机的内部配置,画红杠一列AD为空。

STC单片机从STC12系列开始才有内部AD电路的,你可以换一个STC12C5A60S2的单片机,带有内部AD的,可以替换你开发板上的STC89C52,这样,就可以用来练习A/D转换程序了。至于串口发送程序,你前面已经提问过了,那A/D转换程序,去STC官网下载,官网上有很多A/D转的例程,可以下载的。下图就是STC官网的资料目录。

#include "stc2052h"

#include "mainh"

void ADC_init(void);

void del(INT8U x);

void uart_init(void);

void PutHex(INT8U cp,INT8U len);

void ADC_SPI_Routine(void);

void Putstr(char cs);

/用的是5406,12M晶体,波特率不能太大,用2400,

实验过程是 在P16脚 接25v电压,开AD 读到最终值是80H,7FH 左右/

void main()

{

EA=0;

P1M0=0x40;

P1M1=0x00; //表示第P16作为AD输入

EA=1;

uart_init();

ADC_init();

while(1){

del(100);

uart_s_buf[0] = ADC_DATA;

uart_s_buf[1]=0x23;

PutHex(uart_s_buf,2);

del(1000);

}

}

void ADC_init(void)

{

ADC_CONTR |= 0x06;

ADC_CONTR |= 0x80;//开启ADC电源

del(1);

ADC_CONTR |= 0x08; //启动AD

AUXR |= 0x10;

EADC_SPI = 1;

}

void del(INT8U yj)

{

INT8U yj2=5000;

while(yj!=0)

{

while(yj2!=0)

{

yj2--;

}

yj2=1000;

yj--;

}

}

void uart_init(void)

{

SCON = 0x50;

//SCON: mode 1,8-bit UART, enable rcvr

AUXR = 0x80; // 作在1T模式

// PCON = 0x80; // 加速

TMOD = 0x20; // TMOD: timer 1,mode 2,8-bit reload TL0 NO USED

TH1 = SYS_TDATA; / 2400 Bds at 111184MHz /

TL1 = SYS_TDATA; / 2400 Bds at 111184MHz /

// ES = 1; / Enable serial interrupt/

TR1 = 1;

/ Timer 1 run /

}

void PutHex(INT8U cp,INT8U len)

{

ES=0;

TI = 0;

while(len--)

{

SBUF=cp;

cp++;

while(TI==0); //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){;};

TI=0;

}

ES=0;

}

void Putstr(char cs)

{

TI=0;

while(cs) / 例如 :指向数组的指针,例如

int b[10];

int a = b;

a就是b[0]的地址a就是b[0]的内容

a+1就是b[1]的地址依此类推

又如char a = "hank";

那么通过a就能得到整个字符串"hank"

a是h

(a+1)是a 所以发送完k后 就是(cs==0)0了,那就跳出循环 /

{

SBUF=cs;

cs++;

while(TI==0);

TI=0;

}

}

void ADC_SPI_Routine(void) interrupt 5

{

EADC_SPI = 0;

ADC_CONTR |= 0x08; //ADC_START启动

ADC_CONTR &= 0xef; //ADC_FLAG清零

EADC_SPI = 1;

}

不可能。

对于AD来说,能采集的最高电压就是它的基准电压REF。

在一个电路中,基准电压是不可能高于电源电压的。

单片机输出33V,可见单片机的电源电压就是33V,如果你要让AD正常工作,只能选25V或其他更低电压标准的基准电压。所以此时AD的采样范围是0-Vref 。5V电压直接进去是不行的,必须用精密电阻分压,然后采集。

以上就是关于STC12C5A60S2 四路AD同时采集程序怎么写全部的内容,包括:STC12C5A60S2 四路AD同时采集程序怎么写、51单片机采集的AD值的转换程序问题、stc89c52rc怎么编程利用AD采集电压值串口发送到电脑呢,找不到示例程序,不知道该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9323707.html

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

发表评论

登录后才能评论

评论列表(0条)

保存