国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用高級語言自動生成單片機的查表程序

2oON_changxuemc ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-07 11:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

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

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

1 原理

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

#include

#include

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(k<0)k=0;

if(k>255)k=255;

fprinft(fp,"RETLW.%d;%.d",k,i); /*輸出查表表格*/

}

fclose(fp);

printf("Press any key to end ……");

getch();

}

利用以上程序,計算時輸入文件名為A.ASM,Vmax=3,得至的A.ASM的內容如下(共90行表格,略去其中的大部分表格):

;A.ASM

SUB1 MOVWF BUF

SUBLW .90

BTFSS STATUS,C

RETLW .0

MOVLW HIGH($+4)

MOVWF PCLATH

MOVF BUF,W

ADDWF PCL,F

RETLW .0;0

RETLW .5;1

……

RETLW .90;72

RETLW .86;73

RETLW .81;74

……

RETLW .11;88

RETLW .5;89

RETLW .0;90

把以下程序插入單片機程序的適當地方,查表時中要賦以W相應的值,再CALL SUB1就可以得到sin(x)第W點上的值。整個計算約10個指令周期(如采用4MHz晶振,為10μs左右)。如果采用乘除的方法計算,至少要花幾百甚至上千個指令周期,而且得到的結果精度也差。

2.2 非線性插值

在單片機應用中會遇到非線性元件,例如熱敏電阻的電阻-溫度特性、斷路器的保護特性等都是非線性關系。這里以斷路器的保護特性為例,說明自動編程的應用。假設現在要仿真的斷路器的特性為雙曲線,如圖1所示。

據此,可以設延時時間與電流的關系為

(I+I0)(t+t0)=K (1)

由圖1的三個點可以得到以下聯立方程組:

(I+20)(t+33)=K

(I+40)(t+20)=K (2)

(I+90)(t+10)=K

采用迭代法解得I0=11.111 1,t0=0.222 2,K=1 033.58,代入式(1)得

t=[1 033.58/(I+11.111 1)]-0.222 2 (3)

現在假設在硬件線路中,電流信號是轉換為電壓信號經A/D后得到的,其相應點的關系為:0A→0V,100A→3V,A/D為8位,A/D參考電壓為5V。轉換計算首先將A/D值轉換為對應的電壓值,再將電壓值轉換為對應的電流值I,再根據式(3)求相應的延時時間T,最后將延時時間T再轉換為延時的間常數 T0。T0按式(4)計算:

(256-t0)·Tcy·K=T (4)

t0=256-t/(Tcy·K) (5)

其中,Tcy為指令周期,在4MHz晶振時,Tcy=1μs;K為預分頻系數;t為欲延時的時間,單位為μs。

假設定時器用TMR0,預分頻系數為256,晶振的振蕩頻率為4MHz,則最大延時為65.535ms。程序如下(其中與程序A.C相同或類似的均略去):

/*程序B.C*/

……

FPrintf(fp,"SUB2 MOVWF BUF");

fprintf(fp,"MOVLW HIGH($+4)");

fprintf(fp,"MOVWF PCLATH");

fprintf(fp,"MOVF BUF,W");

fprintf(fp,"ORG 200H,F"); /*表格從200H開始,避免跨頁*/

fprintf(fp,"ADDWF PLC,F");

for(i=0;i<=254;i++)

{ad=i;

v=ad*5/255; /*求相應于A/D值的電壓V*/

I=100*v/3; /*求相應的電流I*/

T=1033.58/(I+11.1111)-0.2222; /*按式(3)求相應的延時時間*/

T0=256-T*1000*256; /*轉換為時間常數*/

k=T0+0.5;

if(k<0)k=0;

if(k>255)k=255;

fprintf(fp,)"

RETLW.%d;AD=.%d,I=%5.1f(A),T=%5.1f(ms)",k,i,I,T);

}

……

形成的查表程序如下(共255行表格,略去其中的大部分表格):

;B.asm

SUB2 MOVWF BUF

MOVLW HIGH($+4)

MOVWF PCLATH

MOVF BUF,W

ORG 200H

ADDWF PCL,F

RETLW .0;AD=.0,I=0.0(A),T=92.8(ms)

……

RETLW .116;AD=.27,I=17.6(A),T=35.7(ms)

RETLW .120;AD=.28,I=18.3(A),T=34.9(ms)

RETLW .123;AD=.29,I=19.0(A),T=34.2(ms)

RETLW .125;AD=.30,I=19.6(A),T=33.4(ms)

……

RETLW .234;AD=.254,I=166.0(A),T=5.6(ms)

