原创 单片机查表程序的自动生成技术

2009-8-13 09:00 2042 9 9 分类: MCU/ 嵌入式
摘要:介绍用高级语言C自动生成单片机的查表程序,用查表的方法取代繁琐复杂的数学运算,计算精度高、时间短。包括自动生成程序的原理以及D/A输出复杂波形、非线性插值的示例。电子园51单片机学习网2z{'a]!I

+B\k!JpOc0    关键词:单片机 自动编程 查表 高级语言

X3gLI(AY*^B0

!w*C6f _6yWQN0在单片机应用系统中,常用到许多复杂的数学计算,如计算sin(x)、cos(x)、有效值计算、非线性插值等。这些在高级语言中是简单的工作,而在单片机的汇编语言中却是非常复杂的。因为,这些运算大都要用乘除运算来进行近似运算,计算的精度很难满足要求。更难以接受的是其运算时间太长,这对于无乘除指令的单片机系统更是如此。采用查表取代复杂的计算是一个明智的选择。但是,这种查表程序表格往往都较长,通常为几十条到一二百条,如果采用手工输入不但要花费大量的时间,而且还容易出错。利用高级语言的单片机查表程序的自动生成技术可以大大减小工作量,而且不易出错。

jL:B;iN9B3|4h0

q7SS/yH(s0用过Microchip公司的PIC16系列单片机的读者都知道,该系列单片机具有许多优点,唯感遗憾的是在该指令中没有乘除指令(PIC17以系列才有乘指令)。在应用中常要自编乘除了程序以完成乘除运算,这种程序执行都要花费较多的时间,如双字节的乘法,运算一次需要花费100多个指令周期,而如果要用乘除进行sin(x)、cos(x)、开方的计算,则花费的时间就更多。因此,利用高级语言进行单片机查表程序的自动笥成技术在PIC16系列单片机中就显得更有意义。

s ]dl*Dh5mYo0 电子园51单片机学习网,KU\k:V_NO-d9QW

现以目前在我国正大量使用的Microchip公司的PIC16系列单片机为例,用几个例子说明该技术的应用。当然,这种方法也可以用在其它单片机中,只是所给的示例程序中有关单片机的语句要改为相应的单片机语言。本文采用Tubro C作为高级语言的编程工具,也可以采用其它高级语言。电子园51单片机学习网5o vD?s"x L&P

电子园51单片机学习网3UNY n0H-H o)V$@

1 原理电子园51单片机学习网U7mAK*Wn\:g


b]veA3tk7w0利用高级语言自动生成查表程序的实质就是利用高级语言的计算功能,把原本复杂的计算转换为简单的查表结果,以文本文件的形式输出查表程序,在单片机编程中将该段程序插入相应的程序中去。在应用中需要注意的是:查表结果没有小数,故在计算输出时要四舍五入;查表结果只能在0~255之间,超出此范围要加以处理。PIC16系列单片机的汇编程序默认数制为十六进制,如要使用十进制,要在数前加“.”。还有一点要注意的是,在插入查表程序时特别要注意查表程序不能跨过0~255的页面。

Pb u7M@ |-U0 电子园51单片机学习网xMA;ok$^@xg$Et+E

2 示例

9r K;\&mp9`fR_/P"E0

-U8H5S0P;J.]02.1 用D/A输出复杂的波形

BV pm|B X]0

s5}g{9z `-\ v-Vwg0用D/A器件可以输出复杂的波形,如sin(x)、双音多频信号等复杂的波形。这里以并行D/A、输出sin(x)为例,假设电源电压为5V,D/A的参考电压也为5V;同时假设在sin(x)的半波中共输出90个点(2°输出1个点),相应的C语言源程序如下:电子园51单片机学习网 h4cb1`%\

电子园51单片机学习网Z-q!ASn B8\ i(X c:C

/*程序A.C*/

*E\'^ kK P1N0 电子园51单片机学习网r a u|er

#include<stdio.h>电子园51单片机学习网KZ}TVc$zx-O

电子园51单片机学习网;e4n%FcD

#6136_200904071945331nWhN.gifinclude<math.h>

~;@Huxy0 电子园51单片机学习网D#lKcKAz2L4|

main()电子园51单片机学习网Hdv b8fX_

电子园51单片机学习网6i?$r a b? a#N? @7So A

{

'x;Y] c+p#w7]D$}0

5hA+R'Wm4y5Y0FILE *fp;

(Eos$PJ0N!utM.{0

(_Bk};g} O0char f[15];电子园51单片机学习网e(Eu7f0fZ x


R3qgx+q(lHMv0float Vmax,v,w;电子园51单片机学习网 c4X \a!U)} F


]X]`^v'L'w0int i,k;

C apH0J2m0

tf+C)Aw j0puts ("the output file name:");电子园51单片机学习网 ]p0` o9Z?b


7ym~b_2M)j0gets (f); /*输入要输出的文件名*/

~z'KET+dv0

9Y#OXhv3h0if((fp=fopen(f,"w"))= =NULL)电子园51单片机学习网gPS2Fi3tm


Z0Cc1ecH.j0{puts("con't open output file");电子园51单片机学习网)o ?'m'On0C O


t{Q/qVM0exit(0);电子园51单片机学习网8}*IY^VU].]1J

电子园51单片机学习网+xD-r}!{ c

}

V ~]7N%na9Z r(ty0 电子园51单片机学习网6H y+z(K!AuZ!i b

puts("Vmax:");

Xq:^(jV,_b0

SV"q%W1Q1`y0y3t0scanf("%f",&Vmax); /*输入要输出的sin波形峰值*/

-j3`0M&n,jp+V0 电子园51单片机学习网'y`^YPN`S

fprintf(fp,"SUB1 MOVWF BUF"); /*输出查表程序的第1行*/电子园51单片机学习网5V YN+Cg4@-s^4h


c y3zU9O h1Z0fprintf(fp,"SUBLW .%d",90); /*输出查表程序的第2行*/

0g4t3n3w1m{,G#Hh0 电子园51单片机学习网-wm ]E x

fprintf(fp,"BTFSS STATUS,C");/*输出查表程序的第3行*/

E"|6B#E})h$P6m)}0

GhG X o#T0fprintf(fp,"RETLW .0"); /*输出查表程序的第4行*/电子园51单片机学习网H Y:w)W8L d


#kSm$|8ZYXuTv0fprintf(fp,"MOVLW HIGH($+4)"); /*输出查表程序的第5行*/电子园51单片机学习网 B1|FwU7{Y

电子园51单片机学习网3?'H'm%L[`7|'H

fprintf(fp,"MOVWF PCLATH"); /*输出查表程序的第6行*/

@7DFe,nYgpP0 电子园51单片机学习网3w!`/e(o0z-r

fprintf(fp,"MOVF BUF,W"); /*输出查表程序的第7行*/电子园51单片机学习网2`4g X$CwH(X&p


w"NkUXsUH0fprintf(fp,"ADDWF PCL,F"); /*输出查表程序的第8行*/

&?r"z[ q0 电子园51单片机学习网 B#_JML

for(i=0;i<=90;i++)电子园51单片机学习网(Z#g;mbP"T

电子园51单片机学习网p%urg%]Sf_K

{w=i*2; /*2°输出1个点*/

-t @3aOTYW&f)V0

| ^!d6U0o x0{'k&x0w=w*3.14159/180; /*转换成弧度*/

i5O B:D"Q/D0 电子园51单片机学习网Y H`(M e0Loj

v=sin(w)*255*Vmax*5; /*根据电压峰值计算该点的输出值*/电子园51单片机学习网EL_t*~ph+m


/c Un7g s-^.^b'P0k=v+0.5; /*四舍五入*/

u0o&V+X:gK0

lE)r&Mp&f\{k0if(k<0)k=0;电子园51单片机学习网FO6ywM5L/p?o a


|+lvq.N;K8o0if(k>255)k=255;电子园51单片机学习网H1t.B ?5e.i4O)G

电子园51单片机学习网"ca#M&\ Vr(?2](LG

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

I.I9tTE+pX9}{d0

)|s;}?%Pb7M_s^0}电子园51单片机学习网W Q O0MUgb

