當前位置:首頁 > 單片機 > 單片機
[導讀]/*************************************************************************************** * 晶振:11.0592M 波特率:19200 At89S52 * * * * 模塊地址設定:由P0口設定,模塊地址用于

/***************************************************************************************

* 晶振:11.0592M 波特率:19200 At89S52 *
* *
* 模塊地址設定:由P0口設定,模塊地址用于多機通信
* =================================================================================== *
* 0 1 2 3 4 5 6 *
* |---------------------------------------------------------------------------------| *
* |[操作符] | [port]| [位號] | [數(shù)據(jù)] | 模塊地址 |CheckSUM |固定結(jié)束符 | *
* |---------+-------+-----------------+---------+----------+----------+-------------| *
* |錯誤:0xFF| XX | XX | XX | XX | XX | 0x7e | *
* |---------+-------+-----------------+---------+----------+----------+-------------| *
* |寫:0x01 | 0~3 | 0~7|8為完全數(shù)據(jù) | 數(shù)據(jù) | XX | XX | 0x7e | *
* |---------+-------+-----------------+---------+----------+----------+-------------| *
* |讀:0x02 | 0~3 | 0~7|8為完全數(shù)據(jù) | XX | XX | XX | 0x7e | *
* |---------+-------+-----------------+---------+----------+----------+-------------| *
* |EA:0x03 | XX |00:寫 .. 01讀取 | 00(01) | XX | XX | 0x7e | *
* |---------------------------------------------------------------------------------| *

*==========================TLC1549數(shù)據(jù)采集============================================*
* ADCLK=P2^0 *
* ADOUT=P2^1 *
* ADCS=P2^2 *
* 0 1 2 3 4 5 6 *
* |---------------------------------------------------------------------------------| *
* |[操作符] |采集次數(shù) | 高位 | 低位 | 模塊地址 | CheckSUM |固定結(jié)束符 | *
* |---------+---------+---------------+---------+-----------+----------+------------| *
* |AD:0x04 | XX | XX | XX | XX | XX | 0x7e | *
* |---------------------------------------------------------------------------------| *

GetAD_With_VOL_Filter:軟件濾波采集
* 0 1 2 3 4 5 6 *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 空 | 高位 | 低位 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+---------+---------------+---------+-----------+----------+-------------| *
* |AD:0x05 | XX | XX | XX | XX | XX | 0x7e | *
* |----------------------------------------------------------------------------------| *

8路切換采集 ---CD4051_PickVol
CD4051---8選1模擬開關(guān)芯片
sbit CD4051_A=P1^1;
sbit CD4051_B=P1^2;
sbit CD4051_C=P1^3;
sbit CD4051_INH=P1^4; //CD4051_INH為1時,,所有通導都不導通
* |----------------------------------------------------------------------------------|
* | 0 1 2 3 4 5 6 | *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 選通編號 | 高位 | 低位 | 模塊地址 | CheckSUM | 固定結(jié)束符| *
* |---------+-----------+---------- ----+---------+-----------+----------+-----------| *
* |AD:0x06 | XX | XX | XX | XX | XX | 0x7e | *
* |----------------------------------------------------------------------------------| *
0x07:8路巡檢采集CD4051_LoopPickVol
* |----------------------------------------------------------------------------------|
* | 0 1 2 3 4 5 6 | *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 最大通道數(shù)| 高位 | 低位 | 模塊地址 | CheckSUM | 固定結(jié)束符| *
* |---------+-----------+---------- ----+---------+-----------+----------+-----------| *
* |AD:0x07 | XX | XX | XX | XX | XX | 0x7e | *
* |----------------------------------------------------------------------------------| *
*======================================================================================*

*===============================AT24C04串行EEPROM操作==================================*
* sbit SDA=P2^3;//SDA *
* sbit SCL=P2^4;//SCL *
* sbit WP=P2^5;//WP *
* 0 1 2 3 4 5 6 *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 地址 | 數(shù)據(jù) | 片地址 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+---------+---------------+---------+-----------+----------+-------------| *
* |讀:0x08 | XX | XX | XX | XX | XX | 0x7e | *
* |---------+---------+---------------+---------+-----------+----------+-------------| *
* |寫:0x09 | XX | XX | XX | XX | XX | 0x7e | *
* |----------------------------------------------------------------------------------| *
*======================================================================================*

*===================================4位數(shù)碼管理顯示====================================*
* SetLedData() *
* P0.0-P0.3==》顯示的數(shù)據(jù)發(fā)送至74ls47 *
* P0.4-P0.7==》數(shù)碼管選擇 *
* uchar LED_BIT[4]; //用于顯示的每一位數(shù)據(jù)碼的內(nèi)容 *
* uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80};//選擇顯示位 *
* 0 1 2 3 4 5 6 *
* |-----------------------------------------------------------------------------------|*
* |[操作符] | LEDNUM | 顯示內(nèi)容數(shù)據(jù) | 開啟/關(guān)閉 | 模塊地址 | CheckSUM | 固定結(jié)束符 |*
* |---------+---------+--------------+-----------+-----------+----------+-------------|*
* |讀:0x0A | XX | XX | XX | XX | XX | 0x7e |*
* |---------+---------+--------------+-----------+-----------+----------+-------------|*
* 開啟/關(guān)閉===>0x00,關(guān)閉定時器中斷 *
* ===>0x01,開啟定時器中斷 *
*======================================================================================*

*==================================容量測試============================================*
* TestCapCount() *
*電容充電控制: *
* P0.0=1 斷開 *
* P0.1=0 閉合 *
* 0 1 2 3 4 5 6 *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 數(shù)據(jù)位1 | 數(shù)據(jù)位2 | 數(shù)據(jù)位3 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+------------+------------+---------+-----------+----------+-------------| *
* | 0x0b | XX | XX | XX | XX | XX | 0x7e | *
* |----------------------------------------------------------------------------------|
* {上位機下傳指令}
測量方式:0==>電量測方式 繼電器自動開關(guān)
1==>電壓采集方式 繼電器等到放電結(jié)完后才關(guān)
* 0 1 2 3 4 5 6 *
* |-----------------------------------------------------------------------------------| *
* |[操作符] | 測量方式 |充電延時倍數(shù)| 采集間隔| 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+------------+------------+----------+-----------+----------+-------------| *
* | 0x0b | XX | XX | XX | XX | XX | 0x7e | *
* |-----------------------------------------------------------------------------------|
****************************************************************************************

* 時序采集--{上位機下傳指令}
PluckPulse();
* 0 1 2 3 4 5 6 *
* |------------------------------------------------------------------------------------| *
* |[操作符] | 定時器起動 | TH0 | TL0 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+------------+------------+-----------+-----------+----------+-------------| *
* | 0x0c | XX | XX | XX | XX | XX | 0x7e | *
* |------------------------------------------------------------------------------------|
上傳為無格式方式=====注意。。。。與現(xiàn)在的采集處理分開
****************************************************************************************

* PWM輸出--{上位機下傳指令}
PWM(); P2_7口
* 0 1 2 3 4 5 6 *
* |------------------------------------------------------------------------------------| *
* |[操作符] | 定時器起動 | TH0 | TL0 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+------------+------------+-----------+-----------+----------+-------------| *
* | 0x0d | XX | XX | XX | XX | XX | 0x7e | *
* |------------------------------------------------------------------------------------|

*==========================未實現(xiàn)功能,網(wǎng)絡接收模塊選通 ===============================*
* 2004-6-1 *
* 當主機發(fā)送該指令時,下位如接收到的起始地址與自己相同,則進行相關(guān)操作 *
* 當操作完成后,將起始地址加1,指向下一個模塊地址,發(fā)送 *
* 出去。其它模塊接收到后重復先前的模塊的作業(yè)... *
* 直到:起始地址=結(jié)束地址,則完成本次作業(yè)。 *
* 起始地址與自己不同,則只接收不做其它操作。 *
* 該功能暫時未實際實行,假定中。。。。。HOHO... *
* 0 1 2 3 4 5 6 *
* |----------------------------------------------------------------------------------| *
* |[操作符] | 起始地址 | 結(jié)束地址 | 空位 | 模塊地址 | CheckSUM | 固定結(jié)束符 | *
* |---------+------------+------------+---------+-----------+----------+-------------| *
* | 0x0e | XX | XX | XX | XX | XX | 0x7e | *
**************************************************************************************/

#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循環(huán)采集時的電壓校準值

sbit WDTRST=0xA6;//At89S5x看門狗寄存器
sbit ADCLK=P2^0;
sbit ADOUT=P2^1;
sbit ADCS=P2^2;
//--------------------------
/************CD4051---8選1模擬開關(guān)芯片*****************/
|------------------------------------------------------|
| 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循環(huán)采集
//--------------------------
//LED顯示
//--------------------------
uchar LedCount=0;
uchar LED_BIT[5]; //用于顯示的每一位數(shù)據(jù)碼的內(nèi)容
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];//用于保存串口的數(shù)據(jù)

/*---少量延時---*/
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(字節(jié)1+字節(jié)2+...+字節(jié)N)
=================================*/
void SetCheckSUM()
{
ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]);
}
/*=============================================================
檢測上位機發(fā)送來的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];//返回原來上位機發(fā)送來的CHECKSUM校驗碼
return 0;
}
}

/*-----------------------------------
* 等待接收上位機發(fā)來的指令 *
-------------------------------------*/
void WaitComm()
{
uchar n=0;
RI=0;
while (1)
{
while(!RI);//等接收數(shù)據(jù)
//-----------------
ComBuf[n]=SBUF;
RI=0;
// SBUF=ComBuf[n];
if (ComBuf[n]==0x7e) break;//接收到結(jié)束符則退出
if (n>=MAXCMD_LENGTH)
n=0;//接收10個字節(jié),如果還沒有接收到0x7e結(jié)束符,就重新記錄
else
n++;
}
}
/*-------------------------------
* 發(fā)送combuf數(shù)據(jù)至上位機 *
--------------------------------*/
void SendByteArray()
{
unsigned i;
SetCheckSUM();//加入ComBuf[5]的checkSUM校驗碼
ComBuf[4]=P0;//取讀本模塊地址
ComBuf[6]=0x7e;//結(jié)束符
for(i=0;i<=MAXCMD_LENGTH-1;i++)
{
SendByte(ComBuf[i]);
}
}

