|
最近在做紅外測(cè)距實(shí)驗(yàn),用的是2Y0A21紅外傳感器,外加外置的ADC0809轉(zhuǎn)換模塊連接到單片機(jī)中,用數(shù)碼管顯示出測(cè)到的距離,程序在下面,紅外模塊和ADC的連線應(yīng)該沒有錯(cuò)誤,但是不能測(cè)到距離,數(shù)碼管總是顯示000,求大神幫助為什么不能測(cè)出距離;PS:我的單片機(jī)數(shù)碼管顯示程序是正確的,程序編譯后沒有錯(cuò)誤沒有警告
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit ST = P3^0;
- sbit OE = P3^1;
- sbit EOC = P3^2;
- sbit CLK = P3^3;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit adress_A=P1^0; //這是定義ADIN0輸入
- sbit adress_B=P1^1;
- sbit adress_C=P1^2;
- uchar DisplayData[8]; //數(shù)碼管顯示數(shù)組
- uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d,
- 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c,
- 0x39 , 0x5e , 0x79 , 0x71} ;
- void delayms(uint a) //延時(shí)函數(shù)
- {
- uint c,d;
- for(c=a;c>0;c--)
- for(d=110;d>0;d--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : datapros()
- * 函數(shù)功能 :AD讀取處理轉(zhuǎn)換函數(shù)
- * 輸 入 : temp
- * 輸 出 : 無
- *******************************************************************************/
- void datapros(int temp) //數(shù)據(jù)轉(zhuǎn)換函數(shù),用來轉(zhuǎn)換由AD轉(zhuǎn)換而來的電壓值,以便讓數(shù)碼管顯示
- {
- DisplayData[0] = 0x00;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- DisplayData[1]=table[temp/100];
- DisplayData[2]=table[temp%100/10];
- DisplayData[3]=table[temp%100%10];
- }
- /*******************************************************************************
- * 函數(shù)名 :DigDisplay()
- * 函數(shù)功能 :數(shù)碼管顯示函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<3;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- }
- P0=DisplayData[3-i];//發(fā)送數(shù)據(jù)
- delayms(5); //間隔一段時(shí)間掃描
- P0=0x00;//消隱
- }
- }
- void ADC0809 () //ADC0809啟動(dòng)程序
- {
- long int temp;
- long int temp1;
- adress_A=0;adress_B=0;adress_C=0; //選擇IN0作為模擬信號(hào)輸入
- ST=0; //START下降沿時(shí)啟動(dòng)芯片,開始進(jìn)行A/D轉(zhuǎn)換,轉(zhuǎn)換期間保持低電平
- OE=0;
- delayms(10);
- while(1)
- {
- ST=1;ST=0;
- CLK=1; //用作AD的時(shí)鐘
- CLK=0;
- CLK=1;
- CLK=0; //給一個(gè)脈沖,上升沿寄存器復(fù)位,下降沿AD轉(zhuǎn)換開始
- while(!EOC)
- {
- CLK=1;
- CLK=0;
- } //當(dāng)EOC為1時(shí),轉(zhuǎn)換結(jié)束
- OE=1; //寄存器數(shù)據(jù)輸出到D0-D7
- temp=P0;
- OE=0; //DO-D7復(fù)位
- temp1=(temp*500)/256; //AD值轉(zhuǎn)換成電壓值(V=AD*VREF/256)
- //顯示AD值
- datapros(temp1); //先轉(zhuǎn)換數(shù)據(jù)
- DigDisplay();
- }
- }
- void main()
- {
- ADC0809 ();
-
- }
復(fù)制代碼
|
|