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

📄 celiang.c

📁 脉冲宽度的测量
💻 C
字号:
#include <regX51.H>
#define _MHZ_ 11.0592    // 设置单片机使用的晶振频率

typedef unsigned char uchar;
typedef struct time
{  uchar second;       //秒级
   uchar m_second;     //50毫秒级
   uchar mm_second_1;  //计数器高8位,12/_MHZ_秒级
   uchar mm_second_2;  //计数器低8位
   long  sum;          //时间
}TIME;

uchar puls_num;        //脉冲次数
uchar  flag;            //开始计时标志
TIME time[65];         //每次脉冲的时间

void main()
{  flag=1;	

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

/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 3		//不同级别的中断函数使用不同的工作组
{   TH1 = 0x4C;                                 // 重新填入初值,每次溢出间隔50ms  
    TL1 = 0x00;                                        
    time[puls_num].m_second++;
    if(time[puls_num].m_second==20)           // 计时满1s
    {  time[puls_num].m_second=0;             // 清0
       time[puls_num].second++;             // 总秒数增1,溢出时会自动归0
    }
}


/* 外部中断0处理函数 */
void intr0_int() interrupt 0 using 2		// INTR0中断,使用工作组2
{  unsigned char tmp1,tmp2;
   if(flag)
   {  flag=0;
      TR1=1;
      ET1=1;
   }
   puls_num++;
   EA = 0;                   // 关中断
   do                        // 读取T1中的内容
   { tmp1 = TH1;
     tmp2 = TL1;
   }while(tmp1 != TH1);     // 数据无效则反复循环
   time[puls_num].mm_second_1=tmp1;   //在这里不进行时间处理,减少中断处理时间
   time[puls_num].mm_second_2=tmp2;
   EA = 1;                  // 开中断
   if(puls_num==64)
   {  EA=0;
   }
} 

⌨️ 快捷键说明

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