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

发布者:HeavenlyClouds最新更新时间:2016-10-04 来源: eefocus关键字:单片机  数据采集 手机看文章 扫描二维码
随时随地手机看文章
/8051单片机TLC1549数据采集程序源代码

//单片机:At89S52

//连接类型:232 |485 接口

//校验方式:checksum

//开发环境:keil C


#i nclude  
#i nclude  
#i nclude "iic.h" 
#define uchar unsigned char 
#define uint unsigned int 
uint Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理 
sbit TEST_CAP_VOL_CRLT=P1^0;//用于控制外部继电器 
sbit PWM_Pin=P3^7;//PWM输出 
sbit IrDA_in_Pin=P1^0;//红外脉冲输入检测脚 
bit PWMFlag=0; 
uchar OLD_TH0,OLD_TL0; 
#define MAXCMD_LENGTH 7 
#define AD_VOL_PER 1.04058 //正常采集时的电压校准值 
#define AD_Loop_PickVol_PER 1.04058 //CD4051循环采集时的电压校准值
sbit WDTRST=0xA6;//At89S5x看门狗寄存器 
sbit ADCLK=P2^0; 
sbit ADOUT=P2^1; 
sbit ADCS=P2^2; 
//-------------------------- 
/************CD4051---8选1模拟开关芯片*****************/ 
/* 
|------------------------------------------------------| 
| 4 2 1 | 
|-----------------------------------------------|------| 
|端口 | INH C B A | | | 
|------ 7 6 5 4 3 2 1 0 | 正值 | 取反 | 
| 通道 |--------------------------------|-------|------| 
|------|...............|8 4 2 1 | | | 
|------|---------------|----------------|-------|------| 
| 0 |0 0 0 0 0 0 0 0 | 0x00 | 0xff | 
| 1 |0 0 0 0 0 0 1 0 | 0x02 | 0xf7 | 
| 2 |0 0 0 0 0 1 0 0 | 0x04 | 0xfb | 
| 3 |0 0 0 0 0 1 1 0 | 0x06 | 0xf3 | 
| 4 |0 0 0 0 1 0 0 0 | 0x08 | 0xfd | 
| 5 |0 0 0 0 1 0 1 0 | 0x0A | 0xf8 | 
| 6 |0 0 0 0 1 1 0 0 | 0x0C | 0xf9 | 
| 7 |0 0 0 0 1 1 1 0 | 0x0e | 0xf1 | 
|---------------------------------------|-------|------| 
*/ 
uchar CD4051_NUM[]={0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0e}; //0~7编码 
sbit CD4051_A=P1^1; 
sbit CD4051_B=P1^2; 
sbit CD4051_C=P1^3; 
sbit CD4051_INH=P1^4; //CD4051_INH为1时,,所有通导都不导通 
bit CD4051_Vol_Conver_Flag=0; //0时为正常采集,1为CD4051循环采集 
//-------------------------- 
//LED显示 
//-------------------------- 
uchar LedCount=0; 
uchar LED_BIT[5]; //用于显示的每一位数据码的内容 
uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80};//选择显示位 
//-------------------------------------------------------- 
void SendByte(unsigned char word) 

TI=0; 
SBUF=word; 
while(TI==0); 
TI=0; 

uchar ComBuf[MAXCMD_LENGTH];//用于保存串口的数据 
/*---少量延时---*/ 
void delay(uint t) 

uint i=0; 
for(;i<=t;i++); 

void Pluckdelay(uint t) 

uint i=0,j; 
for(;i<=t;i++) 
for(j=1;j<=1000;j++); 

/*================================= 
ComBuf[5]加入CheckSUM校验码 
算法:0x01+not(字节1+字节2+...+字节N) 
=================================*/ 
void SetCheckSUM() 

ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]); 

/*============================================================= 
检测上位机发送来的ComBuf[5]checksum校验码和计算后的是否相等 
正确则返回:1 
错误则返回:0 
==============================================================*/ 
bit ISCheckSUM() 