电子园51单片机学习网 p8IVB#kP!q^

fclose(fp);

eO [ }fb sw/e0 电子园51单片机学习网ja"E0X$B]U

printf("Press any key to end ……");电子园51单片机学习网2ei4e"bU`v


#l \(?j Y~ @$j Y!^&N.T0getch();电子园51单片机学习网k"C:G ~,Nk7TW


f;E!N1cK%]N!B0}电子园51单片机学习网H1LxK,_0g Qg0{G

电子园51单片机学习网9R1R%C0K)a"]E J.\

利用以上程序,计算时输入文件名为A.ASM,Vmax=3,得至的A.ASM的内容如下(共90行表格,略去其中的大部分表格):

Q,qH U+F+|:]b.M c/Mq0 电子园51单片机学习网*z8W3W)n1N

;A.ASM

"{#D"e]k7a0

e$XT%NZ|th+E6c L0SUB1 MOVWF BUF电子园51单片机学习网;h3M)M d(Q"BsV

电子园51单片机学习网 j?D&RX

SUBLW .90

5`2b0}fV6g0 电子园51单片机学习网k!l,Fq9FW%`

BTFSS STATUS,C

C3e-T#mw&Fy0 电子园51单片机学习网H;D r vU,W/R ym

RETLW .0电子园51单片机学习网8B%kN%Y%EAW'g]d n*TC


;^QIcxE+n0O0MOVLW HIGH($+4)电子园51单片机学习网|"k KK8h Es

电子园51单片机学习网*|!Y'IUM [9x|-]

MOVWF PCLATH

3KNLh*]/X1Z*c Q9\0

k7P5@c"Gx0MOVF BUF,W

Elnevm({0

+_4Jx K t+b0ADDWF PCL,F

}#qrI;uw0 电子园51单片机学习网)I7L u ?s

RETLW .0;0

1WkIw(\~8N0

Fc'MYY1j0RETLW .5;1

!u Q(UrL Q l&G0

ej.n)S1{2~GzvO0……

dQX-Wz!@0

y8w2f9U8Q'R5x/|0RETLW .90;72电子园51单片机学习网Bu|JyB

电子园51单片机学习网0y"If&es ^

RETLW .86;73电子园51单片机学习网 R9FGB7n3d{;a'N8M

电子园51单片机学习网\7Lo9|{-N

RETLW .81;74

w8p)Y7`Ah1gJ ]~0 电子园51单片机学习网[&z(K:S\1B^(|

……电子园51单片机学习网1] @R/b y}n6a


0tN3H}9F?Q'E0RETLW .11;88电子园51单片机学习网7|0y U;O7D `;YV4s.X

电子园51单片机学习网0U.M v6mv.n2Z

RETLW .5;89

f8x-iid7d)OOc0 电子园51单片机学习网J8U ?H;mDb

RETLW .0;90电子园51单片机学习网_)? z vMo


,[Q{%OLN0把以下程序插入单片机程序的适当地方,查表时中要赋以W相应的值,再CALL SUB1就可以得到sin(x)第W点上的值。整个计算约10个指令周期(如采用4MHz晶振,为10μs左右)。如果采用乘除的方法计算,至少要花几百甚至上千个指令周期,而且得到的结果精度也差。

y*B/e7AK)\0P!v0

]L3A+? x/`a02.2 非线性插值电子园51单片机学习网&Nub&k2swk H


z5l3DJW0在单片机应用中会遇到非线性元件,例如热敏电阻的电阻-温度特性、断路器的保护特性等都是非线性关系。这里以断路器的保护特性为例,说明自动编程的应用。假设现在要仿真的断路器的特性为双曲线,如图1所示。电子园51单片机学习网'd8a/U9b5k&~L h

电子园51单片机学习网Fn:u|1?

据此,可以设延时时间与电流的关系为电子园51单片机学习网$oXzx)o-q2S


.O8F8G duh4ti`U*S0(I+I0)(t+t0)=K     (1)

#o3PBoE?zoP0 电子园51单片机学习网n \9Ym"F~9D

由图1的三个点可以得到以下联立方程组:

\6xi @*t7L&vG&} t#l0

6L7RF8{+f;LA0(I+20)(t+33)=K电子园51单片机学习网mR%oy&Od


v7@$o s M1iz0(I+40)(t+20)=K    (2)

5S%gi a,_t l0 电子园51单片机学习网.r\,tP9My9e#K&uO&g

(I+90)(t+10)=K电子园51单片机学习网2Hw v,Fo6d6s-^!G


A mGf8R#[8V0采用迭代法解得I0=11.111 1,t0=0.222 2,K=1 033.58,代入式(1)得

;@Wz-S)V(H#Q,kn Q%g0

MI|GNbE5_0t=[1 033.58/(I+11.111 1)]-0.222 2     (3)电子园51单片机学习网-m)Y \I"Su

电子园51单片机学习网J C:p?Gpx

现在假设在硬件线路中,电流信号是转换为电压信号经A/D后得到的,其相应点的关系为:0A→0V,100A→3V,A/D为8位,A/D参考电压为5V。转换计算首先将A/D值转换为对应的电压值,再将电压值转换为对应的电流值I,再根据式(3)求相应的延时时间T,最后将延时时间T再转换为延时的间常数 T0。T0按式(4)计算:电子园51单片机学习网,P0c6o+O/S)[j`sU

电子园51单片机学习网 h&Vph+e*l |2F#G

(256-t0)·Tcy·K=T     (4)电子园51单片机学习网 ph~Qu

电子园51单片机学习网 W5gm5w;a]{L

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

1UvP;a*PR)N{`!k0 电子园51单片机学习网,x6Q`M:v

其中,Tcy为指令周期,在4MHz晶振时,Tcy=1μs;K为预分频系数;t为欲延时的时间,单位为μs电子园51单片机学习网%jy#E1d-|

电子园51单片机学习网M!rvM5v BW9{p`

假设定时器用TMR0,预分频系数为256,晶振的振荡频率为4MHz,则最大延时为65.535ms。程序如下(其中与程序A.C相同或类似的均略去):

Gnl f(w?PK"}U0 电子园51单片机学习网!X+]4s KPen5mA

/*程序B.C*/电子园51单片机学习网9Q [\6?J


M vZ wi _f0……

%N s @-M-K |0|)VDmp0 电子园51单片机学习网"i_poO

fprintf(fp,"SUB2 MOVWF BUF");电子园51单片机学习网"rgw6sj-\3E)nv

电子园51单片机学习网ywf4ev$U/}%Qm`+O

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

%}s5tn0U7Qd G'F:j0 电子园51单片机学习网$K]2jy7P_X

fprintf(fp,"MOVWF PCLATH");

Isxr\u\9_0 电子园51单片机学习网A V@/d6h D

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

p pu/U,iE0

SN1~B Es~U0fprintf(fp,"ORG 200H,F"); /*表格从200H开始,避免跨页*/电子园51单片机学习网 N ];?0pkC

电子园51单片机学习网FE"Z!^qA:\

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

P,|jq2w&M#P+_uF0 电子园51单片机学习网S[["q1a(q D

for(i=0;i<=254;i++)电子园51单片机学习网C]a0} ty(IG*cI


!AXdA!oQ0{ad=i;电子园51单片机学习网F4g~%`6Y

电子园51单片机学习网5o p|VMM0R;G

v=ad*5/255; /*求相应于A/D值的电压V*/电子园51单片机学习网 y \m8ubo


J#V|i c&_0I=100*v/3; /*求相应的电流I*/电子园51单片机学习网.C UzEJ1f


^;\X5orY6YO&g0T=1033.58/(I+11.1111)-0.2222; /*按式(3)求相应的延时时间*/电子园51单片机学习网 x{:oV\ez?4p5|

电子园51单片机学习网M v*cph

T0=256-T*1000*256; /*转换为时间常数*/

S(_JF(X ];T0

ah2cE H-QHc0k=T0+0.5;电子园51单片机学习网e o7w'|]!a'S,D3f


#z6F`FTv o C0if(k<0)k=0;

l/s/xh-A%jp,c'U1w0

Xm O;H5}RP]*V0if(k>255)k=255;电子园51单片机学习网(uw vq5]6`bFE


6dd;|"Vi'X7`{ls0fprintf(fp,)"

2ok _vK;J]0 电子园51单片机学习网.m;rw/k:s1b

RETLW.%d;AD=.%d,I=%5.1f(A),T=%5.1f(ms)",k,i,I,T);电子园51单片机学习网*ru @+|U


c%S"@ p;j:}q\+h/_0}

&@Z!}Y c4zv/l0

