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

被折叠的 条评论
为什么被折叠?