/*-------------------------------
* 送端口狀態(tà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狀態(tài)
}
}
//--------------------
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狀態(tài)
}
}
//---------------
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狀態(tài)
}
}
//--------------
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狀態(tài)
}
}
//-------發(fā)送AT89S5x的指定端口狀態(tài)到上位機-----
void SendPortData()
{
switch (ComBuf[1])/*Port號*/
{
case 0x00: GetP0(); break;
case 0x01: GetP1(); break;
case 0x02: GetP2(); break;
case 0x03: GetP3(); break;
}

/*--------------------*/
SendByteArray();//發(fā)送數(shù)據(jù)
}
/*-------------------------------
* 各個端口的狀態(tài)設定 *
--------------------------------*/
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狀態(tài)
}
}
//=================================
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狀態(tài)
}
}
//=================================
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狀態(tài)
}
}
//=================================
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狀態(tài)
}
}

/*=================================
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();//發(fā)送數(shù)據(jù)
}
}

/*---------------------------------------------------------------
* float型轉(zhuǎn)為2位char型,并發(fā)送至串行 *
* 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;//取個位數(shù)
AD_Low=temp-AD_Hight*100;//取2位小數(shù)
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//發(fā)送數(shù)據(jù)
}

/*--------------------------------
* 預先采集一次AD數(shù)據(jù) *
*--------------------------------*/
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);//兩次轉(zhuǎn)換間隔大于21us
}