uchar crc; 
crc=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]); 
if(ComBuf[5]==crc) 
return 1; 
else 

ComBuf[1]=crc;//如果错误,则返回计算后得到的CHECKSUM校验码 
ComBuf[2]=ComBuf[5];//返回原来上位机发送来的CHECKSUM校验码 
return 0; 


/*----------------------------------- 
* * 
* 等待接收上位机发来的指令 * 
* * 
-------------------------------------*/ 
void WaitComm() 

uchar n=0; 
RI=0; 
while (1) 

while(!RI);//等接收数据 
//----------------- 
ComBuf[n]=SBUF; 
RI=0; 
// SBUF=ComBuf[n]; 
if (ComBuf[n]==0x7e) break;//接收到结束符则退出 
if (n>=MAXCMD_LENGTH) 
n=0;//接收10个字节,如果还没有接收到0x7e结束符,就重新记录 
else 
n++; 


/*------------------------------- 
* * 
* 发送combuf数据至上位机 * 
* * 
--------------------------------*/ 
void SendByteArray() 

unsigned i; 
SetCheckSUM();//加入ComBuf[5]的checkSUM校验码 
ComBuf[4]=P0;//取读本模块地址 
ComBuf[6]=0x7e;//结束符 
for(i=0;i<=MAXCMD_LENGTH-1;i++) 

SendByte(ComBuf[i]); 


/*------------------------------- 
* * 
* 送端口状态至上位机 * 
* * 
--------------------------------*/ 
void GetP0() 

switch(ComBuf[2]) 

case 0x00: ComBuf[3]=P0_0; break; 
case 0x01: ComBuf[3]=P0_1; break; 
case 0x02: ComBuf[3]=P0_2; break; 
case 0x03: ComBuf[3]=P0_3; break; 
case 0x04: ComBuf[3]=P0_4; break; 
case 0x05: ComBuf[3]=P0_5; break; 
case 0x06: ComBuf[3]=P0_6; break; 
case 0x07: ComBuf[3]=P0_7; break; 
default: 
ComBuf[3]=P0;//为8时...则以上传整个port状态 


//-------------------- 
void GetP1() 

switch(ComBuf[2]) 

case 0x00: ComBuf[3]=P1_0; break; 
case 0x01: ComBuf[3]=P1_1; break; 
case 0x02: ComBuf[3]=P1_2; break; 
case 0x03: ComBuf[3]=P1_3; break; 
case 0x04: ComBuf[3]=P1_4; break; 
case 0x05: ComBuf[3]=P1_5; break; 
case 0x06: ComBuf[3]=P1_6; break; 
case 0x07: ComBuf[3]=P1_7; break; 
default: 
ComBuf[3]=P1;//为8时...则以上传整个port状态 


//--------------- 
void GetP2() 

switch(ComBuf[2]) 

case 0x00: ComBuf[3]=P2_0; break; 
case 0x01: ComBuf[3]=P2_1; break; 
case 0x02: ComBuf[3]=P2_2; break; 
case 0x03: ComBuf[3]=P2_3; break; 
case 0x04: ComBuf[3]=P2_4; break; 
case 0x05: ComBuf[3]=P2_5; break; 
case 0x06: ComBuf[3]=P2_6; break; 
case 0x07: ComBuf[3]=P2_7; break; 
default: 
ComBuf[3]=P2;//为8时...则以上传整个port状态 


//-------------- 
void GetP3() 

switch(ComBuf[2]) 

case 0x00: ComBuf[3]=P3_0; break; 
case 0x01: ComBuf[3]=P3_1; break; 
case 0x02: ComBuf[3]=P3_2; break; 
case 0x03: ComBuf[3]=P3_3; break; 
case 0x04: ComBuf[3]=P3_4; break; 
case 0x05: ComBuf[3]=P3_5; break; 
case 0x06: ComBuf[3]=P3_6; break; 
case 0x07: ComBuf[3]=P3_7; break; 
default: 
ComBuf[3]=P3;//为8时...则以上传整个port状态 


//-------发送AT89S5x的指定端口状态到上位机----- 
void SendPortData() 

switch (ComBuf[1])/*Port号*/ 

case 0x00: GetP0(); break; 
case 0x01: GetP1(); break; 
case 0x02: GetP2(); break; 
case 0x03: GetP3(); break; 

/*--------------------*/ 
SendByteArray();//发送数据 

/*------------------------------- 
* * 
* 各个端口的状态设定 * 
* * 
--------------------------------*/ 
void SetP0() 

switch(ComBuf[2]) 

case 0x00: P0_0=ComBuf[3]; break; 
case 0x01: P0_1=ComBuf[3]; break; 
case 0x02: P0_2=ComBuf[3]; break; 
case 0x03: P0_3=ComBuf[3]; break; 
case 0x04: P0_4=ComBuf[3]; break; 
case 0x05: P0_5=ComBuf[3]; break; 
case 0x06: P0_6=ComBuf[3]; break; 
case 0x07: P0_7=ComBuf[3]; break; 
default: 
P0=ComBuf[3];//为8时...则设置整个port状态 


//================================= 
void SetP1() 

switch(ComBuf[2]) 

case 0x00: P1_0=ComBuf[3]; break; 
case 0x01: P1_1=ComBuf[3]; break; 
case 0x02: P1_2=ComBuf[3]; break; 
case 0x03: P1_3=ComBuf[3]; break; 
case 0x04: P1_4=ComBuf[3]; break; 
case 0x05: P1_5=ComBuf[3]; break; 
case 0x06: P1_6=ComBuf[3]; break; 
case 0x07: P1_7=ComBuf[3]; break; 
default: 
P1=ComBuf[3];//为8时...则设置整个port状态 


//================================= 
void SetP2() 

switch(ComBuf[2]) 

case 0x00: P2_0=ComBuf[3]; break; 
case 0x01: P2_1=ComBuf[3]; break; 
case 0x02: P2_2=ComBuf[3]; break; 
case 0x03: P2_3=ComBuf[3]; break; 
case 0x04: P2_4=ComBuf[3]; break; 
case 0x05: P2_5=ComBuf[3]; break; 
case 0x06: P2_6=ComBuf[3]; break; 
case 0x07: P2_7=ComBuf[3]; break; 
default: 
P2=ComBuf[3];//为8时...则设置整个port状态 


//================================= 
void SetP3() 

switch(ComBuf[2]) 

case 0x00: P3_0=ComBuf[3]; break; 
case 0x01: P3_1=ComBuf[3]; break; 
case 0x02: P3_2=ComBuf[3]; break; 
case 0x03: P3_3=ComBuf[3]; break; 
case 0x04: P3_4=ComBuf[3]; break; 
case 0x05: P3_5=ComBuf[3]; break; 
case 0x06: P3_6=ComBuf[3]; break; 
case 0x07: P3_7=ComBuf[3]; break; 
default: 
P3=ComBuf[3];//为8时...则设置整个port状态 


/*================================= 
WritePortData() 
按上位机传来的格式进行端口的设置 
=================================*/ 
void WritePortData() 

switch (ComBuf[1])/*Port号*/ 

case 0x00: SetP0(); break; 
case 0x01: SetP1(); break; 
case 0x02: SetP2(); break; 
case 0x03: SetP3(); break; 


/*---------------------------------- 
* SetEA() * 
* * 
* 中断允许设定,(EA寄存器) * 
* ComBuf[1]==>0x00为EA设定 * 
* 0x01为读取EA值 * 
------------------------------------*/ 
void SetEA() 

if (ComBuf[1]==0x00) 
EA=ComBuf[3]; 
else 

ComBuf[3]=EA; 
SendByteArray();//发送数据 

}

/*--------------------------------------------------------------- 
* * 
* float型转为2位char型,并发送至串行 * 
* void Convert_AD_VOL_ValueToChar() * 
* * 
---------------------------------------------------------------*/ 
void Convert_AD_VOL_ValueToChar(uint vol) 

