?? t0mesure.c
字號:
///////////////T0 對/INT0輸入信號脈寬測量/////////////////
//////////////////t0mesure.c/////////////////////////////////////////////
#include "c8051F040.h"
idata unsigned int interval0;
idata unsigned char t0flow=0;
idata unsigned char tempPage;
bit isnewdata;
void config(){
//采用config.exe配置向導
//-----看門狗禁止,以方便調試-----//
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
// 交叉開關配置 將/INT0輸入管腳配到P0.0口 ,T0可不用配置//
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x04;
XBR2 = 0x40;
XBR3 = 0x00;
//系統時鐘配置,采用內部晶振,8分頻//
SFRPAGE = 0x0F;
CLKSEL = 0x00; // Oscillator Clock Selector
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x84; // Internal Oscillator Control Register
}
void t0ini(){
EA=0;
SFRPAGE=0x00;//這條指令很重要,否則以下操作無法寫入相應寄存器,與MCS-51略有不同
TF0=0;
TR0=0;
IT0=1;// /INT0中斷在電平下降沿觸發
IE0=0;// 外部中斷/INT0中斷標志位清零,/INT0中斷中可硬件清零
CKCON&=0xf0;
CKCON|=0x01;//T0時鐘采用系統時鐘4分頻
TMOD&=0xf0;
TMOD|=0x08;//T0為模式0,13bit定時器模式,脈寬測量使能
TH0=0;
TL0=0xe0;//高3位在13bit模式下無效,不妨置1
ET0=1;//全頁尋址,所以SFRPAGE不用指向其頁址,開啟T0中斷
EX0=1;//允許/INT0外部事件中斷
EA=1;//開啟全局中斷
}
void main(){
config();
t0ini();
while(1){
if(isnewdata){
//對測量值進行處理
isnewdata=0;
}
}
}
void int0_ISR() interrupt 0{//外部事件中斷處理
interval0=TH0<<5;//13bit 定時器,所以要左移5位
interval0+=TL0&0x1f;
interval0+=t0flow<<13;//加上T0溢出次數的處理,這樣T0便能測量長周期的事件寬度
t0flow=0;//需將溢出值復位,否則多次測量后會把溢出值累加
TH0=0;
TL0=0;
TR0=1;
isnewdata=1;
SFRPAGE=tempPage;
}
void t0_ISR() interrupt 1{//T0中斷處理
TF0=0;
t0flow++;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -