51学习库(4)--内部AD

来源:互联网 发布:卡密源码 编辑:程序博客网 时间:2024/04/27 19:03

学过51单片机的回过头来都会觉得51还是比较简单的,在此我将贴出在我的学习过程中,把对各种外设所进行的操作,封装成函数库的形式,以供新手学习。

注:使用的单片机是stc12c5a60s2,该系列单片机属于加强51,在运行速度上是普通51的8-12倍,有关时序的操作需要加以注意。
注2:该单片机内部有AD,可以直接使用内部AD进行模数转化
使用方法:

main函数中:float num = GetADCResult(0);    //num即P1^0口的电压值,可用数码管将该浮点数显示出来,把P1^0口接3.3V,就可以测得3.3V的电压

申明:本系列全部例程通过单片机开发板,实验亲测有效!

/* AD *//*Declare SFR associated with the ADC */sfr ADC_CONTR   =   0xBC;           //ADC control registersfr ADC_RES     =   0xBD;           //ADC high 8-bit result registersfr ADC_RESL    =   0xBE;                         //sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register sfr P1ASF       =   0x9D;           //P1 secondary function control register  /*Define ADC operation const for ADC_CONTR*/#define ADC_POWER   0x80            //ADC power control bit#define ADC_FLAG    0x10            //ADC complete flag        模数转换结束标志位#define ADC_START   0x08            //ADC start control bit       模数转换启动控制位//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度#define ADC_SPEEDLL 0x00            //540 clocks #define ADC_SPEEDL  0x20            //360 clocks#define ADC_SPEEDH  0x40            //180 clocks#define ADC_SPEEDHH 0x60            //90 clocks/*----------------------------Software delay function----------------------------*/void Delay(unsigned int n){    unsigned int x;    while (n--)    {        x = 5000;        while (x--);    }}/*----------------------------Initial ADC sfr----------------------------*/void InitADC(){    P1ASF = 0x01;                   //选择P1.0作为A/D输入通道    ADC_RES = 0;                    //清0    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;   //0x10|0x00=0x10:开电源和设置A/D转换速度    Delay(2);                       //ADC power-on and delay}/*----------------------------Get ADC result----------------------------*/float GetADCResult(unsigned char ch){    float Vo;    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换    _nop_();         //Must wait before inquiry ,    _nop_();        //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器    _nop_();    _nop_();    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag    ADC_CONTR &= ~ADC_FLAG;         //Close ADC    Vo=ADC_RES*5/256;                 //Return ADC result(为显示整数,这里将电压值扩大了十倍)return Vo;
0 0
原创粉丝点击