QQ截圖20170429141324.png (39.22 KB, 下載次數(shù): 17)
下載附件
2017-4-29 14:46 上傳
QQ截圖20170326153801.png (70.58 KB, 下載次數(shù): 21)
下載附件
2017-4-29 14:46 上傳
- #include "STC89.h"
- #include "intrins.h"
- #include "process.h"
- #define CycleTime_Ultrasonic 10
- #define TR_Ultrasonic TR0
- #define TH_Ultrasonic TH0
- #define TL_Ultrasonic TL0
- #define ET_Ultrasonic ET0
- #define TMOD_Ultrasonic TMOD
- sbit FrontTrig=P2^2;
- sbit FrontEcho=P3^2;//accord to the selected timer, timer 0-->P32 timer 1--->P33
- void InitDistance(void);
- float GetDistance(void);
- void StartCheckDistance(void);
- #define AddWr 0x90 //寫數(shù)據(jù)地址 PCF8591 bit321為地址A0 A1 A2
- #define AddRd 0x91 //讀數(shù)據(jù)地址 PCF8591
- sbit SDA_PCF8591=P2^6;
- sbit SCL_PCF8591=P2^7;
- unsigned char ReadADC(unsigned char Chl);
- unsigned char SysTime;
- unsigned char SoundAdc;
- unsigned int LedShowData;
- unsigned char NumToShow=6;
- unsigned int DistanceData;
- sbit Key0=P0^4;
- unsigned char OldKey0,DisMode=0;
- void InitTimer2(void)
- {
- T2MOD = 0;
- T2CON = 0;
- RCAP2H = 0xFC;
- RCAP2L = 0x17;
- EA=1; //總中斷打開
- ET2=1; //定時器T2允許中斷
- TR2=1; //定時器T2開始工作
- }
- void et2(void) interrupt 5 using 0
- {
- TF2=0;
- SysTime++;
- }
- bit ack; //應答標志位
- /*------------------------------------------------
- 啟動總線
- ------------------------------------------------*/
- void Start_I2c()
- {
- SDA_PCF8591=1; //發(fā)送起始條件的數(shù)據(jù)信號
- _nop_();
- SCL_PCF8591=1;
- _nop_(); //起始條件建立時間大于4.7us,延時
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA_PCF8591=0; //發(fā)送起始信號
- _nop_(); //起始條件鎖定時間大于4μ
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL_PCF8591=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
- _nop_();
- _nop_();
- }
- /*------------------------------------------------
- 結束總線
- ------------------------------------------------*/
- void Stop_I2c()
- {
- SDA_PCF8591=0; //發(fā)送結束條件的數(shù)據(jù)信號
- _nop_(); //發(fā)送結束條件的時鐘信號
- SCL_PCF8591=1; //結束條件建立時間大于4μ
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA_PCF8591=1; //發(fā)送I2C總線結束信號
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*----------------------------------------------------------------
- 字節(jié)數(shù)據(jù)傳送函數(shù)
- 函數(shù)原型: void SendByte(unsigned char c);
- 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對
- 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假)
- 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。
- ------------------------------------------------------------------*/
- void SendByte(unsigned char c)
- {
- unsigned char BitCnt;
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
- {
- if((c<<BitCnt)&0x80)SDA_PCF8591=1; //判斷發(fā)送位
- else SDA_PCF8591=0;
- _nop_();
- SCL_PCF8591=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
- _nop_();
- _nop_(); //保證時鐘高電平周期大于4μ
- _nop_();
- _nop_();
- _nop_();
- SCL_PCF8591=0;
- }
-
- _nop_();
- _nop_();
- SDA_PCF8591=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位
- _nop_();
- _nop_();
- SCL_PCF8591=1;
- _nop_();
- _nop_();
- _nop_();
- if(SDA_PCF8591==1)ack=0;
- else ack=1; //判斷是否接收到應答信號
- SCL_PCF8591=0;
- _nop_();
- _nop_();
- }
- /*----------------------------------------------------------------
- 字節(jié)數(shù)據(jù)傳送函數(shù)
- 函數(shù)原型: unsigned char RcvByte();
- 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),
- 發(fā)完后請用應答函數(shù)。
- ------------------------------------------------------------------*/
- unsigned char RcvByte()
- {
- unsigned char retc;
- unsigned char BitCnt;
-
- retc=0;
- SDA_PCF8591=1; //置數(shù)據(jù)線為輸入方式
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- _nop_();
- SCL_PCF8591=0; //置時鐘線為低,準備接收數(shù)據(jù)位
- _nop_();
- _nop_(); //時鐘低電平周期大于4.7us
- _nop_();
- _nop_();
- _nop_();
- SCL_PCF8591=1; //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
- _nop_();
- _nop_();
- retc=retc<<1;
- if(SDA_PCF8591==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
- _nop_();
- _nop_();
- }
- SCL_PCF8591=0;
- _nop_();
- _nop_();
- return(retc);
- }
- /*----------------------------------------------------------------
- 非應答子函數(shù)
- 原型: void NoAck_I2c(void);
- ----------------------------------------------------------------*/
- void NoAck_I2c(void)
- {
-
- SDA_PCF8591=1;
- _nop_();
- _nop_();
- _nop_();
- SCL_PCF8591=1;
- _nop_();
- _nop_(); //時鐘低電平周期大于4μ
- _nop_();
- _nop_();
- _nop_();
- SCL_PCF8591=0; //清時鐘線,鉗住I2C總線以便繼續(xù)接收
- _nop_();
- _nop_();
- }
- /*------------------------------------------------
- 讀AD轉值程序
- 輸入?yún)?shù) Chl 表示需要轉換的通道,范圍從0-3
- 返回值范圍0-255
- ------------------------------------------------*/
- unsigned char ReadADC(unsigned char Chl)
- {
- unsigned char Val;
- Start_I2c(); //啟動總線
- SendByte(AddWr); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(0x00|Chl); //發(fā)送器件子地址
- if(ack==0)return(0);
- Start_I2c();
- SendByte(AddRd);
- if(ack==0)return(0);
- Val=RcvByte();
- NoAck_I2c(); //發(fā)送非應位
- Stop_I2c(); //結束總線
- Start_I2c();
- SendByte(AddRd);
- if(ack==0)return(0);
- Val=RcvByte();
- NoAck_I2c(); //發(fā)送非應位
- Stop_I2c(); //結束總線
- return(Val);
- }
- void InitDistance(void) //使用EX0口
- {
- TMOD_Ultrasonic |= 0x09;//打開GATE0 內(nèi)部時鐘計數(shù)模式
- ET_Ultrasonic=0;
- FrontTrig = 0;
- }
- void Delay(void)
- {
- unsigned i=10;
- while(i--)
- _nop_( );
- }
- void StartCheckDistance(void)
- {
- FrontTrig = 1;
- TH_Ultrasonic = 0;
- TL_Ultrasonic = 0;
- Delay();
- TR_Ultrasonic=1;
- FrontTrig = 0;
- }
- float GetDistance(void)//always return value ,unit:mm
- {
- static unsigned char DisTestStep,DisDelayTime;
- unsigned int FrontTime;
- static float DistanceData=0;
- switch(DisTestStep)
- {
- case 0:
- {
- StartCheckDistance();
- DisTestStep = 1;
- break;
- }
- case 1:
- {
- DisDelayTime++;
- if(DisDelayTime >= 30/CycleTime_Ultrasonic)
- {
- DisDelayTime = 0;
- DisTestStep = 2;
- }
- break;
- }
- case 2:
- {
- TR0 = 0;
- FrontTime = TH_Ultrasonic;
- FrontTime = FrontTime<<8;
- FrontTime = FrontTime+TL_Ultrasonic;
- DistanceData = FrontTime;
- DistanceData = DistanceData*0.17;
- DisTestStep = 3;
- break;
- }
- case 3:
- {
- DisDelayTime++;
- if(DisDelayTime >= 300/CycleTime_Ultrasonic)
- {
- DisDelayTime = 0;
- DisTestStep = 0;
- }
- break;
- }
- }
- return DistanceData;
- }
- main()
- {
- InitTimer2();
- //InitSci();
- InitDistance();
- for(;;)
- {
- StartPro(0);
- SoundAdc = ReadADC(3);
- DistanceData = GetDistance();
- if((OldKey0==0)&&(Key0==1))
- {
- DisMode = ~DisMode;
- }
- OldKey0 = Key0;
- if(DisMode == 0)
- {
- P25 = 0;
- if(DistanceData < 200)
- {
- NumToShow = 0;
- }
- else if(DistanceData > 800)
- {
- NumToShow = 12;
- }
- else
- {
- NumToShow = (DistanceData-200)/50;
- }
- }
- else
- {
- P25 = 1;
- if(SoundAdc < 62)
- {
- NumToShow = 0;
- }
- else if(SoundAdc > 110)
- {
- NumToShow = 12;
- }
- else
- {
- NumToShow = (SoundAdc-62)>>2;
- }
- }
- LedShowData = (0x0FFF>>NumToShow);
- P36 = LedShowData>>11;
- P35 = LedShowData>>10;
- P34 = LedShowData>>9;
- P33 = LedShowData>>8;
- P10 = LedShowData>>7;
- P11 = LedShowData>>6;
- P12 = LedShowData>>5;
- P13 = LedShowData>>4;
- P14 = LedShowData>>3;
- P15 = LedShowData>>2;
- P16 = LedShowData>>1;
- P17 = LedShowData;
-
- EndPro(10);
- }
- }
復制代碼
|