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

📄 ad.c

📁 用模拟比较器实现AD模拟转换
💻 C
字号:
//------------------------函数声明,变量定义---------------------------------
#include<reg51.h>
#include<intrins.h>
sbit sle_A=P3^0;
sbit sle_B=P3^1;
sbit sle_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);//延时子程序,实现(16xN+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
//函数功能:延时子程序,实现(16xN+24)us的延时
//系统采用11。0592的时钟时,延时满足要求,其他情况需要改动
//--------------------------------------------------------------------

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()
{
 sle_A=0;
 sle_B=0;
 sle_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)
{
 sle_A=channels&0x01;
 sle_B=channels&0x02;
 sle_C=channels&0x04;
 delayNOP();//定时消除抖动
 TR0=1;//启动计数器
 comp_IN2=1;//置p1,1为1,开始积分
 while(comp_OUT);
 TR0=0;
 Tx=TH0;
 Tx=(Tx<<8)||TL0;
 discharge();//放电
}


//---------------------------------------------------------------------------------------------
//函数名称:CALCULATE-VX
//函数公式VX=Vref *Tx/Tref计算结果
//功能说明:计算Vx
//---------------------------------------------------------------------------------------------


void calculte_Vx()
{
 
}


//--------------------------------------------------------------------------------------------
//函数名称:MAIN
//函数功能:主函数
//--------------------------------------------------------------------------------------------


void main()
{
timer_set();
discharge();
measure_Vref();
measure_Vx(1);
calculte_Vx();//计算待测电压
}

⌨️ 快捷键说明

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