📄 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 + -