STC8H8K64U单片机-ADC采集数

配置单片机的ADC时一定要将IO口配置成高阻输入模式,

以下是单片机引脚对应的ADC通道

 

u16 temp_adc_value = 0;

/*
* 描述: 配置ADC引脚
* 参数: 无
* 返回: 无*/
void ADC_GPIO_Init(void)
{	
	//注意:配置ADC引脚必须配置为高阻态输入
	P0M1 |= (GPIO_BIT5);	P0M0 &= (~GPIO_BIT5);	  
}

/*
* 描述: ADC初始化
* 参数: 无
* 返回: 无*/
void ADC_Init(void)
{
	ADC_GPIO_Init();
	
	P_SW2 |= 0x80;
	ADCTIM = 0x3f;		//设置 ADC 内部时序,ADC采样时间建议设最大值
	P_SW2 &= 0x7f;
	ADCCFG = 0x2f;		//设置 ADC 时钟为系统时钟/2/16
	ADC_CONTR = 0x80;   //使能 ADC 模块
}


/*
* 描述: 查询法读一次ADC结果.
* 参数: channel:将要读取的通道,channel = 0~15
* 返回: 读取到对应通道的数据*/
u16 Get_ADC12bitResult(u8 channel)
{
	u16 adc_res = 0;
	
	//清除ADC数据缓存区
	ADC_RES = 0;
	ADC_RESL = 0;
	
	//启动 AD 转换
	ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
	//wait for ADC finish
	while((ADC_CONTR & 0x20) == 0)  ;   
	//清除ADC结束标志
	ADC_CONTR &= ~0x20;     
	
	adc_res = ADC_RES;
	adc_res = (adc_res<<8) | ADC_RESL;
	return  adc_res;
}


/*
* 描述:  获取电池电压ADC
* 参数:  无
* 返回值:0按下 1没按下*/
void Get_ADC_Value(void)
{
  u8 maopao_i = 0,maopao_j = 0;
  u16 adc_temp , adcarr_temp[5] = {0};  
  
  for(maopao_i = 0;maopao_i<5;maopao_i++)
  {
    adcarr_temp[maopao_i] = Get_ADC12bitResult(13);
  }
  for(maopao_i=0;maopao_i<4;maopao_i++)
  {
    for(maopao_j=0;maopao_j<4-maopao_i;maopao_j++)
    {
      if(adcarr_temp[maopao_j]> adcarr_temp[maopao_j+1]) 
      {
        adc_temp= adcarr_temp[maopao_j]; 
		adcarr_temp[maopao_j]=adcarr_temp[maopao_j+1];
	    adcarr_temp[maopao_j+1]=adc_temp;
      }
    }
  }
  temp_adc_value = (adcarr_temp[1]+adcarr_temp[2]+adcarr_temp[3])/3;
}



  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STC8H8K64U单片机内置ADC资源测量电压输出型气象传感器输出信号的代码示例: ```c #include <STC8.H> #define SensorPin P3_0 // 传感器信号引脚 #define VREF 3.3 // 参考电压 unsigned int SensorValue; // 传感器值 void ADC_Init(void) { P1ASF = 0x01; // 将 P1 口设为模拟输入 ADC_RES = 0; // 清零 ADC 结果寄存器 ADC_CONTR = 0xE2;// 选择 ADC 时钟,选择 ADC1 通道,左对齐,启动 ADC } unsigned int Get_ADC_Result(void) { unsigned int high, low; ADC_CONTR |= 0x08; // 启动 ADC 转换 while (!(ADC_CONTR & 0x20)); // 等待 ADC 转换完成 high = ADC_RESH; // 读取高 8 位 low = ADC_RESL; // 读取低 8 位 return (high << 8) | low; // 合并高低 8 位 } void main(void) { float voltage; ADC_Init(); // 初始化 ADC while (1) { SensorValue = Get_ADC_Result(); // 读取传感器值 voltage = (float)SensorValue * VREF / 0xFFF; // 计算电压值 // 在这里可以根据电压值进行相应的处理,例如输出到 LCD 显示屏、发送到串口等 } } ``` 在上面的代码中,我们首先定义了传感器信号引脚、参考电压等参。然后在 `ADC_Init` 函中初始化 ADC,将 P1 口设为模拟输入,并启动 ADC。在 `Get_ADC_Result` 函中,我们启动 ADC 转换,并等待转换完成。最后,我们在主循环中读取传感器值,并根据传感器值计算出电压值。在这里,我们可以根据电压值进行相应的处理,例如输出到 LCD 显示屏、发送到串口等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值