<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機查表程序的自動(dòng)生成技術(shù)

單片機查表程序的自動(dòng)生成技術(shù)

作者: 時(shí)間:2012-11-15 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/170687.htm

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

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

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

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

1 原理

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

2 示例

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

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

/*程序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個(gè)點(diǎn)*/
w=w*3.14159/180; /*轉換成弧度*/
v=sin(w)*255*Vmax*5; /*根據電壓峰值計算該點(diǎn)的輸出值*/
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();
}

晶振相關(guān)文章:晶振原理

上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>