快速导航
STC12已封装好的函数库
STC12C5A60S2有8路高速10位A/D转换
本demo实现ADC通道0采集,并通过串口打印出来(查询方式)
#include <STC12C5A60S2.H>
#include <intrins.h>#define MAIN_Fosc 11059200L //宏定义主时钟HZ
//#define MAIN_Fosc 12000000L#define uchar unsigned char
#define uint unsigned int /*声明ADC相关寄存器 */
//sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
//sfr ADC_RES = 0xBD; //ADC 高8位结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC 低2位结果寄存器
//sfr P1ASF = 0x9D; //P1 辅助控制寄存器/*ADC操作的一些宏定义*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks//基于STC12单片机1ms延时函数
//函数说明:内部调用
void Delay1ms()
{# if MAIN_Fosc == 11059200L//晶振11.0592MHz//误差 -0.018084490741usunsigned char a,b,c;for(c=8;c>0;c--)for(b=197;b>0;b--)for(a=2;a>0;a--);#elif MAIN_Fosc == 12000000L//晶振12.000000MHZ//误差 0usunsigned char a,b;for(b=129;b>0;b--)for(a=45;a>0;a--);#endif}//基于STC12单片机ms延时函数
//函数说明:外部调用
void Delay_ms(uint time)
{int i;for(i=0; i<time; i++){Delay1ms();}
}//串口初始化,晶振11.0592,波特率9600
void UartInit(void) //9600bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1TBRT = 0xDC; //设定独立波特率发生器重装值AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器AUXR |= 0x10; //启动独立波特率发生器//EA = 1;//开总中断//ES = 1;//开串口中断
}/***********************************************函数名称:InitADC()*函数功能:初始化ADC*输入:无*返回:无**********************************************/
void InitADC()
{P1ASF = 0xff; //开启8路ADC功能ADC_RES = 0; //清楚之前的结果ADC_CONTR = ADC_POWER | ADC_SPEEDLL;Delay_ms(2); //ADC上电和延时
}/**************************************
函数名称:GetADCResult(unsigned int ch)
功能描述:读取AD
入口参数:unsigned int ch 输入0-7分别读取AD0-AD7值
返回值:无
***************************************/
unsigned char GetADCResult(unsigned char ch)
{ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;_nop_(); //查询前必须等待_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待完成标志ADC_CONTR &= ~ADC_FLAG; //关闭 ADCreturn ADC_RES; //返回ADC结果
}//向串口发送一个字符
void putchar(unsigned char ch)
{SBUF = ch;while(!TI);TI = 0;
}//向串口发送一段字符串
void prints(char *s)
{while(*s != '\0')//发送字符串,直到遇到0才结束{SBUF = *s++;while(!TI);TI = 0;}
}void main()
{unsigned char temp;UartInit();//串口初始化InitADC();//ADC初始化//将ADC结果通过串口发送出去while(1){prints("通道0的ADC值为:");temp = GetADCResult(0);putchar(temp / 1000 + '0');//打印千位putchar(temp % 1000 / 100 + '0');//打印百位putchar(temp % 100 / 10 + '0');//打印十位putchar(temp % 10 + '0');//打印个位Delay_ms(100);}
}