?? pwm_pulse.c
字號:
//**********************CCU_CAPTURE.C****************************
//程序功能:對一方波的每一次電平跳變進行捕獲,并用捕獲值計算方波的
//脈沖寬度,占空比,周期或其他。
//***************************************************************
#include "reg932.h"
#define uchar unsigned char
sbit KEY1=P0^0;
uchar Temp;
uchar Int1; //第一次捕獲標志位
uchar Int2; //第二次捕獲標志位
uchar buff[];
void Display();
void CCU_init();
//----------------------------------
//功能:CCU中斷服務程序
//----------------------------------
void CCU_isr() interrupt 11{
EA=0;
Temp=TISE2;
Temp&=0x07;
if(Temp==0x06) //判斷是否為ICA捕獲中斷
{
if(Int1==1) //判斷是否為第二次中斷
{
buff[2]=ICRAL; //第二次捕獲值低字節
buff[3]=ICRAH; //第二次捕獲值高字節
CCCRA=0x01; //設置為上升沿捕獲
Int2=1; //標志已經產生第二次中斷
}
if(Int2==1) //判斷是否為第三次中斷
{
TCR20=0x00; //停止CCU定時器計時
buff[4]=ICRAL; //第三次捕獲值低字節
buff[5]=ICRAH; //第三次捕獲值高字節
Display();
Int1=0; //清0 第一次捕獲標志位
Int2=0; //清0 第二次捕獲標志位
}
buff[0]=ICRAL; //第一次捕獲值低字節
buff[1]=ICRAH; //第一次捕獲值高字節
CCCRA=0x00; //設置為下降沿捕獲
Int1=1; //標志已經產生第一次中斷
}
TIFR2=0;
EA=1;
}
//----------------------------------
//功能:主函數
//----------------------------------
void main()
{
P2M1=0x00;
P2M2=0x00; //端口初始化
while(1)
{
if(KEY1==0) //當KEY1按下,中斷使能,系統開始工作。
{
while(!KEY1); //等待按鍵松開
CCU_init(); //調用CCU初始化模塊
}
}
}
//----------------------------------
//功能:CCU初始化程序
//----------------------------------
void CCU_init()
{
TPCR2H=0x00;
TPCR2L=0x05; //CCU定時器5分頻
TOR2H=0x00;
TOR2L=0x00; //設置定時器重裝值
CCCRA=0x10; //設置捕獲模式,上升沿捕獲,捕獲延遲0.
TICR2=0x01; //使能輸入捕獲通道A.
ECCU=1; //CCU中斷使能。
EA=1;
TCR20=0x01; //設置CCU基本定時器功能,遞增計數
}
//----------------------------------
//功能:這里可構造您自己的數據處理函數
//----------------------------------
void Display()
{
//...... 這里請添加你自己的語句,例 高電平脈寬=(buff_3,buff_2)-(buff_1,buff_0)
//...... 對得到的數據進行處理,獲取所需的值
//...... 并顯示或者傳送給上位機
}
//*************************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -