⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exp4.c

📁 the practice of proteus and avr
💻 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 + -