看你用什么芯片了-
但是一般步骤都如下:
1,选择AD通道,也就是选择某一入口(一般有8个入口的,任选一个都可以)
2,设置转换方式,一般有触发转换或者软件转换-(比如C8051F系列带有定时器2定时转换-另一种也可以选择软件转换,就是向BUSY寄存器写1来触发转换等)-
3,选择转换得到的数据是几位,一般都是12位(00 0000 0000)除去后8位是数据,前2位系统自动补0-
4,可选中断-
5,开始转换-(比如用定时器2的话,就直接启动TR2=1就行了-)
6,查询转换结束标志,(或者进入中断)任何单片机AD转换完都有转换结束标志的-
7,读取转换得到的数值,一般都会有两个寄存器分别存有高位和低位的-
8,保存好数值!结束-
-
51的目前我在用,关系到机密,就不发代码给你了!
发一个以前我实验时候写的ARM7给你吧!
/-------------------------------------------------------------------
ADC初始化
------------------------------------------------------------
1:ADCR
//SEL=1000:选择引脚P030,通道AD03
//CLKDIV=13(55Mhz/45Mhz)
//BURST(位16=0)软件启动,
//CLKS(19-17:000)10位转换,
//START(26-24=001):立即启动,
//EDGE=0:下降启动;
--------------------------------------------------------------------------/
void ADC_Inite()
{
//AD0CR=(1<<27)|(0x01<<24)|(1<<21)|(0x0<<19)|(0x0C<<8)|(0x08);
AD0CR=(0x01<<24)|(1<<21)|(0x0<<19)|(0x0C<<8)|(0x08);
}
/-------------------------------------------------------------------
ADC启动
------------------------------------------------------------------/
#define ADC_Start() AD0GSR|=(0x01<<24)
/-------------------------------------------------------------------
ADC等待
------------------------------------------------------------------/
int ADC_GetValue()
{
//while(((0x01&(AD0GDR<<1))&0x01)==0)
int ax,cx;
cx=0x0000F000;
do{
ax =AD0GDR;
cx--;
}while(((ax&0x80000000)==0)&&cx);
return (ax>>6)&0x3FF;
}
把300V电压,接到两个的电阻分电路上,电阻串联有分压作用。一端接地的电阻上分压为0~5V,假如电阻取10K,那么大电阻就应该是590K。电压分压比为300/5=60倍,所以,用AD采集0~5V电压,得到数字量,换算成电压为Ⅴd,再计算出被测电压Vx=60Vd。所以,写程序很简单,主要是A/D转换程序并转换为电压Vd。
你的开发板上的单片机是STC89C52,这个89系列的单片机是没有内部A/D电路的,要进行AD采集电压,要外配A/D转换芯片,这AD芯片不同,采集的程序就不同的。
如下图所示,STC89系列单片机的内部配置,画红杠一列AD为空。
STC单片机从STC12系列开始才有内部AD电路的,你可以换一个STC12C5A60S2的单片机,带有内部AD的,可以替换你开发板上的STC89C52,这样,就可以用来练习A/D转换程序了。至于串口发送程序,你前面已经提问过了,那A/D转换程序,去STC官网下载,官网上有很多A/D转的例程,可以下载的。下图就是STC官网的资料目录。
STC单项片机说明文档里有例子
下面是我的采集程序,采三次,求平均值:
void adchange()//AD采集程序,采集3路
{
uchar temp7,temp8,temp9,temp10,temp11,temp12;
uint tempa,tempb,tempc,tempd;
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
//P1M0=P1M0|0X07; //设置p10 P11和 p13所在通道为开/漏模式
//P1M1=P1M1|0X07;
ADC_CONTR=0xe0; //11100000 开启P10通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp7=ADC_DATA; //读取转换结果
temp8=ADC_LOW2;
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp9=ADC_DATA; //读取转换结果
temp10=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp11=ADC_DATA; //读取转换结果
temp12=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
tempa=(temp74+temp8);//真烦人,但必须这么算,一次算会出错
tempb=(temp94+temp10);
tempc=(temp114+temp12);
tempd=tempa+tempb+tempc;
temp1=(tempd+1)/3;
。。。。。。其它两路略
//P1M0=P1M0&0X00; //设置P1口为普通I/O模式,以便用P1口显示数据。
//P1M1=P1M1&0X00;
}
以上就是关于单片机中的AD采样大概是如何用语句实现的 如能贴一段实现的C语言语句最好了。全部的内容,包括:单片机中的AD采样大概是如何用语句实现的 如能贴一段实现的C语言语句最好了。、请问51单片机ad采集电压0-300v降压转变成0-5v范围内,降压部分原理图和程序应该怎么写、stc89c52rc怎么编程利用AD采集电压值串口发送到电脑呢,找不到示例程序,不知道该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)