微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8051单片机C语言数据采集程序

8051单片机C语言数据采集程序

时间:12-03 来源:互联网 点击:

电源
if (ComBuf[1]==0x00)//为0x00时为电容测量方式,0x01为电压测量方式
{
for(i=0;i<=ComBuf[2];i++)delay(60000);//等待电容充电
TEST_CAP_VOL_CRLT=1;//断开电源
TEST_CAP_OUT_value="/0.01;//当为电容测量时。。下限电压"
}
CAPDELAYTIME=ComBuf[3];//延时常量
//--------------
P1_1=0;//打开LED状态指示
while(TempVol*0.0048*AD_VOL_PER>=TEST_CAP_OUT_VALUE)//当放电到0V时退出
{
ADCLK=ADOUT=0;
Vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
Vol<=1;
if(ADOUT)Vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
//---------------
P2=0xff;//p2口置初始状态
Count++;//计数
ComBuf[0]=0x05;//利用软件滤波的处理过程显示
if(Count>2)TempVol=Vol;//第一次的取值有可能是1,,去掉不要
Convert_AD_VOL_ValueToChar(Vol);//转换并发送本次数据
Pluckdelay(CAPDELAYTIME);//采集间隔时间,为ComBuf[4]*1000的时间常数
}
//从高到低取
P1=0xff;//初始P1口
ComBuf[0]=0x0b;
temp1=Count/1000;//取前1-2位
ComBuf[1]=temp1;
temp2=Count/10-temp1*100;//得到3-4位
ComBuf[2]=temp2;
ComBuf[3]=Count-(temp1*1000+temp2*10);
SendByteArray();//发送数据
}
//--------------------------------------------------------------------------//
//写一个字节到AT24C04EEPROM
void WriteAT24C04()
{
uchar address,RomData;
address=ComBuf[1];
RomData=ComBuf[2];
WriteByte_24c04(RomData,address);
}
//读取AT24C04EEPROM一个字节
void ReadAT24C04()
{
ComBuf[2]=ReadByte_24c04(ComBuf[1]);
SendByteArray();//发送数据
}
//=================================
// 看门狗设置
//=================================
//void watchdog()
//{
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
//}
void SetLedData()
{
uchar ShowData,ShowBit;
Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理
ShowBit=ComBuf[1];
ShowData=LED_NUM[ShowBit];//选择位
ShowData|=ComBuf[2];//显示内容
LED_BIT[ShowBit]=0x00;
LED_BIT[ShowBit]=ShowData;
TH0=(65536-4000)>>8;
TL0=(65536-4000)&0xff;
TR0=ComBuf[3];
if(ComBuf[3]) P0=0x00;//关闭显示
}
/*=========================================
PluckPulse----时序采集
===========================================*/
void PluckPulse()
{
Timer_Pro_Flag=1;//0为显示处理,1为时序采集处理
OLD_TH0=ComBuf[2];
OLD_TL0=ComBuf[3];
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=ComBuf[1];//关闭或启动计时器
}
//------------
/*=========================================
PWM----时序采集
===========================================*/
void PWM()
{
Timer_Pro_Flag=2;//0为显示处理,1为时序采集处理
OLD_TH0=ComBuf[2];
OLD_TL0=ComBuf[3];
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=ComBuf[1];//关闭或启动计时器
}
//------------
void timer0(void) interrupt 1 using 1
{
//-------------------
switch(Timer_Pro_Flag)
{
case 0:
//LED显示处理
TH0=(0xffff-4000)>>8;
TL0=(0xffff-4000)&0xff;
if (LedCount>4) LedCount=0;
P0=0x00;
P0=LED_BIT[LedCount++];
break;
case 1:
// 时序采集
TH0=OLD_TH0;
TL0=OLD_TL0;
SendByte(IrDA_in_Pin);//发送P1^0引脚状态
break;
case 2://模拟PWM输出
if(!PWMFlag)
{
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=1;
PWMFlag=1;
PWM_Pin=0;
}
else
{
PWM_Pin=1;
TR0=0;
TH0=OLD_TH0;
TL0=OLD_TL0;
TR0=1;
PWMFlag=0;
}
break;
}
}
/*===================================================================
主程序开始处
===================================================================*/
void main()
{
//晶振:11.0592,波特率:19200
TMOD=0x21;
TL1=0xfd;
TH1=0xfd;
SCON=0xd8;
PCON=0x80;//高位为0时不倍频:9600pbf,1时倍频:19200bpf
TR1=1;
//------------------
// TMOD=0x01;//工作在定时器方式1,16位计数器
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
EA=1;//中断允许
//-------------
while(1)
{
WaitComm();//等待接收数据
//校对checksum校验码是否正确,如正确则进行相关的操作
if(ISCheckSUM())
{
switch (ComBuf[0])
{
case 0x01:WritePortData(); break; //响应上位机发送的写操作
case 0x02:SendPortData(); break; //响应上位机发送的读操作
case 0x03:SetEA();break; //中断允许设定
case 0x04:GetAD();break; //TLC1549数据采集
case 0x05:GetAD_With_VOL_Filter();break;//采软件滤软件的TLC1549数据采集
case 0x06:CD4051_PickVol();break; //CD4051--8选1TLC1549采集
case 0x07:CD4051_LoopPickVol();break; //8路巡检TLC1549采集
case 0x08:ReadAT24C04();break; //读取AT24C04EEPROM一个字节
case 0x09:WriteAT24C04();break; //写一个字节到AT24C04EEPROM
case 0x0a:SetLedData();break; //设定显示的数据
case 0x0b:TestCapCount();break; //电容放电时间计数测试
case 0x0c:PluckPulse();break; //时序采集
case 0x0d:PWM();break; //控制P2_7模拟输出PWM
}
}
else//如检验错误则返回上位机错误信息
{
ComBuf[0]=0xFF;
SendByteArray();//返回错误信息
}
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top