51单片机程序 问题

//单片机stc12c5a60s2
//5v 单片机 做电压采样用的
// adcdataold , adcdata 是 unsigned long int变量 。
//ADC_RES 是a/d转换结果寄存器。ADC_RESL 是低位
//adcdata=最终电压值
adcdata=(((uint)ADC_RES)<<2)|(ADC_RESL & 0x03); //这句怎么理解?

adcdata=(((ulong)5000*(ulong)adcdata)>>10); //这句怎么理解?

ADC_CONTR=0xef; //AD转换控制特殊功能寄存器 不管他先

adcdata=((ulong)adcdataold*32+(ulong)adcdata*(256-32))/256; //这句怎么理解?
adcdataold=adcdata;

stc单片机是10为AD转换,所以结果是10位量,ADC_RES保存高八位,ADC_RESL保存低两位
adcdata=(((uint)ADC_RES)<<2)|(ADC_RESL & 0x03); 这句话就是将AD转换的结果由两个八位寄存器拼入到一个int变量adcdata中,其实不用long型,一个unsigned int就足够了。
adcdata=(((ulong)5000*(ulong)adcdata)>>10); 做四舍五入运算,保留高4位的值。

adcdata=((ulong)adcdataold*32+(ulong)adcdata*(256-32))/256;这句因为不知道你的换算方法,不好说是啥意思。追问

adcdata=(((ulong)5000*(ulong)adcdata)>>10); 是保留高4位的值 为什么叫 四舍五入运算啊?

追答

本身是10位,乘以5000就编程了13~14位了,再右移10位,所以“入”者为14位,保留的是4位,“舍”者为13位,保留的是3位,所以是四舍五入。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-12
adcdata=(((uint)ADC_RES)<<2)|(ADC_RESL & 0x03); //这句是把高8位和低2位AD转换结果
//拼成10位结果

其他几句都是标度转换, 各人使用不同, 意思也就不同了
第2个回答  2013-02-12
我平时用STC90C58AD,好像没那么复杂!
相似回答