?? ultra_sonci.c
字號:
/////////PCA CEX0為高速輸出模式//////////////
/////////PCA CEX4 捕捉模式 測試程序/////////
/////////HighSpeedOut.c//////////////////////////
#include "mylcd.h"
#include "stdio.h"
#define ADJRATE 0.0111
extern bit isline0;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
enum {mesure_len=5};
uchar temppage;
xdata ulong pcacap4[mesure_len];
xdata uint compensate;
void pca0ini(){//CEX0為高速輸出模式,作為超聲波控制信號輸出
SFRPAGE = 0x00;
PCA0CPM0=0X4c;//CEX0中斷禁止
}
void CEX0_set(uint pram){//超聲波邏輯門延時補償
SFRPAGE = 0x00;
PCA0CP0=~pram+1;
PCA0CPM0|=0x40;//注意編譯時sfr16寄存器先寫高地址,再寫低地址
/*所以編譯結果使得最后寫PCA0CPL0,將使得ECOM0清零,故加此句置1,否則輸出電平翻轉不生效*/
}
void pca4ini(){//PCA CEX4配置為正邊沿捕捉
SFRPAGE=0x00;
PCA0CPM4 = 0x21; // 正邊沿觸發模式,CEX4捕捉中斷使能
PCA0CPL4 = 0x00;
PCA0CPH4 = 0x00;
}
void pca1ini(){//PCA CEX1配置為正負邊沿均捕捉
SFRPAGE=0x00;
PCA0CPM1 = 0x21; // 正邊沿觸發模式,CEX1捕捉中斷使能
PCA0CPL1 = 0x00;
PCA0CPH1 = 0x00;
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x08;//PCA采用系統時鐘,且PCA溢出中斷開啟
PCA0CN=0x40;//啟動PCA計數器
EIE1|=0x08;//PCA中斷使能
}
void dispini(){ //lcd顯示初始化
delay1ms(100);
SFRPAGE=0xf;
lcdcs=0;
lcdrs=1;
lcdrw=1;
delay1ms(30);
sendc(0x38);//8位,2行,5*7字體
delay1ms(100);
sendc(0x0c);//顯示開,光標關;不閃
delay1ms(100);
sendc(0x06);//增量方式,現不移動
delay1ms(100);
sendc(0x01);//清屏
delay1ms(100);
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關配置,CEX0-CEX05配置在P0.0-P0.5
XBR0 = 0x30;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管腳輸出配置,P0口為開漏輸出,其中P0.0接上拉電阻,驅動超聲波控制信號
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口為開漏輸出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口為開漏
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口為數字輸入,沒有模擬輸入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(void){
uchar i;
xdata float disval;
xdata ulong temp;
config();
dispini();
pca0ini();
EA=1;
pcaini();
pca4ini();
pca1ini();
CEX0_set(4);//設置補償時間
isline0=1;
printf("\nULTRA_SONIC V1.0");
while(1){
for(i=0,temp=0;i<mesure_len;i++)
temp+=pcacap4[i];
temp/=mesure_len;
temp>>=1;
/*所測得的是往返程時間,故要除2得到單程時間,注意不能寫成temp/=2,可寫成temp/=2L*/
disval=(float)temp*ADJRATE;
isline0=0;
printf("\ndisval=%.1fcm",disval);
delay1ms(500);
}
}
void PCA_ISR(void) interrupt 9 {
static xdata uchar num1=0;
if(CCF4){
pcacap4[num1]=PCA0CP4;
num1++;
if(num1>=mesure_len){
num1=0;
}
CCF4=0;
}
if(CCF1){
compensate=PCA0CP1;
CCF1=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -