51单片机程序问题 stc12c5a60s2 的a/d转换问题..
问题太长了..所以直接发空间了..http://hi.baidu.com/crescent_/item/b8e6e827342e1ff850fd87d9请移步..不胜感激...
问题太长了..所以直接发空间了..http://hi.baidu.com/crescent_/item/b8e6e827342e1ff850fd87d9
请移步 .. 不胜感激 谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢 展开
请移步 .. 不胜感激 谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢 展开
2个回答
展开全部
好吧,先声明我也正在学单片机,回答可能不专业,因为AD问题我只接触过一次。以下结论来着STC12的手册。
1.转换的引脚由ADC_CONTG的低3位CHS2、CHS1和CHS0控制,三位二进制能表示0~7八个数,与P1口一一对应。ADC的结构决定了它一次只能转换一个口,但是STC的转换速度达到10万次/秒,依次转换P1.0和P1.1与同时转换差别不大。设置P1.0时,ch=0x00.设置P1.1时,ch=0x01.
2.是按照一个字节读的,直接读ADC_RES的话只能读到数据的高八位。只用8位ADC转换的话,读ADC_RES就可以了。要想得到10位数据必须加上SendData(ADC_LOW2);
3.既然send函数提到了SBUF,那么说明转换结果是通过串口传到电脑上,用STC下载工具的串口调试应该可以看到转换结果。
4.连续读取可以用函数循环或定时器循环来调用转换函数。例子嘛,定时器我还不会用而你给的值定时器中断法。所以我说下函数的方法,大概是这样:
void main{
InitADC();//初始化ADC
while(1){//死循环
adc_isr();//转换函数
delay(xx);//延时一段时间,否则转换太快,数据量太大。
}
}
5.UART是一种通用串行数据总线,在这里是用于与电脑进行串口通信的。
1.转换的引脚由ADC_CONTG的低3位CHS2、CHS1和CHS0控制,三位二进制能表示0~7八个数,与P1口一一对应。ADC的结构决定了它一次只能转换一个口,但是STC的转换速度达到10万次/秒,依次转换P1.0和P1.1与同时转换差别不大。设置P1.0时,ch=0x00.设置P1.1时,ch=0x01.
2.是按照一个字节读的,直接读ADC_RES的话只能读到数据的高八位。只用8位ADC转换的话,读ADC_RES就可以了。要想得到10位数据必须加上SendData(ADC_LOW2);
3.既然send函数提到了SBUF,那么说明转换结果是通过串口传到电脑上,用STC下载工具的串口调试应该可以看到转换结果。
4.连续读取可以用函数循环或定时器循环来调用转换函数。例子嘛,定时器我还不会用而你给的值定时器中断法。所以我说下函数的方法,大概是这样:
void main{
InitADC();//初始化ADC
while(1){//死循环
adc_isr();//转换函数
delay(xx);//延时一段时间,否则转换太快,数据量太大。
}
}
5.UART是一种通用串行数据总线,在这里是用于与电脑进行串口通信的。
追问
不好意思再问一下哦..
1.这个|符号在这里是什么意思,,,,
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
2. ADC_CONTR &= !ADC_FLAG 这句是什么意思呢? 清零...??
追答
|是按位或的符号,运算法则是有1则1,全0为0。既1|1=1,1|0=1,0|1=1,0|0=0。|的用法还可以用作组合。下面那串表达式的意思是把power,speedll,start,ch组合在一起。之所以说是组合,因为0x40|0x05=0x45.看起来像是把4和5组合在一起。单片机里有些寄存器不能进行位寻址,比如这个ad,直接设adc_power=1并不能起作用,必须把它的值和其他同属一个寄存器的变量组合在一起,然后赋值给adc_contr。第二问,这就是把flag清零的意思,因为!是按位取反,无论flag是0还是1,取反后都会和原来的相反,然后&是按位与,运算是0&1=0,1&0=0。由此可知无论flag为何值,结果都为0。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询