float temp_float_vol; 
unsigned int temp; 
uchar AD_Hight,AD_Low; 
temp_float_vol=vol*0.0048*AD_VOL_PER; 
temp=temp_float_vol*100; 
AD_Hight=temp /100;//取个位数 
AD_Low=temp-AD_Hight*100;//取2位小数 
ComBuf[2]=AD_Hight; 
ComBuf[3]=AD_Low; 
SendByteArray();//发送数据 

/*-------------------------------- 
* * 
* 预先采集一次AD数据 * 
* * 
*--------------------------------*/ 
void Befor_Once_AD() 

uchar i; 
ADCLK=ADOUT=0; 
//---------- 
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK 
for(i=1;i<=10;i++) 

ADCLK=1; 
ADCLK=0; 

ADCS=1; 
delay(25);//两次转换间隔大于21us 

/*--------------------------------------------------------------- 
* GetAD() TLC1549数据采集 * 
* sbit ADCLK=P2^0; * 
* sbit ADOUT=P2^1; * 
* sbit ADCS=P2^2; * 
-----------------------------------------------------------------*/ 
void GetAD() 

uchar i=1,w,PickCount; 
uint vol; 
Befor_Once_AD();//预先采集一次AD数据 
//--------------- 
if (ComBuf[1]==0)ComBuf[1]=0x01; 
PickCount=ComBuf[1]; 
for(w=1;w<=PickCount;w++) 

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 
//--------------- 
ComBuf[1]=w;//发送第几次采集的序号 
Convert_AD_VOL_ValueToChar(vol);//对float转为2位char型,并发送至串行口 
P2=0xff;//p2口置初始状态 


/*--------------------------------------------------------------- 
* * 
* TLC1549数据软件滤波采集 * 
* * 
-----------------------------------------------------------------*/ 
void GetAD_With_VOL_Filter() 

uchar i,w,j,k,PickCount,AD_Hight=0,AD_Low=0; 
uint Vol=0,VolArray[10],temp; 
float SumVol=0; 
Befor_Once_AD();//预先采集一次AD数据 
//--------------- 
//--------------- 
PickCount=11; 
for(w=0;w<=PickCount;w++) 

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 
VolArray[w]=Vol;//保存采集来的数据 
//--------------- 
P2=0xff;//p2口置初始状态 

//-------按从小到大排序-------- 
//选择排序法.. 
for(i=0;i<=PickCount-1;i++) 

k=i; 
for(j=PickCount+1;j
if(VolArray[j]>VolArray[k])k=j; 
if(k!=i) 

temp=VolArray[k]; 
VolArray[k]=VolArray[i]; 
VolArray[i]=temp; 


}

//----------累加计算平静均值------------ 
//乎略最小和最大值 
for(i=1;i<=PickCount-1;i++) 

SumVol=SumVol+VolArray[i];//累加结果 

SumVol=SumVol/(PickCount-1)*0.0048;//电压值=平均值*介数 
/*------------------------------ 
0时为正常采集,1为CD4051循环采集 
因为CD4051通道存在电压消耗, 
所以和正常的直接采集的校准值不一样 
-------------------------------*/ 
/*电压校准比*/ 
if(CD4051_Vol_Conver_Flag) 
SumVol*=AD_Loop_PickVol_PER;//采用CD4051时的电压校准值 
else 
SumVol*=AD_VOL_PER;//直接输入时的电压校准值 
//---------------- 
temp=SumVol*100;//保留2位小位 
AD_Hight=temp /100;//取个位数 
AD_Low=temp-AD_Hight*100;//取2位小数 
//ComBuf[1]=w;//发送第几次采集的序号 
ComBuf[2]=AD_Hight; 
ComBuf[3]=AD_Low; 
SendByteArray();//发送数据 

/*-------------------------------------------------------------------------* 
* * 
* CD4051_PickVol...8路选通TLC1549采集 * 
* * 
*-------------------------------------------------------------------------*/ 
void CD4051_PickVol() 

CD4051_Vol_Conver_Flag=1; 
P1=CD4051_NUM[ComBuf[1]];//CD4051通道选通 
// delay(2300);//通道切换时间间隔,避免电路的残余电 
GetAD_With_VOL_Filter(); 
CD4051_Vol_Conver_Flag=0; 

/*-------------------------------------------------------------------------* 
* * 
* CD4051_LoopPickVol()...8路巡检TLC1549采集 * 
* * 
*-------------------------------------------------------------------------*/ 
void CD4051_LoopPickVol() 

uchar i=0,w; 
w=ComBuf[1]-1;//通导号等于。。。通道数-1 
for(;i<=w;i++) 

ComBuf[1]=i;//通道号 
CD4051_PickVol(); 

P1=0xff;//关闭通道 

/*-------------------------------------------------------------------------* 
* * 
* 电容放电计数测试 * 
* TestCapCount() * 
* * 
*-------------------------------------------------------------------------*/ 
void TestCapCount() 

uint Vol,TempVol=0xff,Count=0,temp1,temp2; 
uchar i,CAPDELAYTIME; 
float TEST_CAP_OUT_value="/0.05;" 
P1=CD4051_NUM[1];//CD4051通道选通,1号通道 
TEST_CAP_VOL_CRLT=0;//打开电源 
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();//返回错误信息 


}

 

关键字:单片机  数据采集 引用地址:8051单片机C语言数据采集程序

上一篇:跟我来编一个最简单的单片机程序
下一篇:AD7705应用 C51源程序

推荐阅读最新更新时间:2024-03-16 15:13

