单片机查表程序的自动生成技术
[09-12 18:13:25] 来源:http://www.88dzw.com 单片机学习 阅读:8940次
文章摘要: 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<=
单片机查表程序的自动生成技术,标签:单片机开发,单片机原理,单片机教程,http://www.88dzw.comfprintf(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)计算:
Tag:单片机学习,单片机开发,单片机原理,单片机教程,单片机学习
- 上一篇:单片机控制数显“消屏”算是的探讨
《单片机查表程序的自动生成技术》相关文章
- › 单片机查表程序的自动生成技术
- 在百度中搜索相关文章:单片机查表程序的自动生成技术
- 在谷歌中搜索相关文章:单片机查表程序的自动生成技术
- 在soso中搜索相关文章:单片机查表程序的自动生成技术
- 在搜狗中搜索相关文章:单片机查表程序的自动生成技术
分类导航
最新更新