?? highspeedout.c
字號:
/////////PCA CEX0為高速輸出模式//////////////
/////////PCA CEX4 捕捉模式 測試程序/////////
/////////HighSpeedOut.c//////////////////////////
#include <C8051F040.h>
#define CEX0PORT p00
#define TESTPORT p00
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
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;
sbit p07=P0^7;
sbit p00=P0^0;
bit iscex0H;
uchar temppage;
xdata ulong pcacap4[10];
uint cex0L,cex0H;
void delay1ms(uint time){//延遲1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void pca0ini(){//CEX0為高速輸出模式
SFRPAGE = 0x00;
PCA0CPM0=0X4d;
}
void CEX0_out(uint h,uint l){
cex0L=l;
cex0H=h;
CEX0PORT=1;//CEX0初始時刻輸出為1
iscex0H=1;
}
void CEX0_set(uint pram){//將PCA0CP0偏移pram個PCA時鐘
SFRPAGE = 0x00;
PCA0CP0+=pram;
PCA0CPM0|=0x40;//注意編譯時sfr16寄存器先寫高地址,再寫低地址
//所以編譯結果使得最后寫PCA0CPL0,將使得ECOM0清零,故加此句置1
}
void pca4ini(){//PCA CEX4配置為正負邊沿均捕捉
SFRPAGE=0x00;
PCA0CPM4 = 0x31; // 正負邊沿觸發模式,CEX4捕捉中斷使能
PCA0CPL4 = 0x00;
PCA0CPH4 = 0x00;
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x09;//PCA采用系統時鐘,且PCA溢出中斷開啟
PCA0CN=0x40;//啟動PCA計數器
EIE1|=0x08;//PCA中斷使能
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關配置,CEX4配置在P0.4
XBR0 = 0x30;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管腳輸出配置,P0口為開漏輸出,其中P0.6接上拉電阻,P0為數字輸入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(void){//測試時將P0.4與P0.0口相連
xdata uint tmph,tmpl;
config();
pca0ini();
EA=1;
pcaini();
pca4ini();
p00=0;
tmph=500;tmpl=2000;
CEX0_out(tmph,tmpl);
while(1){
CEX0_out(tmph,tmpl);
delay1ms(2000);
tmph+=10;
tmpl-=10;
if(tmph>=2000){
tmph=100;
tmpl=400;
}
}
}
void PCA_ISR(void) interrupt 9 {
static xdata uchar num1=0,cfnum=0;
static xdata uint tmpcnt=0;
if(CF){
cfnum++;
CF=0;
}
if(CCF4){
if(PCA0CP4<tmpcnt)
cfnum--;
pcacap4[num1]=PCA0CP4-tmpcnt;
pcacap4[num1]+=65536L*cfnum;
tmpcnt=PCA0CP4;
if(!TESTPORT)
pcacap4[num1]+=10000000L;
num1++;
cfnum=0;
if(num1>=10){
num1=0;
}
CCF4=0;
}
if(CCF0){
if(iscex0H){
CEX0_set(cex0L);
iscex0H=0;
}
else{
CEX0_set(cex0H);
iscex0H=1;
}
p07=iscex0H;
CCF0=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -