📄 模拟比较器.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 + -