單片機進行電流采樣A/D,把A/D結果賦給W,CALL SUB2便可得到相應的延時時間常數W。

3 結論

利用高級語言自動生成單片機的查表程序,可以完成許多單片機難以完成或需要進行大量計算才能完成的復雜運算,計算精度高。單片機利用此結果進行插值運行速度要快得多。典型的4MHz晶振時,需要的運算時間為10μs。限于篇幅,本文只給出兩個實例,實際上它可以用于單片機測控系統中的許多方面,如模糊控制中的模糊規則的推理、非線性傳感器的特性讀取以及其它方面。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6076

    文章

    45499

    瀏覽量

    670619

原文標題:51單片機P0口上拉電阻取值講解

文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    小白也能聽懂的單片機知識路徑

    什么是單片機單片機,全稱單片微型計算機,是一種集CPU、內存、輸入輸出接口等部件于一體的微型計算機系統。它能夠獨立執行程序,完成特定的控制或計算任務,廣泛應用于家電、汽車電子
    發表于 02-04 16:44

    單片機外設模塊速查表

    單片機開發中,外設模塊幾乎是每個工程師的必修課。GPIO、ADC、UART、SPI……看似簡單的模塊,如果使用不當,很容易踩坑。今天我們就來整理一份單片機外設模塊速查表,從功能、典型用途到配置要點
    的頭像 發表于 01-19 09:06 ?382次閱讀
    <b class='flag-5'>單片機</b>外設模塊速<b class='flag-5'>查表</b>

    單片機里的程序運行方式

    于實時控制、故障自動處理、計算機與外設間傳送數據及人機對話等。 單片機啟動過程 單片機的啟動過程是加電后,先運行芯片內部固有程序(這個程序
    發表于 01-16 06:57

    請問單片機開發的程序設計語言主要有哪幾種?

    單片機開發的程序設計語言主要有哪幾種?
    發表于 01-14 08:29

    單片機大神的程序優化流程

    結構 C 語言是一種高級程序設計語言,提供了十分完備的規范化流程控制結構。因此在采用C 語言設計單片機應用系統
    發表于 12-25 07:38

    為什么單片機還在用C語言編程?

    說起單片機我們就會想到C語言單片機為什么還在用C語言編程?現在有很多很好用的高級語言,如VC、
    發表于 11-28 07:37

    編寫簡單高效單片機匯編程序

    獨立的任務,這樣既能減少代碼重復,也便于維護和調試。 計時模塊:利用單片機的定時器,精確控制時鐘的秒脈沖。 顯示模塊:用循環或查表法來實現不同的時間顯示,這能減少不必要的分支跳轉指令。 按鍵模塊
    發表于 11-24 07:00

    C語言單片機C語言有什么差異

    單片機c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進制,當然單片機c語言只牽涉到普通c
    發表于 11-14 07:55

    單片機的誤區

    任何單片機程序的編寫。根本就不要學去C語言高級用法,即使你用C語言的最基礎的語句能夠完成程序
    發表于 11-14 07:46

    單片機燒錄原理是怎樣的?輝芒微單片機燒錄程序詳細步驟講解

    燒錄(Programming)就是把 .hex/.bin 文件里的機器碼搬運進單片機片內 Flash 的過程。輝芒微(FMD)單片機內部有一塊 自舉 BootROM,上電時會先跑這段程序;如果檢測
    的頭像 發表于 09-17 16:14 ?2365次閱讀
    <b class='flag-5'>單片機</b>燒錄原理是怎樣的?輝芒微<b class='flag-5'>單片機</b>燒錄<b class='flag-5'>程序</b>詳細步驟講解

    怎么測單片機系統頻率

    單片機系統頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統頻率對單片機應用開發、程序調試和性能優化具有重要
    的頭像 發表于 07-25 11:39 ?807次閱讀

    單片機怎么燒程序

    單片機程序是將編寫好的程序代碼寫入單片機內部存儲單元,讓單片機按照預設邏輯工作的過程,是單片機
    的頭像 發表于 07-23 11:47 ?1335次閱讀

    STC單片機范例程序

    電子發燒友網站提供《STC單片機范例程序.zip》資料免費下載
    發表于 06-04 16:27 ?10次下載

    單片機c語言編程實例大全

    單片機c語言編程實例大全_18
    發表于 04-30 16:11 ?7次下載

    單片機C語言編程寶典大全,初學必備【強推下載!】

    (400頁PPT) 6. 單片機程序設計實例 7. 單片機應用程序設計技術_周航慈.pdf 8. 8051單片機C
    發表于 03-14 11:03