1
电子说
#include
#include
sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器
sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器
sfr ADC_DATA = 0xC6; //A/D转换结果寄存器
sfr P1M0=0x91;
sfr P1M1=0x92;
#define uchar unsigned char ;
#define uint unsigned int ;
void delay(uchar delay_time) // 延时函数
{
uchar n;
uint m;
for (n=0;n {
for(m=0;m《10000;m++);
}
}
uchar get_AD_result(uchar channel)
{
uchar AD_finished = 0; // 存储 A/D 转换标志
ADC_DATA = 0;
ADC_CONTR = channel; // 选择 A/D 当前通道
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 启动A/D 转换
AD_finished = 0;
while ( AD_finished == 0 ) // 等待A/D 转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D转换结束否
}
ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D 转换,
return (ADC_DATA); // 返回 A/D 转换结果
}
void main()
{
P1 = P1 | 0x03; // 0000,0011,P1.0,P1.1为 A/D 转换,即通道0与1
P1_ADC_EN = 0x03; //0000,0011, P1 的P1.0,P1.1设置为 A/D 转换输入脚
// 断开P1.0,P1.1 内部上拉电阻
while(1)
{
get_AD_result(0);
delay(200);
get_AD_result(1);
delay(200);
}
}
话说stc内部自带ad,但是功能多了!必然控制起来就啰嗦了!不像外部ad。stc如果不用中断ad方式需要注意一下几个问题:
1、在初始化ad的时候,一定要第一个给ad提供电源,即adc_power一定要第一个置1;
2、在每次对adc-contr进行操作后,必须延时至少4个时钟周期,原因是adc_contr这个寄存器需要时间存储信息;
3、在对adc_contr进行操作时,尽量不要用位寻址。直接对整个寄存器进行修改。
4、在数据手册上面提示尽量不要用“与”“或”,但是在时机应用的时候因为每次对adc_contr进行操作后都要延时,所以“与”“或”还是很必要的;
全部0条评论
快来发表一下你的评论吧 !