编辑代码

#include <stdio.h>
#define Max_voltage 5.0   //最大电压
#define Max_value 4095     //最大的数值可能性,12位AD,有12个0或1,所以是2的12次方,包括加上0共4096

void approaching(float inputvotlage,int j,int results[12],int compare_voltage,int set_voltage,float guess_voltage) 
{
    int i;
 if(j<12)   //循环十二次,12个数值逐个判断
 {  //将量化电压与比较电压相比
    if(guess_voltage>=compare_voltage+set_voltage)   //比较大小时,用的实际上是一个假设的值,如果大于才把这个比较电压确定下来
        {
            results[j]=1;  //大于,则设为1
            compare_voltage=compare_voltage+set_voltage; //记录下目前的比较电压
            approaching( guess_voltage, j+1,results,compare_voltage,set_voltage/2,guess_voltage);//j+1实现判断下一位,set_voltage/2实现将电压逼近
        }
     else
        {  //其余情况,不用管,因为初始设的就是0
            approaching( guess_voltage, j+1, results,compare_voltage,set_voltage/2,guess_voltage); //小于假设比较电压的话,就继续循环,将假设电压继续放大
        }   
 }
}


int main () {
   printf("请输入0——5V的电压值:");
   float input_votlage;
   scanf("%f",&input_votlage);
   int i;
   int set_voltage=2048;     //初始比较值为2e11(2048),后续逐渐除2,即从2e+11到2e+0
   int compare_voltage=0;
   float step=Max_voltage/Max_value;  //步长;即4096个可能性对应的电压大小
   float guess_voltage=input_votlage/step; //将输入电压根据步长量化到4096的大小中
   int j=0;
 int results[12];
     for(i=0;i<12;i++)   //利用数组人为初始化一个二进制的值,可以避开位操作
  {
      results[i]=0;
  }
    if(input_votlage>5)  //限制电压值在0——5V的范围
  {
      input_votlage=5;
  }
  else if(input_votlage<0)
  {
      input_votlage=0;
  }
   //在12位AD转换器中,有4096个可能的数字输出,这对应于分辨率为(基准电压/4096),在这种情况下,每个数字的变化对应着(基准电压/4096)的电压变化。
  printf("基于12位AD转换的量化电压为:") ;
  printf("%.1f\n",guess_voltage);  //检验量化电压

   approaching(input_votlage,j,results,compare_voltage,set_voltage,guess_voltage);
   printf("最终二进制值为:");
   for(i=0;i<12;i++)
   {
       printf("%d",results[i]);
   }
    return 0;
}