?? wpcacapture.c
字號:
//參考程序B:WPCACAPTURE.C 用PCA模塊0負邊沿觸發的捕捉方式測量方波的頻
//率.測量固定頻率方波的100個周期的時間寬度,再求平均,可得方波的頻率和
//周期.測量結果用LCD顯示. 打開VIEW/DEBUG WINDOW/SFR'S/PCA窗口,
// 可直接從PCA0CPH0和PCA0CPL0中看到十六進制表達的測量結果.
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BELL=P3^5;
unsigned char *lcdpoint; /*指向 lcddata數組的指針*/
void SYSCLK_Init (void); /*時鐘初始化*/
void LCD_Init(void); /*LCD初始化*/
void LCD_disp_line1(void); /*顯示第一行數據*/
void LCD_disp_line2(void); /*顯示第二行數據*/
void handle(void); /*處理數據*/
void delay(uchar time);//延時
void PORT_Init (void); //I/O口初始化
void PCA_Init (void); //PCA初始化
void PCA_ISR (void); //PCA中斷服務子程序
float freq,data0;
unsigned int i,j,data2;
unsigned char FRE[8]={" FREQ: "},KHZ[10]={0x0,0x00,0x0,0x0,"Khz"};
signed char T[8]={" TIME: "},TIME0[10]={0x0,0x00,0x0,0x0,0x0,"us"};
unsigned char aa,bb,cc,ee;
void main (void) {
BELL=1;
/*關看門狗*/
WDTCN = 0xde;
WDTCN = 0xad;
LCD_Init(); /*LCD初始化*/
SYSCLK_Init (); /*時鐘初始化*/
PORT_Init (); /*IO口初始化*/
BELL = 0; /*響蜂鳴器*/
delay(100); /* 延時*/
BELL =1; /*關閉蜂鳴器*/
while (1) {
j=0;
EA = 1; /*開中斷*/
PCA_Init (); /*PCA初始化*/
while (j<0x64) ; /*PCA發生中斷100次 到否?;*/
PCA0CN=0x0; /*禁止PCA定時器/計數器*/
EIE1 = 0x0; /*禁止PCA0中斷*/
handle(); /*處理數據*/
LCD_disp_line1();
LCD_disp_line2();
delay(65000); /* 延時*/
delay(65000); /* 延時*/
delay(65000); /* 延時*/
delay(65000); /* 延時*/
delay(65000); /* 延時*/
delay(65000); /* 延時*/
delay(65000); /* 延時*/
}
}
void handle(void)/*處理數據*/
{
data0=(PCA0CPH0*256+PCA0CPL0);/*處理來自PCA0CPH0,CA0CPL0的數據*/
data0=(PCA0CPH0*256+PCA0CPL0)/11.0592;
freq=(100000)/data0; /*計算被測波形的頻率*/
aa=data0/1000; //計算周期(TIME)
bb=(data0-aa*1000)/100;
cc=(data0-aa*1000-bb*100)/10;
ee=(data0-aa*1000-bb*100-cc*10);
TIME0[0]=aa; //存放萬位數
TIME0[1]=bb; //存放千位數
TIME0[2]=0x2e; //"."
TIME0[3]=cc; //存放百位數
TIME0[4]=ee; //存放十位數
aa=freq/1000; //計算頻率(FREQ)
bb=(freq-aa*1000)/100;
cc=(freq-aa*1000-bb*100)/10;
ee=(freq-aa*1000-bb*100-cc*10);
KHZ[0]=aa; //存放千位數
KHZ[1]=bb; //存放百位數
KHZ[2]=cc; //存放十位數
KHZ[3]=ee; //存放個位數
}
void PORT_Init (void) //I/O口初始化
{
XBR0 = 0x08; //CEX0-->P0.0
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P74OUT = 0xf0; /*P6,P7為推挽輸出*/
}
void PCA_Init (void) //PCA初始化
{
EIE1 = 0x08; /*使能PCA0中斷*/
PCA0MD = 0x09; /*PCA定時器時鐘源SYSCLK選擇:01(1/12),03(1/4),09(1)*/
PCA0L = 0x00;
PCA0H = 0x00;
PCA0CPM0 = 0x11;/*PCA0負邊沿捕捉方式,CCF0=1,允許輔捉/比較標志的中斷申請*/
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
PCA0CN=0x40; /*允許PCA定時器/計數器*/
}
/*PCA中斷服務子程序*/
void PCA_ISR (void) interrupt 9
{
j++; /*計中斷次數*/
CCF0 = 0; /*清匹配中斷標志*/
}
void delay(uint time) //延時
{
uint k,h;
for(h=0;h<time;h++)
for(k=0;k<0x900;k++);
}
void LCD_disp_line1(void)
{ uint x;
unsigned data1,count;
P7=0x80; // 顯示第一行,DDRAM地址為00
P6 = 0x1;
P6 = 0x0;
for(x=0;x<1000;x++);
lcdpoint=&T;
for(count=8;count>0;count--) //顯示文字"TIME :"
{
data1=*lcdpoint;
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<1000;x++);
} //準備送數據
lcdpoint=&TIME0;
for(count=7;count>0;count--) //顯示數字"XXXXXns"
{
data1=*lcdpoint;
if(data1<0x40)
if(data1 !=0x2e)
data1 += 0x30; /*轉化成ASCII碼*/
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<100;x++);
}
}
void LCD_disp_line2(void)// 顯示第二行
{ uint x;
unsigned data1,count;
P7=0xc0; // 顯示第二行,DDRAM地址為40H
P6 = 0x1;
P6 = 0x0;
for(x=0;x<1000;x++);
lcdpoint=&FRE; //顯示文字"FREQUENCE :"
for(count=8;count>0;count--)
{
data1=*lcdpoint;
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<1000;x++);
} //準備送數據
lcdpoint=&KHZ;
for(count=7;count>0;count--) //顯示數字"XXXXKhz"
{ data1=*lcdpoint;
if(data1<0x40)
data1 += 0x30; /*轉化成ASCII碼*/
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<100;x++);
}
}
void LCD_Init(void) /*LCD初始化*/
{ uint x;
P6 = 0x09;
for(x=0;x<50000;x++);
//P7 = 0x30; /*設定一行顯示*/
P7 = 0x38; /*設定兩行顯示*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7 = 0x0e; /*顯示開,光標顯示,光標不閃爍*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7= 0x06; /*顯示增加,不平移*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
P7 = 0x01; /*清屏*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
}
void SYSCLK_Init (void) /*時鐘初始化*/
{
int k; /*延時計數器*/
OSCXCN = 0x67; /*啟動外部晶振*/
for (k=0; k < 255; k++) ; /*等待外部晶體起振*/
while ((OSCXCN & 0x80)==0x00) ; /*查詢標志位*/
OSCICN=0x88 ; /* 選擇外部時鐘為11.0592MHZ*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -