/*********************************************
兩路PCA外部脈沖周期計時器。分別使用P1.3與P1.4口。
針對測速碼盤。
PCA_dt0和PCA_dt1表示測量到的兩個脈沖各自的周期。最小到1ms。不精確。
diff_pulse中表示脈沖差數(shù)。
這個函數(shù)庫需要占用兩路PCA。但不占用定時器和外部中斷~
*********************************************/
#include "pulseFreq.h"
#include "serial.h"
int xdata pulse_diff; //脈沖差數(shù)
uint xdata pulse_count0;
uint xdata pulse_count1;
uint PCA_Count0; //P1.3周期計時
uint PCA_Count1; //P1.4周期計時
uint xdata PCA_dt0; //P1.3周期存儲
uint xdata PCA_dt1; //P1.4周期存儲
//計時器溢出時間
const uchar code CH_reload=(65535-TIME_RELOAD)/256; //計時器溢出時間,高8位
const uchar code CL_reload=(65535-TIME_RELOAD)%256; //計時器溢出時間,低8位
void pulse_Clear(){
pulse_diff=0;
pulse_count0=0;
pulse_count1=0;
PCA_Count0=0;
PCA_Count1=0;
PCA_dt0=0;
PCA_dt1=0;//初始化全體非戰(zhàn)斗人員清零。
}
void PulseFreq_Init(){
pulse_Clear();
CMOD=0x01;//系統(tǒng)時鐘/12,允許溢出中斷(這樣可以數(shù)更長的時間)
CCAPM0=0x31;
CCAPM1=0x31;//16位捕獲模式,由CCPn/PCAn的跳變觸發(fā)
CCON=0x40;//各種狀態(tài)位清零,開啟
//使用IO口為P1.3與P1.4
EA=1;
}
//1000 * 12 次時鐘頻 也就是1ms每次溢出中斷。
void PCA_isr() interrupt 7 using 1{
//PCA中斷,同時處理三種事件。定時器溢出和兩種脈沖。
if(CF==1){
CH=CH_reload;
CL=CL_reload;
CF=0;
PCA_Count0++;
PCA_Count1++;
if(PCA_dt0<PCA_Count0)PCA_dt0=PCA_Count0;
if(PCA_dt1<PCA_Count1)PCA_dt1=PCA_Count1;
}
if(CCF0==1){
//如果是P1.3產生的脈沖
CCF0=0;
//清標志位
pulse_diff++;
pulse_count0++;
PCA_dt0=PCA_Count0;
PCA_Count0=0;
// send_str("dt0: ");
// send_uint(PCA_dt0);
// send_ln();
}
if(CCF1==1){
//如果是P1.4產生的脈沖
CCF1=0;
//清標志位
pulse_diff--;
pulse_count1++;
PCA_dt1=PCA_Count1;
PCA_Count1=0;
// send_str("dt1: ");
// send_uint(PCA_dt1);
// send_ln();
}
}
uint Pulse_getPeriodTime(bit idx){
//獲取周期時間,面向外部調用。
if(idx==0){
return PCA_dt0;
}
else {
return PCA_dt1;
}
}
/*
void main(){
PulseFreq_Init();
Serial_Init();
while(1){
delay(10);
}
}
*/
|