/*---------------------------------------------------------------
* GetAD() TLC1549數(shù)據(jù)采集 *
* 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數(shù)據(jù)

//---------------

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);//兩次轉(zhuǎn)換間隔大于21us
//---------------
ComBuf[1]=w;//發(fā)送第幾次采集的序號
Convert_AD_VOL_ValueToChar(vol);//對float轉(zhuǎn)為2位char型,并發(fā)送至串行口
P2=0xff;//p2口置初始狀態(tài)
}
}

/*---------------------------------------------------------------
* TLC1549數(shù)據(jù)軟件濾波采集 *
----------------------------------------------------------------*/
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數(shù)據(jù)
//---------------
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);//兩次轉(zhuǎn)換間隔大于21us
VolArray[w]=Vol;//保存采集來的數(shù)據(jù)
//---------------
P2=0xff;//p2口置初始狀態(tài)
}
//-------按從小到大排序--------
//選擇排序法..
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];//累加結(jié)果
}
SumVol=SumVol/(PickCount-1)*0.0048;//電壓值=平均值*介數(shù)
/*------------------------------
0時為正常采集,1為CD4051循環(huán)采集
因為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;//取個位數(shù)
AD_Low=temp-AD_Hight*100;//取2位小數(shù)
//ComBuf[1]=w;//發(fā)送第幾次采集的序號
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//發(fā)送數(shù)據(jù)
}

/*-------------------------------------------------------------------------*
* 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;//通導號等于。。。通道數(shù)-1
for(;i<=w;i++)
{
ComBuf[1]=i;//通道號
CD4051_PickVol();
}
P1=0xff;//關(guān)閉通道
}
/*-------------------------------------------------------------------------*
* 電容放電計數(shù)測試 *
* 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狀態(tài)指示
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);//兩次轉(zhuǎn)換間隔大于21us
//---------------
P2=0xff;//p2口置初始狀態(tài)
Count++;//計數(shù)
ComBuf[0]=0x05;//利用軟件濾波的處理過程顯示
if(Count>2)TempVol=Vol;//第一次的取值有可能是1,,去掉不要

Convert_AD_VOL_ValueToChar(Vol);//轉(zhuǎn)換并發(fā)送本次數(shù)據(jù)
Pluckdelay(CAPDELAYTIME);//采集間隔時間,為ComBuf[4]*1000的時間常數(shù)
}
//從高到低取
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();//發(fā)送數(shù)據(jù)
}
//--------------------------------------------------------------------------//

//寫一個字節(jié)到AT24C04EEPROM
void WriteAT24C04()
{
uchar address,RomData;
address=ComBuf[1];
RomData=ComBuf[2];
WriteByte_24c04(RomData,address);
}

//讀取AT24C04EEPROM一個字節(jié)
void ReadAT24C04()
{
ComBuf[2]=ReadByte_24c04(ComBuf[1]);
SendByteArray();//發(fā)送數(shù)據(jù)
}

//=================================
// 看門狗設置
//=================================
//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];//顯示內(nèi)容
LED_BIT[ShowBit]=0x00;
LED_BIT[ShowBit]=ShowData;
TH0=(65536-4000)>>8;
TL0=(65536-4000)&0xff;
TR0=ComBuf[3];
if(ComBuf[3]) P0=0x00;//關(guān)閉顯示
}

/*=========================================
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];//關(guān)閉或啟動計時器
}
/*=========================================
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];//關(guān)閉或啟動計時器
}

//------------
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);//發(fā)送P1^0引腳狀態(tài)
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位計數(shù)器
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
EA=1;//中斷允許
//-------------

while(1)
{
WaitComm();//等待接收數(shù)據(jù)
//校對checksum校驗碼是否正確,如正確則進行相關(guān)的操作
if(ISCheckSUM())
{
switch (ComBuf[0])
{
case 0x01:WritePortData(); break; //響應上位機發(fā)送的寫操作
case 0x02:SendPortData(); break; //響應上位機發(fā)送的讀操作
case 0x03:SetEA();break; //中斷允許設定
case 0x04:GetAD();break; //TLC1549數(shù)據(jù)采集
case 0x05:GetAD_With_VOL_Filter();break;//采軟件濾軟件的TLC1549數(shù)據(jù)采集
case 0x06:CD4051_PickVol();break; //CD4051--8選1TLC1549采集
case 0x07:CD4051_LoopPickVol();break; //8路巡檢TLC1549采集
case 0x08:ReadAT24C04();break; //讀取AT24C04EEPROM一個字節(jié)
case 0x09:WriteAT24C04();break; //寫一個字節(jié)到AT24C04EEPROM
case 0x0a:SetLedData();break; //設定顯示的數(shù)據(jù)
case 0x0b:TestCapCount();break; //電容放電時間計數(shù)測試
case 0x0c:PluckPulse();break; //時序采集
case 0x0d:PWM();break; //控制P2_7模擬輸出PWM
}
}
else//如檢驗錯誤則返回上位機錯誤信息
{
ComBuf[0]=0xFF;
SendByteArray();//返回錯誤信息
}
}
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