<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機查表程序的自動生成技術

          單片機查表程序的自動生成技術

          作者: 時間:2012-11-15 來源:網絡 收藏

          摘要:介紹用高級語言C,用的方法取代繁瑣復雜的數(shù)學運算,計算精度高、時間短。包括的原理以及D/A輸出復雜波形、非線性插值的示例。

          本文引用地址:http://www.ex-cimer.com/article/170687.htm

          應用系統(tǒng)中,常用到許多復雜的數(shù)學計算,如計算sin(x)、cos(x)、有效值計算、非線性插值等。這些在高級語言中是簡單的工作,而在的匯編語言中卻是非常復雜的。因為,這些運算大都要用乘除運算來進行近似運算,計算的精度很難滿足要求。更難以接受的是其運算時間太長,這對于無乘除指令的單片機系統(tǒng)更是如此。采用取代復雜的計算是一個明智的選擇。但是,這種查表表格往往都較長,通常為幾十條到一二百條,如果采用手工輸入不但要花費大量的時間,而且還容易出錯。利用高級語言的單片機查表程序的可以大大減小工作量,而且不易出錯。

          用過Microchip公司的PIC16系列單片機的讀者都知道,該系列單片機具有許多優(yōu)點,唯感遺憾的是在該指令中沒有乘除指令(PIC17以系列才有乘指令)。在應用中常要自編乘除了程序以完成乘除運算,這種程序執(zhí)行都要花費較多的時間,如雙字節(jié)的乘法,運算一次需要花費100多個指令周期,而如果要用乘除進行sin(x)、cos(x)、開方的計算,則花費的時間就更多。因此,利用高級語言進行單片機查表程序的自動笥成在PIC16系列單片機中就顯得更有意義。

          現(xiàn)以目前在我國正大量使用的Microchip公司的PIC16系列單片機為例,用幾個例子說明該的應用。當然,這種方法也可以用在其它單片機中,只是所給的示例程序中有關單片機的語句要改為相應的單片機語言。本文采用Tubro

          C作為高級語言的編程工具,也可以采用其它高級語言。

          1 原理

          利用高級語言自動生成查表程序的實質就是利用高級語言的計算功能,把原本復雜的計算轉換為簡單的查表結果,以文本文件的形式輸出查表程序,在單片機編程中將該段程序插入相應的程序中去。在應用中需要注意的是:查表結果沒有小數(shù),故在計算輸出時要四舍五入;查表結果只能在0~255之間,超出此范圍要加以處理。PIC16系列單片機的匯編程序默認數(shù)制為十六進制,如要使用十進制,要在數(shù)前加“.”。還有一點要注意的是,在插入查表程序時特別要注意查表程序不能跨過0~255的頁面。

          2 示例

          2.1 用D/A輸出復雜的波形

          用D/A器件可以輸出復雜的波形,如sin(x)、雙音多頻信號等復雜的波形。這里以并行D/A、輸出sin(x)為例,假設電源電壓為5V,D/A的參考電壓也為5V;同時假設在sin(x)的半波中共輸出90個點(2°輸出1個點),相應的C語言源程序如下:

          /*程序A.C*/
          #includeSTdio.h>
          #includemath.h>
          main()
          {
          FILE *fp;
          char f[15];
          float Vmax,v,w;
          int i,k;
          puts (the output file name:);
          gets (f); /*輸入要輸出的文件名*/
          if((fp=fopen(f,w))= =NULL)
          {puts(cON't open output file);
          exit(0);
          }
          puts(Vmax:);
          scanf(%f,Vmax); /*輸入要輸出的sin波形峰值*/
          fprintf(fp,SUB1 MOVWF BUF); /*輸出查表程序的第1行*/
          fprintf(fp,SUBLW .%d,90); /*輸出查表程序的第2行*/
          fprintf(fp,BTFSS STATUS,C);/*輸出查表程序的第3行*/
          fprintf(fp,RETLW .0); /*輸出查表程序的第4行*/
          fprintf(fp,MOVLW HIGH($+4)); /*輸出查表程序的第5行*/
          fprintf(fp,MOVWF PCLATH); /*輸出查表程序的第6行*/
          fprintf(fp,MOVF BUF,W); /*輸出查表程序的第7行*/
          fprintf(fp,ADDWF PCL,F); /*輸出查表程序的第8行*/
          for(i=0;i=90;i++)
          {w=i*2; /*2°輸出1個點*/
          w=w*3.14159/180; /*轉換成弧度*/
          v=sin(w)*255*Vmax*5; /*根據電壓峰值計算該點的輸出值*/
          k=v+0.5; /*四舍五入*/
          if(k0)k=0;
          if(k>255)k=255;
          fprinft(fp,RETLW.%d;%.d,k,i); /*輸出查表表格*/
          }
          fclose(fp);
          printf(Press any key to end
          ……);
          getch();
          }

          晶振相關文章:晶振原理

          上一頁 1 2 3 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();