exp4.c

来自「the practice of proteus and avr」· C语言 代码 · 共 51 行

C
51
字号
#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 + =
减小字号Ctrl + -
显示快捷键?