基于A/D转换最小二乘法的数据采集应用
引言:   在工业污水处理过程当中,往往需要监测污水的COD 值,而现场的监测仪器所监测到 的数据是通过各种模拟信号输出,这些模拟信号必须通过A/D 转换器变换为数字信号后才 能送入上位机或外接数据采集器。基于此,本文给出了基于A/D 转换器TLC2543 的软硬件 设计,并结合最小二乘法将输出数据进行修正,达到了 环保 部分对有机污染物监测数据精度的要求。    1 系统硬件设计介绍   如图1所示,是系统电路图, A/D转换器采用TLC2543,它是12位串行模数转换器,使用 开关 电容 逐次逼近技术完成A/D转换过程,由于是串行输入结构,能够节省51系列单片机I/O 资源;且价格适中,分辨率较高,因此在仪器仪表中有较为
[模拟电子]
基于A/D转换最小二乘法的<font color='red'>数据采集</font>应用
Mouser备货Freescale® Kinetis® L系列32位MCU 基于ARM Cortex-M0+处理器构建
2012年10月8日 – Mouser Electronics宣布备货业界能效最高的处理器,该处理器来自Freescale Semiconductor.®。 Freescale公司的Kinetis® L系列32位微控制器(MCU)基于ARM® Cortex™-M0+核心构建,不仅能效出众、易于使用而且兼具了Kinetis 32位MCU产品组合的性能、外设、支持与可扩展性,同时还利用了ARM Cortex架构固有的低功耗和高性能特性。L系列产品采用Freescale的低泄露、90 nm薄膜存储(TFS)工艺技术制造,通过将出色的动态和截止电流与卓越的处理性能相结合,让功率关键型设计摆脱8位和16位MCU的限制。片内闪存记
[单片机]
Mouser备货Freescale® Kinetis® L系列32位<font color='red'>MCU</font> 基于ARM Cortex-M0+处理器构建
AVR单片机PCF8591AD-DA实验
未加入 滤波 函数所以数值有点晃动 //PCF8591 AVR单片机程序 默认为输入模式下通道0开始通道0 光敏电阻 ,通道1, 热敏电阻 ,通道2 电位器 ,通道3外接电位器,如有标点符号丢失格式错乱的情况可从这里下载 源码 : http://www.51hei.com/f/avr8591.rar #include iom16.h #include intrinsics.h #define uchar unsigned char #define uint unsigned int #define k1 PIND_Bit4 //模拟量输出值按键 #define k2 PIND_Bit5 //模
[单片机]
AVR<font color='red'>单片机</font>PCF8591AD-DA实验
51单片机学习笔记,简易时钟
使用芯片STC89C52RC, 2个锁存器 6个带小数点共阴极数码管显示一个24时制时钟 没有时钟芯片,所以掉电后时间会复位 原理图为TX-1C开发板 暂时显示了半小时,一秒不差, 未验证有无其他bug,代码贴上来,欢迎高手指点 ============================== 最终显示的 时.分.秒 是 16.31.37 形式 C代码 #include reg52.h #include MY51.H void show(); uint8 shi=15; //初始时间15:45:00 按复位按钮对时 uint8 fen=45; uint8 miao=0; vo
[单片机]
51<font color='red'>单片机</font>学习笔记,简易时钟
基于51单片机+红外遥控解码+LCD1602显示
基本介绍 什么是红外线? 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。 红外线系统的组成 红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过
[单片机]
基于51<font color='red'>单片机</font>+红外遥控解码+LCD1602显示
单片机数据通信之单总线数据传输
纯单片机干不了大事,必须得配上各种外设,那么了解单片机与传感器之间的数据通信就显得必不可少了。常见的单片机数据通信方式有SPI,IIC,RS232,单总线等等。每种通信方式都有相应的时序图,分析时序图并完成代码的编写是单片机学习者的必修课。本文以DS18B20为例分析一下单总线数据传输。 DS18B20是单总线数据传输,因此对于时序的要求就非常的高,学会分析其时序图是非常有必要的。 1.初始化时序图分析: 首先是由总线控制器拉低总线,维持480us。在480us后释放总线,由上拉电阻讲总线拉高。等待5-60us后,DS18B20开始响应,会将数据总线拉低60-240us.之后便释放总线,由上拉电阻拉高总线。转换为代码如下
[单片机]
<font color='red'>单片机</font>数据通信之单总线数据传输
驱动永磁无刷直流电机的嵌入式微控制器
    摘要: 本文介绍了一种适用于控制永磁无刷直流电机的廉价嵌入式微控制器,并结合实例给出了软件和硬件两种控制方法。     关键词: 永磁无刷直流电机  控制  嵌入式微控制器 一、 概述 永磁无刷直流电机(Permanent Magnet Brushless DC Motor以下简称PMBLDC)由于其固有的特点,在家用消费类产品(空调、冰箱、洗衣机)和IT周边产品(打印机、软驱、硬驱)中得到广泛的应用。它具有结构简单、高效、低噪声、高功率密度、启动扭矩大、寿命长等其它种类直流电机无法比拟的特性。我国是稀土大国,稀土永磁材料经过这几年的发展,已经有了一定的规模,质量和数据都有较大的提高,价格已不断
[应用]
基于C8051F410单片机实现集装箱的安全监测装置与系统设计
引言 随着当前物流行业的快速发展。作为物流主要运输方式的集装箱运输.其运输效率及货运安全性日益受到人们关注。近几年来,随着RFID技术的发展和推广,将RFID技术用于集装箱信息识别.实现集装箱运输的智能化已经成为各集装箱厂家竞相开发的目标。RFID技术是一种利用射频通信方法实现的非接触式、快速、实时和准确的采集与处理信息的自动射频识别技术。目前集装箱运输上对RFlD技术的应用仅仅限于利用阅读器射频信道识别电子标签内集装箱信息.并有实现其运输安全上的保证。本文设计了一种基于C8051F410单片机的双频固定式阅读器。该阅读器与智能集装箱安全设备及路标设备配合实用.不仅能快速识别集装箱信息,而且能监测集装箱内货物的安全。一旦集装箱被非
[单片机]
基于C<font color='red'>8051</font>F410<font color='red'>单片机</font>实现集装箱的安全监测装置与系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved