以下代码和文字说明,参阅了STC公司供给的技能手册(STC15.pdf)。
详细代码如下:
#include
#include”init.h”
#include”led.h”
#include”buzzer.h”
#include”delayms.h”
#include”uart.h”
//ADC_CONTR寄存器的位取值
#define ADC_POWER0x80//翻开ADC转化器电源
#define ADC_FLAG0x10//ADC完结标志位
#define ADC_START0x08//ADC开端操控位
#define ADC_SPEEDLL0x00//540个时钟周期转化一次
#define ADC_SPEEDL0x20//360个时钟周期转化一次
#define ADC_SPEEDH0x40//180个时钟周期转化一次
#define ADC_SPEEDHH0x60// 90个时钟周期转化一次
#define ADC_CH10x01//挑选通道1
#define ADC_CH20x02//挑选通道2
#define ADC_CH30x03//挑选通道3
#define ADC_CH40x04//挑选通道4
//初始化ADC
void init_ADC(void)
{
P1ASF= 0x1e; //P11-P14口作为模仿功用A/D运用
ADC_RES= 0;//铲除成果寄存器
ADC_RESL= 0;
PCON&= 0xdf;//ADCRES存放高8位ADC成果,ADCRESL[1:0]存放低2位成果
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//发动转化,通道2
delayms(1);//ADC上电延时
EA= 1;//CPU敞开总中止
EADC = 1;//答应ADC中止
}
void main(void)
{
init_IO(); //初始化
init_sym();
init_uart();
init_ADC();
while(1)
{
while(!(ADC_CONTR & ADC_FLAG));//等候ADC完结
ADC_CONTR &= !ADC_FLAG;//铲除ADC中止
sendData(ADC_RES);
sendData(ADC_RESL);
led_ye_on();
ADC_RES= 0;//获取ADC成果后,铲除成果寄存器
ADC_RESL= 0;
//AD转化完毕后会主动中止转化,所以这儿再次敞开ADC
//而且一定要从头敞开ADC电源、设置ADC通道和ADC转化速率
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//发动转化,通道2
delayms(1000);
}
}
自带ADC的运用方法请参照以上代码。
需求留意的问题:
1、在发动AD转化前,给AD转化器上电,而且上电后需求延时一下;
2、对ADC操控寄存器(ADC_CONTR)的操作最好是直接赋值,不要用‘&’和‘|’;
3、在ADC转化过程中不要改动I/O口的状况,即便企图改动也会失利;
4、ADC完成一次转化完毕后,AD转化将会主动封闭,假如要完成接连转化,则需求再次发动AD转化(将ADC_CONTR 寄存器的ADC_START位置1)。由于需求对ADC_CONTR寄存器直接赋值,所以 要对ADC_CONTR寄存器再次赋值(该值和ADC初始化中的值共同)。实践也证明了,假如直接使用或句子将ADC_START置位(ADC_CONTR |= ADC_START;),则AD转化失利,经过调试测验,初步判断是ADC_CONTR寄存器的ADC_POWER位不等于1,也就是说发动AD转化前,AD转化器没有上电,这样AD转化天然不会成功。
5、假如需求改动I/O口的状况,最好是在AD转化开端之前进行。
以上的内容纯属个人学习体会,如有不当之处,请纠正!
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/256783.html