?? t0_int0_func.c
字號:
///////////////T0 對/INT0輸入信號脈寬測量/////////////////
//////////////////t0mesure.c/////////////////////////////////////////////
#include "c8051F020.h"
idata unsigned long interval0;
idata unsigned long t0flow=0;
xdata unsigned long detect_temp=0,detect_avg=0;
unsigned int i=0;
unsigned int j;
#define LEN 20
xdata unsigned long detect_result[LEN];//存放檢測數據,為LEN個數據,因為需要測量周期較大的波形,所以用長無符號整形
//idata unsigned char tempPage;
bit isnewdata;
void config()
{
//采用config.exe配置向導
//-----看門狗禁止,以方便調試-----//
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
// 交叉開關配置 將/INT0輸入管腳配到P0.0口 ,T0可不用配置//
XBR0 = 0x00;
XBR1 = 0x04; //INT0E=1(b2)=1,INT0鏈接到端口引腳
XBR2 = 0x40;
//系統時鐘配置,采用內部晶振//
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x87; // Internal Oscillator Control Register
//b7=1,使能時鐘丟失檢測器(時鐘丟失時間大于100ms將觸發復位),
//CLKSL(b3)=0,選擇內部晶振,IOSCEN(B2)=1,內部振蕩器使能
//IFCN1-0(B1-0)=11,內部振蕩器典型頻率為16MHz(實測頻率為17.239MHz)
//(2MHz實際檢測為2.1562166MHz)
//即每個時鐘為0.4637753us
P0MDOUT = 0x00;
}
void t0ini()
{
EA=0;
TF0=0; //TF0:定時器溢出標志位
TR0=1; //定時器允許控制位:0禁止;1允許
IT0=1;// /INT0中斷在電平下降沿觸發,0為低電平有效觸發
IE0=0;// 外部中斷/INT0中斷標志位清零,/INT0中斷中可硬件清零
CKCON=0x08;// CKCON:時鐘控制寄存器,T4M T2M T1M T0M(b6-3):0001(0為相應的定時器使用系統時鐘的12分頻)
//1為使用系統時鐘
TMOD=0x08;//當TR0=1且GATE0(b3)=1,C/T0(b2)=0為定時器功能(記錄由CKCON.3定義的時鐘加1)
// 選擇為T0為模式0(b1-0)=00,13bit定時器模式
TH0=0;
TL0=0xe0;//高3位在13bit模式下無效,不妨置1
ET0=1;//開啟T0中斷
EX0=1;//允許/INT0外部事件中斷
EA=1;//開啟全局中斷
}
void main()
{ bit flag;
config();
t0ini();
while(1)
{
if(isnewdata)//對測量值進行處理
{ detect_result[i]=interval0;
i++;
if(i>LEN-1)//在此設斷點,觀察程序運行結果
{i=0;
flag=1;
detect_temp=0;
detect_avg=0;
}
isnewdata=0;
}
if(flag==1)
{for(j=0;j<=LEN-1;j++)
detect_temp+=detect_result[j];
detect_avg=detect_temp/LEN;
flag=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;
}
void t0_ISR() interrupt 1
{//T0中斷處理
TF0=0;
t0flow++;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -