/********************************************************************
*?文件名:?TLC549.c
*?說明:本程序實現了對TLC549的控制。電壓由TLC549轉換成數字信號,由數碼管顯示。在實際工作中,當對AD進行采樣時,通常在使用前對AD信號進行處理。這裏采集30次,去掉最大最小的5次,取中間20次的平均值,最大程度的保證了待采集廣告的準確性。
***********************************************************************/
#包括
#包括
#定義?烏恰爾?未簽名?茶
#定義?uintunsigned?int?
sbit?AD_Out?=?p3^2;//TLC549輸出端
sbit?CS?=?p1^0;?//TLC549芯片選擇信號
sbit?AD_In?=?p1^1;//TLC549輸入端子
烏恰爾?代碼?表[10]?=?{0x03,?0x9f,?0x25,?0x0d,?0x99,?0x49,?0x41,?0x1f,?0x01,?0x 09 };
烏恰爾?代碼?table_d[10]?=?{0x02,?0x9e,?0x24,?0x0c,?0x98,?0x48,?0x40,?0x1e,?0x00,?0x 08 };?//用點數碼管顯示
/********************************************************************
*?名字?:?AD_Change(無效)
*?功能?:?TLC549驅動,在“視頻和教程”中有解釋。
*?輸入?:?沒有
*?輸出?:?臨時工?(電壓值)
***********************************************************************/
烏恰爾?AD_Change(無效)
{
烏恰爾?我,臨時工?=?0;
CS?=?0;
_ nop _();
_ nop _();
_ nop _();
_ nop _();
for(I = 0;?我& lt8;?i++)
{
AD_In?=?1;
_ nop _();
_ nop _();
臨時工?=?臨時工?& lt& lt?1;
如果(AD_Out?==?1)?臨時工?+=?1;
AD_In?=?0;
_ nop _();
_ nop _();
}
CS?=?1;
回歸?溫度;?
}
/********************************************************************
*?名字?:?延遲()
*?功能?:?拖延,拖延的時間是?1ms?*?倒三角形
*?輸入?:?倒三角形
*?輸出?:?沒有
***********************************************************************/
作廢?延遲(uint?del)
{
烏恰爾?我,?j;
for(I = 0;?我
for(j = 0;?j & lt=148;?j++)
;?
}
/***********************************************************************
*?名字?說:?平均值()
*?工作?可以:中值平均濾波法,取壹個* * * 30的數據,不要最大最小的五個數據。
平均中間的二十個數據。
*?輸?輸入:?要處理的30個值
*?輸?出局:得到壹個中值平均值。
***********************************************************************/
uint?平均(uint?緩沖區[30])
{
烏恰爾?I,j;
uint?溫度;
for(I = 1;?我& lt30;?i++)///首先將整個數組的三十個值從小到大排列。
for(j = 29;?j & gt= I;?- j)
{
if(buffer[j-1]?& gt?緩沖區[j])
{
臨時工?=?緩沖劑[j-1];
緩沖區[j-1]?=?buffer[j];
buffer[j]?=?溫度;
}
}
////處理數組,去掉壹個最大值和壹個最小值,取中間二十個值的平均值。
臨時工?=?0;
for(I = 5;?我& lt25;?i++)
{
臨時工?+=?緩沖區[I];
}?
臨時工?=?(浮點)溫度?/?20?+?0.5);
返回(臨時);
}
/***********************************************************************
*?名字?說:?AD_Filter()
*?工作?燦:廣告收集30次,過濾。
*?輸?輸入:?三十個AD采集值
*?輸?輸出:處理後的廣告價值。
***********************************************************************/
uint?AD_Filter()
{
uint?日期緩沖區[30]?=?{0},?溫度;?
烏恰爾?我;
for(I = 0;?我& lt30;?i++)
{
日期緩沖區[i]?=?AD _ Change();
延時(1);?//延時1ms采集壹次。您可以根據工作需要調整這裏的時間。
}
臨時工?=?average(Date _ Buffer);
返回(臨時);
}
/********************************************************************
*?名字?:?主()
*?功能?:?主要功能
*?輸入?:?沒有
*?輸出?:?沒有
***********************************************************************/
作廢?主()
{
uint?我?=?0,temp?
uint?j;
P2?=?0x00
P1?=?0xff
while(1)
{
臨時工?=?AD _ Filter();
j?=?臨時工?*?2;
for(I = 0;?我& lt40;?i++)?
{
P0?=?table_d[j?/?100];
P2?=?0x04
延時(10);
P0?=?表[j/?10?%?10];
P2?=?0x02
延時(10);
P0?=?表[j?%?10];
P2?=?0x 01;
延時(10);
}
}
}