㈠ 51單片機和干簧管怎麼連接,怎麼用
干簧管,當有磁鐵靠近干簧開關時(反之亦然)干簧片就會關閉
在單片機中的應用一般是用來作檢測干簧管狀態(開關的通斷)來完成某種功能的檢測。
㈡ 如何將干簧管脈沖信號通過單片機實現到數碼管顯示
將干簧管脈沖信號通過單片機實現到數碼管顯示:
/********************************************************************
*文件名:TLC549.c
*描述:該程序實現了對TLC549的控制。通過TLC549把電壓轉換為數字信號並通過數碼管顯示出來。實際工作中進行AD采樣時,一般都要把AD信號處理後再用。在這里,採集了30次,去掉最大和最小的5個,中間20個取平均值,最大限度的保證了所要採集AD的准確性。
***********************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitAD_Out=P3^2;//TLC549輸出端
sbitCS=P1^0;//TLC549片選信號
sbitAD_In=P1^1;//TLC549輸入端
ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
ucharcodetable_d[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//帶點數碼管顯示
/********************************************************************
*名稱:AD_Change(void)
*功能:TLC549驅動程序,在「視頻及教程」中有講解。
*輸入:無
*輸出:temp(電壓值)
***********************************************************************/
ucharAD_Change(void)
{
uchari,temp=0;
CS=0;
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0;i<8;i++)
{
AD_In=1;
_nop_();
_nop_();
temp=temp<<1;
if(AD_Out==1)temp+=1;
AD_In=0;
_nop_();
_nop_();
}
CS=1;
returntemp;
}
/********************************************************************
*名稱:Delay()
*功能:延時,延時時間為1ms*del
*輸入:del
*輸出:無
***********************************************************************/
voidDelay(uintdel)
{
uchari,j;
for(i=0;i
for(j=0;j<=148;j++)
;
}
/***********************************************************************
*名稱:Average()
*功能:中位值平均濾波法,取一共三十個數據,最大和最小的五個數據不要
對中間的二十個數據求平均值
*輸入:三十個待處理的值
*輸出:得到一個中位的平均值
***********************************************************************/
uintAverage(uintbuffer[30])
{
uchari,j;
uinttemp;
for(i=1;i<30;i++)////先對整個數組的三十個值進行從小到大的排列
for(j=29;j>=i;--j)
{
if(buffer[j-1]>buffer[j])
{
temp=buffer[j-1];
buffer[j-1]=buffer[j];
buffer[j]=temp;
}
}
////對數組進行處理,去掉一個最大值和一個最小值,中間的二十個值再來求平均值
temp=0;
for(i=5;i<25;i++)
{
temp+=buffer[i];
}
temp=(uint)(((float)temp)/20+0.5);
return(temp);
}
/***********************************************************************
*名稱:AD_Filter()
*功能:進行AD採集30次,並進行濾波處理
*輸入:三十次AD採集值
*輸出:經過處理後的AD值
***********************************************************************/
uintAD_Filter()
{
uintDate_Buffer[30]={0},temp;
uchari;
for(i=0;i<30;i++)
{
Date_Buffer[i]=AD_Change();
Delay(1);//延時1毫秒採集一次。這里可以根據工作需要調整時間。
}
temp=Average(Date_Buffer);
return(temp);
}
/********************************************************************
*名稱:Main()
*功能:主函數
*輸入:無
*輸出:無
***********************************************************************/
voidMain()
{
uinti=0,temp;
uintj;
P2=0x00;
P1=0xff;
while(1)
{
temp=AD_Filter();
j=temp*2;
for(i=0;i<40;i++)
{
P0=table_d[j/100];
P2=0x04;
Delay(10);
P0=table[j/10%10];
P2=0x02;
Delay(10);
P0=table[j%10];
P2=0x01;
Delay(10);
}
}
}