<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開(kāi)發(fā)網(wǎng)

      電子開(kāi)發(fā)網(wǎng)電子設(shè)計(jì) | 電子開(kāi)發(fā)網(wǎng)Rss 2.0 會(huì)員中心 會(huì)員注冊(cè)
      搜索: 您現(xiàn)在的位置: 電子開(kāi)發(fā)網(wǎng) >> 電子開(kāi)發(fā) >> EDA開(kāi)發(fā)應(yīng)用 >> Keilc >> 正文

      Keil C51編程控制倍頻正弦信號(hào)的產(chǎn)生

      作者:佚名    文章來(lái)源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時(shí)間:2011-3-3

          MCS51單片機(jī)是我國(guó)應(yīng)用最為廣泛的單片機(jī)種。以往單片機(jī)應(yīng)用程序主要用匯編語(yǔ)言編寫(xiě),由于匯編語(yǔ)言程序的可讀性和可移植性都較差,采用匯編語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序不但周期長(zhǎng),而且調(diào)試和排錯(cuò)也比較困難。為了提高編制單片機(jī)應(yīng)用程序的效率,改善程序的可讀性和可移植性,采用高級(jí)語(yǔ)言無(wú)疑是一種好的選擇。C語(yǔ)言是一種通用的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,既具有一般高級(jí)語(yǔ)言的特點(diǎn),又能直接對(duì)計(jì)算機(jī)的硬件進(jìn)行操作,表達(dá)和運(yùn)算能力也較強(qiáng),許多以往只能采用匯編語(yǔ)言來(lái)解決的問(wèn)題現(xiàn)在都可以改用c語(yǔ)言來(lái)解決。
          德國(guó)Keil Software公司多年來(lái)致力于單片機(jī)c語(yǔ)言編譯器的研究。該公司開(kāi)發(fā)的Keil C51是一種專(zhuān)為8051單片機(jī)設(shè)計(jì)的高效率c語(yǔ)言編譯器,符合ANSI標(biāo)準(zhǔn),生成的程序代碼運(yùn)行速度極高,所需要的存儲(chǔ)器空間極小,完全可以和匯編語(yǔ)言相媲美。Keil C51具有豐富的函數(shù)庫(kù),包含100多種功能函數(shù),為用戶(hù)編程提供了極大的方便。C51程序可以實(shí)現(xiàn)與匯編語(yǔ)言的接口,兩者相互之間的調(diào)用十分方便。。高版本的Keil C51編譯器,尤其是Keil Vision2(基于Windows操作系統(tǒng)的C51集成編譯環(huán)境),以其性能優(yōu)秀、使用方便,受到了眾多單片機(jī)愛(ài)好者的歡迎。
          在有些測(cè)量?jī)x表中,常需要提供不同頻率的低頻正弦波信號(hào)源,它們的頻率完全成整數(shù)倍關(guān)系。如測(cè)量電廠工業(yè)用水的電導(dǎo)為防止電極傳感器的極化,要用低頻正弦波信號(hào)作為激勵(lì)源,雙頻測(cè)導(dǎo)法就要求提供精確雙倍頻率的正弦信號(hào)。常用的正弦波信號(hào)倍頻或分頻采用的方法有:

      1.  方波信號(hào)分頻后濾波;
      2.  鎖相合成法;
      3.  單片機(jī)控制的D/A轉(zhuǎn)換后再濾波等。

          方法① 由于基頻的諧波分量大,濾波效果差而很少采用;方法②采用的是壓控振蕩原理,常用于高頻正弦信號(hào)的倍頻或分頻;方法③ 由于高頻諧波分量遠(yuǎn)小于基波分量,濾波效果好且能精確定時(shí),容易實(shí)現(xiàn)信號(hào)的倍頻或分頻。本文采用單片機(jī)AT89C2051控制D/A轉(zhuǎn)換實(shí)現(xiàn)倍頻正弦波信號(hào)的產(chǎn)生,編程語(yǔ)言采用的就是Keil C51。

      1 硬件電路
          圖1為倍頻正弦波信號(hào)發(fā)生電路,U2為l0位串行DA集成電路TLC5615(TEXAS儀器公司生產(chǎn)),VREF為2.5v的標(biāo)準(zhǔn)參考電壓。U3 MAX813為看門(mén)狗復(fù)位集成電路,在U1(AT89C2051)出現(xiàn)程序跑飛時(shí)可自動(dòng)復(fù)位。U1控制DA輸出正弦變化的階梯電壓,經(jīng)R1、C3濾波,C4隔直后即可得到波形較理想的正弦波,只要在一個(gè)周期內(nèi)保證有足夠多的輸出點(diǎn)數(shù)。
       
      圖1  倍頻正弦波發(fā)生電路
          U1根據(jù)P1.3和P1.4(標(biāo)號(hào)分別為SWF0和SWF1)的狀態(tài)控制正弦波的產(chǎn)生與停止及基頻與倍頻,它們的組合關(guān)系為:SWF1=1、SWF0=x時(shí)DA無(wú)正弦信號(hào)輸出;SWF1=0、SWF0=0時(shí)DA輸出基本頻率的正弦信號(hào);SWF1=0、SWF0=1時(shí)DA輸出雙倍基頻的正弦信號(hào)。DA轉(zhuǎn)換器TLC5615遵從SPI標(biāo)準(zhǔn)的三線串行通信協(xié)議,三線分別是:/CS片選線,低電平有效;SCLK時(shí)鐘線;DIN數(shù)據(jù)線。SPI串行總線上數(shù)據(jù)傳送時(shí)序如圖2所示,圖中在/CS低電平有效時(shí),時(shí)鐘線SCLK上升沿時(shí)數(shù)據(jù)線DIN上的數(shù)據(jù)必須穩(wěn)定,方可保證數(shù)據(jù)的正確傳送,當(dāng)/CS高電平時(shí)器件不接受數(shù)據(jù),這樣可在SPI串行總線上掛多個(gè)支持SPI標(biāo)準(zhǔn)的器件。有關(guān)SPI串行總線的具體參數(shù)請(qǐng)參閱器件資料。
       
      圖2 SPI串行數(shù)據(jù)總線數(shù)據(jù)傳送時(shí)序圖

      2 Keil C51程序
          單片機(jī)程序采用Keil C51編程語(yǔ)言編寫(xiě),經(jīng)編譯后生成HEX文件即可固化在AT89C2051中。一個(gè)C,51工程(project)的源程序由C文件和H頭文件等組成。本文下面給出的C文件wave.c中有主程序"void main(void)"、DA轉(zhuǎn)換輸出函數(shù)"void da.out(void)"和定時(shí)器中斷函數(shù)"void timer0(void)interrupt 1 using 2"組成。兩次DA轉(zhuǎn)換之間采用定時(shí)器0進(jìn)行定時(shí)。在產(chǎn)生基頻正弦信號(hào)或倍頻正弦信號(hào)時(shí)不改變定時(shí)器的定時(shí)時(shí)間,而是通過(guò)傳送給DA不同的數(shù)字量來(lái)實(shí)現(xiàn),即頭文件中的產(chǎn)生基頻正弦信號(hào)的wavel數(shù)組和產(chǎn)生倍頻信號(hào)的waveh數(shù)組的長(zhǎng)度一樣,均為128,但wavel是一個(gè)周期內(nèi)正弦波的數(shù)字量,waveh是兩個(gè)周期內(nèi)的數(shù)字量,前64個(gè)數(shù)值與后64個(gè)數(shù)值相同。這樣可以避免執(zhí)行重置定時(shí)常數(shù)的指令而引起的時(shí)間誤差,從而得到精確的雙倍頻關(guān)系。另外,wavel數(shù)組中的峰-峰值(最大值-最小值)約為waveh數(shù)組中峰-峰值的一半,這樣使得經(jīng)RC濾波后兩種頻率的正弦波幅度近似相等,以滿(mǎn)足使用要求。如程序中的定時(shí)常數(shù)(TH0=0xff,TL0=0x00),在晶振為20MHz時(shí),測(cè)得基頻為50.6Hz,倍頻為101.2Hz。以下是C51源程序wave.c和H頭文件wave.h,在Keil C51 V6.12下編譯通過(guò)生成HEX文件。
        C51源程序wave.c
      #include<reg51.h>
      #include<intrins.h>
      #include "wave.h"
      void da_out(void); //聲明函數(shù)
      sbit DIN=0x97; //P1.7位定義
      sbit SCLK=0x96; //P1.6位定義
      sbit DACS=0x95; //P1.5位定義
      sbit SWF1 =0x94; //P1.4位定義
      sbit SWF0 =0x93; //P1.3位定義
      sbit WDI =0x92; //P1.2位定義
      sbit FLAG = 0x90;
      IUI word; //IUI即idata unsigned int,在wave.h中預(yù)定義
      void main(void){
      IUI i;
      TMOD =0x01; //定時(shí)器0方式1;
      TH0=0xff;TL0=0x00; //置定時(shí)器0常數(shù);
      TR0=1; //啟動(dòng)定時(shí)器0
      ET0=1;EA=1; //開(kāi)定時(shí)器中斷及總中斷
      SWF0=1;SWF1=1; //設(shè)P1.3,P1.4為輸入
      WDI=1; //看門(mén)狗輸入置高電平
      while(1){
      for(i=0;i<128;i++){
      FLAG=1; //置標(biāo)志,FLAG在定時(shí)器0中斷程序中被清除
      WDI=0;_nop_();WDI= 1;//看門(mén)狗復(fù)位
      if(SWF1) word=512; //SWF1=1時(shí),DA輸出同一量,無(wú)正弦信號(hào)輸出
      else{
      if(SWF0) word=waveh[i];//取倍頻數(shù)字量
      else word=wavel[i]; //取基頻數(shù)字量
      }
      word=word<<6; //10位數(shù)字量移至高位
      while(FLAG); //等待,直至定時(shí)器中斷程序中清FLA G
      da_out(); //調(diào)用DA輸出子程序
      }
      }
      }
      void timer0(void) interrupt 1 using 2{
      TH0=0xff;TL0=0x00;//重置定時(shí)器常數(shù)
      FLAG=0;//清主程序中的等待標(biāo)志
      }
      void da_out(void){
      IUI i;
      SCLK =0;_nop_();DACS=0; //準(zhǔn)備傳送數(shù)據(jù)
      for(i=0;i<10;i++){
      DIN= (bit)(word&Ox80); //取最高位送數(shù)據(jù)線
      word = word << 1; //左移,準(zhǔn)備下一位傳送
      SCLK =1;_nop_();SCLK =0; //一個(gè)CLK信號(hào)
      }
      DACS= 1;_nop_();SCLK=1; //傳送結(jié)束
      }

      H頭文件(wave.h):
      typedef idata unsigned int IUI;
      int code wavel[]={
      512,524,537,550,563,698,707,715,723,731,775,775,774,772,770,698,689,679,669,658,
      512,499,486,473,460,325,316,308,300,292,248,248,249,251,253,325,334,344,354,365,
      };
      int code waveh[]={
      512,562,611,660,707,753,796,836,874,907,937,963,985,1001,1014,1021,
      1023,1021,1014,1001,985,963,937,907,874,836,796,753,707,660,611,562,
      512,46l,412,363,316,270,227,187,149,116,86,60,38,22,9,2,
      0,2,9,22,38,60,86,116,149,187,227,270,316,363,412,461,
      512,562,611,660,707,753,796,836,874,907,937,963,985,1001,1014,1021,
      1023,1021,1014,1001,985,963,937,907,874,836,796,753,707,660,611,562,
      512,461,412,363,316,270,227,187,149,116,86,60,38,22,9,2,
      0,2,9,22,38,60,86,116,149,187,227,270,316,363,412,461
      }:

      3  小結(jié)
          筆者有多年的單片機(jī)匯編語(yǔ)言編程經(jīng)歷,改用Keil C51后感覺(jué)很好,編程效率大為提高。本文是Keil C51在正弦波產(chǎn)生中的應(yīng)用,由C源程序可見(jiàn),程序較匯編語(yǔ)言程序可讀性大為提高,非常簡(jiǎn)煉。本文介紹的倍頻正弦波信號(hào)發(fā)生電路已用于某型電導(dǎo)率表中,效果很好。

      Tags:keilc,正弦信號(hào),產(chǎn)生  
      責(zé)任編輯:admin
      請(qǐng)文明參與討論,禁止漫罵攻擊,不要惡意評(píng)論、違禁詞語(yǔ)。 昵稱(chēng):
      1分 2分 3分 4分 5分

      還可以輸入 200 個(gè)字
      [ 查看全部 ] 網(wǎng)友評(píng)論
      最新推薦
      熱門(mén)文章
      關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁(yè)面
      下到頁(yè)底
      晶體管查詢(xún)
      主站蜘蛛池模板: 国产亚洲Av综合人人澡精品| 国产色综合一区二区三区| 伊人久久综合热线大杳蕉下载| 国产综合无码一区二区辣椒| 色综合久久中文色婷婷| 婷婷五月六月激情综合色中文字幕| 九九综合VA免费看| 狠狠色伊人亚洲综合网站色| 国产成人综合亚洲亚洲国产第一页 | 伊人久久综合成人网| 久久精品亚洲综合一品| 色综合天天综合网国产国产人| 亚洲国产精品综合久久网各| 亚洲精品第一国产综合精品99| 久久久综合中文字幕久久| 色天使久久综合网天天| 在线综合亚洲欧洲综合网站| 亚洲色偷偷综合亚洲AVYP| 五月天色婷婷综合| 狠狠色丁香婷婷综合| 亚洲国产日韩成人综合天堂| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 一本色道久久综合无码人妻| 狠狠色丁香婷婷综合久久来来去| 狠狠综合亚洲综合亚洲色| 狠狠色丁香久久婷婷综合蜜芽五月| 狠狠色丁香久久婷婷综合| 国产综合精品久久亚洲 | 亚洲av成人综合网| 亚洲色欲www综合网| 香蕉蕉亚亚洲aav综合| 亚洲av综合av一区| 亚洲综合成人网在线观看| 色综合久久久久久久久五月| 亚洲综合一区二区精品导航| 色综合天天综合狠狠| 国产精品免费综合一区视频| 色综合天天综合网国产国产人 | 天天综合色天天桴色| 天天影视色香欲性综合网网站 | 国产成人综合久久精品亚洲|