关于STC单片机AD转换和显示程序。
这里有一个学长写的STC单片机的AD转换和显示程序,有些不懂得东西,希望大神给予解释。程序如下:ad1=4000*ad1/ad2/m-400;temp=(int)ad1;...
这里有一个学长写的STC单片机的AD转换和显示程序,有些不懂得东西,希望大神给予解释。程序如下:
ad1=4000*ad1/ad2/m-400;
temp=(int)ad1;
Txd_data=temp%100;
Rxd_data=temp/100;
LED_Disp_Seg7();
//delay(10);
}
}
float AD_work(unsigned char channel)
{
float AD_val;
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel);
AD_val/=100;
AD_val=(AD_val*4)/1024;
return AD_val;
}
void AD_init() //
{
P1ASF=0x09;
ADC_RES=0;
ADC_RESL=0; /
ADC_CONTR=0x80;
delay(2);
}
void mDelay(uint16 mtime)
{
for(; mtime > 0; mtime--)
{
uint8 j = 244;
while(--j);
}
}
void LED_Disp_Seg7() //
{
LedCtrl = LedCtrl | 0xf0;
if(Rxd_data<0)
{
DisBuff[3] = 16;
Rxd_data=-Rxd_data;//
}
else
{ DisBuff[3] = Rxd_data%100/10;
}
DisBuff[0] = Txd_data%10;
DisBuff[1] = Txd_data%100/10;
DisBuff[2] = Rxd_data%10;
LedPort = LED_Disp[DisBuff[0]];
LedCtrl = LedCtrl & 0x7f;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[1]]&0x7f;
LedCtrl = LedCtrl & 0xbf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[2]];
LedCtrl = LedCtrl & 0xdf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[3]];
LedCtrl = LedCtrl & 0xef;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
}
这个是部分(因为字数限制= =)请问ad1=4000*ad1/ad2/m-400; 和AD_val=(AD_val*4)/1024; 这俩句是什么算法,还有显示里为什么每次显示后都要有一句LedCtrl = LedCtrl & 0xdf; ,求解释。。。
对了,还有float m=3.33 是什么意思= = 展开
ad1=4000*ad1/ad2/m-400;
temp=(int)ad1;
Txd_data=temp%100;
Rxd_data=temp/100;
LED_Disp_Seg7();
//delay(10);
}
}
float AD_work(unsigned char channel)
{
float AD_val;
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel);
AD_val/=100;
AD_val=(AD_val*4)/1024;
return AD_val;
}
void AD_init() //
{
P1ASF=0x09;
ADC_RES=0;
ADC_RESL=0; /
ADC_CONTR=0x80;
delay(2);
}
void mDelay(uint16 mtime)
{
for(; mtime > 0; mtime--)
{
uint8 j = 244;
while(--j);
}
}
void LED_Disp_Seg7() //
{
LedCtrl = LedCtrl | 0xf0;
if(Rxd_data<0)
{
DisBuff[3] = 16;
Rxd_data=-Rxd_data;//
}
else
{ DisBuff[3] = Rxd_data%100/10;
}
DisBuff[0] = Txd_data%10;
DisBuff[1] = Txd_data%100/10;
DisBuff[2] = Rxd_data%10;
LedPort = LED_Disp[DisBuff[0]];
LedCtrl = LedCtrl & 0x7f;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[1]]&0x7f;
LedCtrl = LedCtrl & 0xbf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[2]];
LedCtrl = LedCtrl & 0xdf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = LED_Disp[DisBuff[3]];
LedCtrl = LedCtrl & 0xef;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
}
这个是部分(因为字数限制= =)请问ad1=4000*ad1/ad2/m-400; 和AD_val=(AD_val*4)/1024; 这俩句是什么算法,还有显示里为什么每次显示后都要有一句LedCtrl = LedCtrl & 0xdf; ,求解释。。。
对了,还有float m=3.33 是什么意思= = 展开
1个回答
展开全部
重点不在算法,重点是会AD_init() 和AD_get(channel);
会初始化和启动AD转换并读取转换结果
至于换算是根据自己电路情况确定的,由于计算时采用过多的浮点型变量会占用较多内存,造成内存不足,因此有除法时常采用整形变量进行计算,运算时为了保持尾数不丢失,需把被除数扩大100倍或1000倍,如整数123/100=1,小数部分丢失了,为得到1.23这个结果,需把123扩大100倍,变成12300,12300/100=123.0,然后将小数点向左移2位(缩小100倍),即得1.23 这就是定(小数)点计算
LedCtrl = LedCtrl & 0xdf大概就是一次选通一个数码管,7f df ef bf每次只有一位是0
会初始化和启动AD转换并读取转换结果
至于换算是根据自己电路情况确定的,由于计算时采用过多的浮点型变量会占用较多内存,造成内存不足,因此有除法时常采用整形变量进行计算,运算时为了保持尾数不丢失,需把被除数扩大100倍或1000倍,如整数123/100=1,小数部分丢失了,为得到1.23这个结果,需把123扩大100倍,变成12300,12300/100=123.0,然后将小数点向左移2位(缩小100倍),即得1.23 这就是定(小数)点计算
LedCtrl = LedCtrl & 0xdf大概就是一次选通一个数码管,7f df ef bf每次只有一位是0
更多追问追答
追问
谢谢,再问一下他的ad1,和ad2哪个还参考电压?
还有就是ad采样里,参考电压和采集的电压怎么比较?
虽然看了手册,ad初始化函数和通道选择都看得懂,可是就是用不到自己的程序了,我觉得是对ad采样这个数据处理过程不太理解,麻烦您用通俗的语言给讲一下吧
追答
STC的单片机,参考电压一般就是电源电压,换算时如果是10位AD
真实值=测得数字量*电源电压/1024,如果有分压电阻还要乘分压倍数,有的还要进行线性校正
至于ADC的寄存器控制,只要会选择通道,并启动就可以了,这是STC5612AD的转换程序,看了手册就明白各个语句的作用了:
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
P1M0=P1M0|0X07; //设置p1.0 P1.1和 p1.3所在通道为开/漏模式
P1M1=P1M1|0X07;
ADC_CONTR=0xe0; //11100000 开启P1.0通道开始转换
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;
最终转换结果是: temp7*4+ temp8
一般应用只用一两个通道,直接编成不带形参的子程序供调用即可
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询