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

这篇博客介绍了51单片机中的STC12C5A60S2型号,强调了其作为加强51单片机的特性,尤其是运行速度上的优势。作者分享了如何利用单片机的内部AD进行模数转换,并提供已封装好的函数库,适合初学者参考。所有例程已在实际开发板上测试通过。

学过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 register
sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
sfr 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;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值