📄 exp4.c
字号:
#include <io8535.h>
#include <intrinsics.h>
#define pulse_out PORTC //定义端口C为脉宽输出端口
#define ICP PIND_Bit6 //定义ICP引脚
unsigned char ov_counter; //计数器1溢出
unsigned int rising_edge,falling_edge; //定义用于存储的变量
unsigned long pulse_clocks; //定义用于存储实际的时钟
#pragma vector=TIMER1_OVF1_vect
__interrupt void timer1_ovf_isr(void) //定义计数器1溢出中断服务程序
{
ov_counter++; //当发生溢出时,计数器自加
}
#pragma vector=TIMER1_CAPT1_vect
__interrupt void timer1_capt_isr(void) //定义计数器1捕获中断服务程序
{
//通过检测ICP引脚的电平,检测信号的上升沿或下降沿
//按照定义的ICP引脚触发类型,执行中断
if(ICP)
{
rising_edge=ICR1; //保存脉冲的起始时间
TCCR1B=TCCR1B&0xBF; //设置系统为下降沿触发
ov_counter=0; //清零本次溢出计数器
}
else
{
falling_edge=ICR1; //保存下降沿时间
TCCR1B=TCCR1B|0x40; //设置系统为上升沿触发
pulse_clocks=(unsigned long)falling_edge-(unsigned long)rising_edge+(unsigned long)ov_counter*0x1000;
//计算
pulse_out=pulse_clocks/500; //在C端口输出毫秒
}
}
void main(void)
{
DDRC=0xFF; //设置端口C为输出
PORTC=0xFF;
DDRD=0x00;
TCCR1B=0xC2; //设置计时器1的时钟为clock/8
//系统上升沿捕获,并具有消除噪声功能
TIMSK=0x24; //定义计时器1溢出中断和捕获中断
__enable_interrupt();
while(1)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -