STC12C5A60S2A/D转换

快速导航
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.018084490741us
	unsigned 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
	//误差 0us
	unsigned 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,即1T
	BRT = 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;         //关闭 ADC
	return 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);
	}
}

在这里插入图片描述

  • 9
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值