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

📄 celiang.h

📁 脉冲宽度的测量
💻 H
字号:

#ifndef CeLiang_Program_
#define CeLiang_Program_

typedef struct times
{  	uchar second;       //秒级
    uint m_second;     //毫秒级
}TIME;

data uchar puls_num;         //脉冲次数
data uchar  flag;                 //开始计时标志
xdata TIME time[65];         //每次脉冲的时间
data uchar max;              //测量总次数

//中断系统初始化
void int0_initial()
{  flag=1;
   TMOD = 0x10;    // T1使用定时模式,工作模式1,无门控位
   TH1  = 0x4C;     // 为T1填入初值,定时时间50ms
   TL1  = 0x00;
   IT0  = 1;    // 设置INTR0中断方式为边沿触发方式,负跳变时产生中断
   PT1  = 1;    // 设置定时器1中断为高优先级
   EX0  = 1;    // 允许外部中断0中断
   EA   = 1;    // CPU开放中断
}


/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 3		//不同级别的中断函数使用不同的工作组
{   TR1=0;
    TH1 = 0xFC;                          // 重新填入初值,每次溢出间隔1ms,1ms初值是0xFC,0x66,  
    TL1 = 0xA5;                          // 考虑中断处理的时间,此处作了修正,即每次减少68.3us;    
    time[puls_num].m_second++;           //此修已在Proteus验证得到,在频率介于1-50Hz中,误差低于
    TR1=1;                               //1ms
}



/* 外部中断0处理函数 */
void intr0_int() interrupt 0 using 0		// INTR0中断,使用工作组2
{  TR1=0;

   if(flag)
   {  flag=0;
      TR1=1;
      ET1=1;
	  puls_num=0;
   }

   EA = 0;                   // 关中断
   if(time[puls_num].m_second>=1000)           // 计时满1s
   {  time[puls_num].second=time[puls_num].m_second/1000;             // 清0
      time[puls_num].m_second=time[puls_num].m_second-time[puls_num].second*1000; 
	  // 总秒数增1,溢出时会自动归0
   }

   puls_num++;
   TH1 = 0xFC;                                 // 重新填入初值,每次溢出间隔1ms  
   TL1 = 0xA8;
   EA = 1;                                     // 开中断
   TR1=1;

   if(puls_num>=max)
   {  EA=0;
      TR1=0;
   }

} 
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -