專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

用51單片機的外部中斷來測頻率

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2010年08月08日   【字體:
//晶振:12M
//實驗方法:首先要把51hei單片機開發(fā)板上的ne555的方波輸出信號J7的第一腳用杜邦線
//        引入P3.2口,數(shù)碼管即可顯示ne555震蕩電路當前的頻率值,旋動PR1電位器可
//        發(fā)現(xiàn)數(shù)字有變化.
//原理:1秒鐘內計數(shù)外部脈沖個數(shù),如計數(shù)1000次,則表示頻率為1000Hz
//1秒鐘定時采用51單片機定時器0實現(xiàn),外部脈沖由外部中斷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}; // 共陽型數(shù)碼管0—9顯示  
unsigned int dis[6];                
uchar con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //共陽型數(shù)碼管控制端   
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; //獲取計數(shù)值的萬位
 dis[5]=counter2%10000;
 dis[1]=dis[5]/1000;     // 獲取計數(shù)值的千位
 dis[5]=dis[5]%1000;
 dis[2]=dis[5]/100;    // 獲取計數(shù)值的百位
 dis[5]=dis[5]%100;
 dis[3]=dis[5]/10;    // 獲取計數(shù)值的十位
 dis[4]=dis[5]%10;    // 獲取計數(shù)值的個位
 for(i=0;i<5;i++)  //依次顯示萬、千、百、十、個位,動態(tà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();
}
關閉窗口

相關文章