⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟比较器.c

📁 单片机接口技术实用子程序配套源代码
💻 C
字号:
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
sbit     sel_A = P3^0;
sbit     sel_B = P3^1;
sbit     sel_C = P3^2;
sbit     comp_OUT =P3^6;
sbit     comp_IN1 =P1^0;
sbit     comp_IN2 =P1^1;
unsigned char ABC;
unsigned int Tref;
unsigned int Tx;
unsigned int Vx;
unsigned int Vref=25000;                   //实际参考电压值的1000倍,以免出现小数

void delay(unsigned  int N);             //延时子程序,实现(16*N+24)us的延时
void timer_set();                        //定时器初始化函数
void discharge();                        //电容放电
void measure_Vref();                     //测量参考电压值
void measure_Vx(unsigned char channels);//测量指定通道的电压
void calculate_Vx();                   //计算待测电压值           
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};	                 
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时 
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
  void delay(unsigned  int N)  
  {
  int i; 
  for(i=0;i<N;i++);
  }
//-------------------------------------------------------------------------------------------------------
//  函数名称: timer_set 
//  功能说明: 设置定时器工作状态,与硬件有关
//--------------------------------------------------------------------------------------------------------
void timer_set()
     {
	  TMOD=0x01;  //设定定时器工作模式
      }
//--------------------------------------------------------------------------------------------------
// 函数名称: discharge
// 函数功能: 电容放电,定时器清零
//--------------------------------------------------------------------------------------------------
  void discharge()  
  {
  comp_IN2=0;         //P1.1置零,Cr放电
  delay(0);           //延时24us
  TH0=0;              //计数器清零
  TL0=0;
  }
//-------------------------------------------------------------------------------------------------------
//  函数名称: measure_Vref
//  功能说明: 测量参考电压
//--------------------------------------------------------------------------------------------------------
void measure_Vref() 
{ 
  sel_A=0;
  sel_B=0;
  sel_C=0;                  //选通0通道,Vref输入
  delayNOP();               //定时消除抖动
  TR0=1;                    //启动计数器
  comp_IN2=1;               //P1.1置1,开始积分
  while(comp_OUT);          //检测P3.6是否出现跳变
  TR0=0;                    //停止计数器计数
  Tref=TH0;
  Tref=(Tref<<8)||TL0;
  discharge();              //放电
  }
//-------------------------------------------------------------------------------------------------------
//  函数名称: measure_Vx
//  入口参数: channels选通通道(1-7)
//  功能说明: 测量指定通道的电压
//--------------------------------------------------------------------------------------------------------
void measure_Vx(unsigned char channels)
{ 
  sel_A=channels&0x01;
  sel_B=channels&0x02;
  sel_C=channels&0x04;      
  delayNOP();               //定时消除抖动
  TR0=1;                    //启动计数器
  comp_IN2=1;               //P1.1置1,开始积分
  while(comp_OUT);          //检测P3.6是否出现跳变
  TR0=0;                    //停止计数器计数
  Tx=TH0;
  Tx=(Tx<<8)||TL0;
  discharge();              //放电
  }
//-------------------------------------------------------------------------------------------------------
//  函数名称: calculate_Vx
//  根据公式Vx=Vref*Tx/Tref计算结果;
//  功能说明: 计算Vx
//--------------------------------------------------------------------------------------------------------
void calculate_Vx()
   {
      //根据公式Vx=Vref*Tx/Tref计算结果;
   }
//-------------------------------------------------------------------------------------------------------
//  函数名称: main
//  功能说明: 主函数
//--------------------------------------------------------------------------------------------------------
void main()
     {
	 timer_set();
	 discharge();              //放电
	 measure_Vref();
     measure_Vx(1);
     calculate_Vx();                   //计算待测电压值           
	 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -