電子開發網

電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

單片機頻率計C程序

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2011-6-6

//---------函數聲明,變量定義--------------------------
#include <reg51.h>
sbit     GATE=P3^0;             //預制門限
sbit     CLR =P3^1;             //請零
sbit     RGATE=P3^2;            //實際門限
sbit     SEL0=P3^4;             //數據選擇位0
sbit     SEL1=P3^5;             //數據選擇位1
sbit     SEL2=P3^6;             //數據選擇位2
#define  data_in  P1
unsigned char Nx[4];         //待測頻率計數值
unsigned char Ns[4];         //標準頻率計數值
unsigned char GATE_time=1;   //門限時間,預定義為1S
unsigned char time_count;
bit PRE_judge=1;
//-----------------------變量聲明---------------------------------------------------------------------
void system_init(void );      //初始化,設置定時器0的工作方式,供主程序調用
void TIMER0_SCANkey();        //定時器0中斷處理函數

//--------------------------------------------------------------------------------------------------
// 函數名稱: system_init()
// 函數功能: 初始化設置
//            設定INT0的工作方式
//--------------------------------------------------------------------------------------------------
void system_init(void )  
             {
              TMOD=0x01; //定時器0工作在方式1
              ET0=1;     //定時器0中斷允許
              TH0=-5000/256;  //12M時鐘時,定時0.01秒
              TL0=-5000%256;
              TR0=1;     //定時器0開始計數
              EA=1;      //系統中斷允許
              }
//--------------------------------------------------------------------------------------------------
// 函數名稱: read_result
// 函數功能: 將計數值讀出到Nx、Ns
//--------------------------------------------------------------------------------------------------
void read_result()
     {
      GATE=0;
      while(RGATE);   //等待實際門限的結束
      SEL0=0;
      SEL1=0;
      SEL2=0;
      Nx[0]=data_in;  //SEL=000
      SEL0=1;
      Nx[1]=data_in;  //001
      SEL1=1;
      Nx[3]=data_in;  //011
      SEL0=0;
      Nx[2]=data_in;  //010
      SEL0=0;
      SEL1=0;
      SEL2=1;
      Ns[0]=data_in;  //100
      SEL0=1;
      Ns[1]=data_in;  //101
      SEL1=1;
      Ns[3]=data_in;  //111
      SEL0=0;
      Ns[2]=data_in;  //110
     }
//--------------------------------------------------------------------------------------------------
// 函數名稱: judge_Prage
// 函數功能: 判斷頻率范圍,
//            大于1M      即Nx>0x00 0F 42 40,              GATE=1
//            小于1M大于1k即0x00 00 03 E8<Nx<0x00 0F 42 40,GATE=5
//            小于1k      即 Nx<0x00 00 03 E8,             GATE=10  
//--------------------------------------------------------------------------------------------------
void judge_Prage()
     {
     if((Nx[3]==0)&&(Nx[2]==0))
       if((Nx[1]<3)||((Nx[1]==3)&&(Nx[0]<0xE8)))
              GATE_time=10;
        else GATE_time=5;
     else if((Nx[3]==0)&&(Nx[2]<0x0f))
           GATE_time=5;
     else if((Nx[3]==0)&&(Nx[2]==0x0f))
          if(Nx[1]<0x42)
           GATE_time=5;
          else if((Nx[1]==0x42)&&(Nx[0]<0x40))
           GATE_time=5;
          else
          GATE_time=1;
    else  GATE_time=1;
 }
//--------------------------------------------------------------------------------------------------
// 函數名稱: calcu_Fx
// 函數功能: 計算頻率,根據Fx=(Nx/Ns)Fs 計算結果
//--------------------------------------------------------------------------------------------------
void calcu_Fx()
{

}
//--------------------------------------------------------------------------------------------------
// 函數名稱: TIMER0_intrupt
// 函數功能: 定時器0中斷處理程序
//--------------------------------------------------------------------------------------------------
void TIMER0_intrupt() interrupt 1 using 1
              {
               EA=0;         //系統中斷禁止
               GATE=1;
               TH0=-5000/256;  //12M時鐘時,定時0.01秒
               TL0=-5000%256;
               time_count++;
               if(++time_count==100) GATE_time--;
               while(GATE_time==0)
               {
               GATE=0;
               read_result();
               if(PRE_judge)     //預測,判斷頻率范圍                 
               {
               judge_Prage();
               PRE_judge=0;
               if(GATE_time)     //如果頻率大于1M,直接計算,無須再測
               calcu_Fx();
               }
               else
               calcu_Fx();         //不是預測,直接計算結果
            }
               EA=1;
        }
//--------------------------------------------------------------------------------------------------
// 函數名稱: main
// 函數功能: 主函數
//--------------------------------------------------------------------------------------------------
void main()
 {
  CLR=0;
  GATE=1;
  system_init(); 
 }

Tags:頻率計C程序,單片機  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢
舞蹈班的三个小女孩唐嫣| 欧美视频在线观看免费最新| 吃奶摸下的激烈免费视频播放| 精品综合久久久久久98| 四虎影视884aa·com| 看欧美黄色大片| 免费精品视频在线| 特级做a爰片毛片免费看无码| 免费一看一级毛片全播放| 波多野结衣中文字幕电影播放| 人妻少妇偷人精品无码| 欧美日韩精品一区二区三区高清视频 | 无限韩国视频免费播放| 久久久久亚洲av无码专区| 成人免费观看一区二区| 中国熟女仑乱hd| 大香伊蕉国产av| 99riav视频国产在线看| 国产精品久久久久久久久久久不卡| 黄色毛片免费网站| 国产另类ts人妖一区二区| 美女扒开屁股让男人桶爽免费| 又粗又硬又大又爽免费视频播放| 玩弄放荡人妻少妇系列视频| 交换交换乱杂烩系列yy| 欧美一日本频道一区二区三区| 亚洲av永久无码精品| 日日摸日日碰人妻无码| 中文字幕av免费专区| 在线观看片免费人成视频播放| 91精品国产手机| 国产成人福利精品视频| 美女被免费网站视频九色| 再深点灬舒服灬快h视频| 欧美精品亚洲精品| 亚洲伊人久久网| 无码人妻精品一区二区三区9厂 | 欧美综合国产精品日韩一| 亚洲国产精品区| 日本a∨在线播放高清| 中文字幕一区二区人妻性色|