专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

用51单片机的外部中断来测频率

作者:佚名   来源:本站原创   点击数:  更新时间:2010年08月08日   【字体:
//晶振:12M
//实验方法:首先要把51hei单片机开发板上的ne555的方波输出信号J7的第一脚用杜邦线
//        引入P3.2口,数码管即可显示ne555震荡电路当前的频率值,旋动PR1电位器可
//        发现数字有变化.
//原理:1秒钟内计数外部脉冲个数,如计数1000次,则表示频率为1000Hz
//1秒钟定时采用51单片机定时器0实现,外部脉冲由外部中断0引脚接入 
#include<reg51.h>
#include"51hei.h"
#define uchar unsigned char
uchar counter1;
sbit duan=P2^6;     //74HC573的LE端  U5  LED的段选端
sbit wei=P2^7;      //74HC573的LE端  U4  LED的位选端
unsigned int counter2,tmp; 
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阳型数码管0—9显示  
unsigned int dis[6];                
uchar con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //共阳型数码管控制端   
init();
delay(uchar);
display(); 
jishu();


void main()
{guandz();
 init();
 while(1)
 {
    jishu();
    }    
}
//定时器0和外部中断0的初始化 
init()
{  
 EA=1;
 EX0=1;
 ET0=1;
 IT0=1; 
 TMOD=0x01;
 TH0=0x3c;
 TL0=0xaf;
 TR0=1;
}

//延时程序 
delay(uchar x)
{
 uchar a,b;
 for(a=x;a>0;a--)
  for(b=20;b>0;b--);
}
//外部中断0中断程序 
void external0()  interrupt 0
{
    tmp++;
   
}

//定时器0中断程序 
void timer0()  interrupt 1
{ 
 TH0=0x3c;
 TL0=0xaf;
 counter1++; 
}

//显示程序 
display()
{
 uchar i;
    dis[0]=counter2/10000; //获取计数值的万位
 dis[5]=counter2%10000;
 dis[1]=dis[5]/1000;     // 获取计数值的千位
 dis[5]=dis[5]%1000;
 dis[2]=dis[5]/100;    // 获取计数值的百位
 dis[5]=dis[5]%100;
 dis[3]=dis[5]/10;    // 获取计数值的十位
 dis[4]=dis[5]%10;    // 获取计数值的个位
 for(i=0;i<5;i++)  //依次显示万、千、百、十、个位,动态显示
  {
     // P0=0xff;
   P0=con[i];
   wei=1;
   wei=0;
   P0=table[dis[i]];
   duan=1;
   duan=0;
   delay(1);
   P0=0;
   duan=1;
   duan=0;
  }  
}

jishu()
{
  if(counter1==20)   //定时器定时50ms,故20次中断就表示1秒钟到达 
    {
  counter2=tmp;
  display();
  tmp=0;
  counter1=0;
  }
   else
     display();
}
关闭窗口

相关文章