能说具体点吗,这个单片机的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采集电压值串口发送到电脑呢,找不到示例程序,不知道该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)