xI!SXr_/T[ {0……电子园51单片机学习网 {yr5Jl SOK.aI

电子园51单片机学习网F8zS;y[p"K Vc-X

形成的查表程序如下(共255行表格,略去其中的大部分表格):电子园51单片机学习网xu,g6}&G G"vy`.w


'A1o%s2o#tS?0;B.asm电子园51单片机学习网v_!K-z%^p E%L


q{cE%X)F0SUB2 MOVWF BUF

v8j4EO Y0

SYDK5u,^Y0MOVLW HIGH($+4)电子园51单片机学习网G C QQ(y u


(A6Y;KrC/GS0MOVWF PCLATH

4f+`Y%gF#Ry0 电子园51单片机学习网 N z1Jn)E A,|1o

MOVF BUF,W

Di},fW4Pl5?M0O C0 电子园51单片机学习网9V/J5~'@.RFa

ORG 200H电子园51单片机学习网q/r,\f u


3Nim+yFD~0ADDWF PCL,F

*I-F~O(Tt\1uv0 电子园51单片机学习网-kiY?2l&K0M oa.m J+^ x

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

;Qz `jB&C9X0 电子园51单片机学习网!w"}&?PSF1o

……电子园51单片机学习网Qg"@r&p

电子园51单片机学习网&p:R7S^I2^gF,^

RETLW .116;AD=.27,I=17.6(A),T=35.7(ms)电子园51单片机学习网)`F*Ru*zX ^1^ w

电子园51单片机学习网!~_L(Ds3W

RETLW .120;AD=.28,I=18.3(A),T=34.9(ms)电子园51单片机学习网4Tv4}(R"zp%U

电子园51单片机学习网qV1aH4n8^;u

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

NhL#ft0 电子园51单片机学习网+c,C9V6v[Y9Cn$NK

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

9w"[%Q-usI_6_7@0

6Z3vM1T]\i5M4^0……

0hBSBFu5~ J'B(k0 电子园51单片机学习网-w*??'r zSb$~_*e

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

$aCq d%]3s/e4_Z O0

R;rDn.]8]~@X0单片机进行电流采样A/D,把A/D结果赋给W,CALL SUB2便可得到相应的延时时间常数W。

B#X;boP M2M?u ecN+A\0

-^:{j6aC8t.u$y|03 结论

0_4N3z;c9d7u0

f*wS]3c d5Xka0利用高级语言自动生成单片机的查表程序,可以完成许多单片机难以完成或需要进行大量计算才能完成的复杂运算,计算精度高。单片机利用此结果进行插值运行速度要快得多。典型的4MHz晶振时,需要的运算时间为10μs。限于篇幅,本文只给出两个实例,实际上它可以用于单片机测控系统中的许多方面,如模糊控制中的模糊规则的推理、非线性传感器的特性读取以及其它方面。

:X&L#]7n[+D0

61366136_200904071945531rjXu

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条