利用高级语言自动生成单片机的查表程序

发布者:点亮未来最新更新时间:2018-03-06 来源: eefocus关键字:高级语言  单片机  查表程序 手机看文章 扫描二维码
随时随地手机看文章

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

 

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

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

    1 原理

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

30.gif

    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。限于篇幅,本文只给出两个实例,实际上它可以用于单片机测控系统中的许多方面,如模糊控制中的模糊规则的推理、非线性传感器的特性读取以及其它方面。


关键字:高级语言  单片机  查表程序 引用地址:利用高级语言自动生成单片机的查表程序

上一篇:模拟串口硬件机制写的程序
下一篇:基于SPCE061A单片机TM1639应用程序

推荐阅读最新更新时间:2024-03-16 15:56

单片机典型论文竞赛题精华集锦(二)
单片机论文三 实用低频功率放大器   一、任务   设计并制作具有弱信号放大能力的低频功率放大器。其原理示意图如下:   二、要求   1.基本要求   (1)在放大通道的正弦信号输入电压幅度为(5~700)mV,等效负载电阻RL为8Ω下,放大通道应满足:   ① 额定输出功率POR≥10W;   ② 带宽BW≥(50~10000)Hz;   ③ 在POR下和BW内的非线性失真系数≤3%;   ④ 在POR下的效率≥55%;   ⑤ 在前置放大级输入端交流短接到地时,RL=8Ω上的交流声功率≤10mW。   (2)自行设计并制作满足本设计任务要求的稳压电源。   2.发挥部分   (1)放大器的时间响
[模拟电子]
<font color='red'>单片机</font>典型论文竞赛题精华集锦(二)
STC12系列单片机的空闲模式、休眠模式
1. 空闲模式 空闲模式是指只有单片机不工作的状态。此时CPU无时钟停止工作,但是外部中断、外部低压检测电路、定时器、A/D转换、串行口等仍正常运行。 在空闲模式下,RAM、堆栈指针(SP)、程序计数器(PC)、程序状态字(PSW)、累加器(A)等寄存器都保持原有数据。I/O口保持着空闲模式被激活前那一刻的逻辑状 态。此时单片机所有的外围设备都能正常运行,当任何一个中断产生时,它们都可以将单片机唤醒,单片机被唤醒后,CPU将继续执行进入空闲模式语句的下一条指令。 怎样退出空闲模式? a.中断:任何一个中断的产生都会引起IDL/PCON.0被硬件清除,从而退出空闲模式; b.外部RST引脚复位:将复位脚拉高,
[单片机]
STC12系列<font color='red'>单片机</font>的空闲模式、休眠模式
单片机中断举例
单片机中断举例 单片机多任务执行。P1口LED灯闪烁、P3口按键输入,两任务 同时 执行。 方案一:在主程序中循环调用P1口LED灯闪烁子程序,P3口按键扫描子程序; 缺点:可能造成P3口按键输入不灵的现象; 方案二:主程序一直循环调用P1口LED灯闪烁子程序,P3口按键程序采用中断执行。 以下程序将两个外部中断全部打开,同学们可以在proteus中验证。 //******************************** //51单片机中断嵌套程序演示 //作者:曾宪阳 //网址:http://hi.baidu.com/zxymcu //*************************
[单片机]
单片机选型九大注意事项
电视,洗衣机,咖啡机,遥控器和所有类型的已连接设备都需要人机交互,微控制器(MCU)通过处理使之成为可能。 市场上有无数MCU可以执行这类解决方案,以下总结了九个选型考虑因素,以帮助减少复杂性。 1.安全 安全设计应不仅考虑外界的连接访问,而且还应防止黑客通过物理手段实施潜在的恶意攻击。黑客不仅试图获得控制权或损害设备,还会获得设备记录和用户数据。对安全的全面审查应包括屏蔽层,安全配置硬件,内存保护单元,加密引导加载程序和加速器。 2.性能 大多数MCU应用程序编程均在Arm,MIPS和X86 CPU上运行。适当的规划可确保设计人员选择正确的MCU和相应的处理器,以在现在和将来提供必要的器件和系统性能。MCU的
[单片机]
MCS-51单片机指令系统(3)
指令按寻址方式分有 7种寻址方式,直接寻址(direct)、立即寻址(#20H) 、寄存器寻址(Rn)、寄存器间接寻址(@Ri)、相对寻址(rel)、寄存器变址寻址(@A+PC)、位寻址 ( ACC.1) 指令按功能上分有5种 ,传送类指令 、算术运算类指令、逻辑运算及移位类指令、控制转移类指令、位操作类指令。其指令三大属性:功能属性、空间属性(指令站用的字节数)、时间属性(指令执行的机器周期数)。 一、数据传送指令(28): 使用最频繁的一类指令,通用格式: MOV 目的操作数 , 源操作数 属“复制”性质,而不是“搬家”。数据传送类指令不影响标志位:Cy、Ac和OV,影响奇偶标志位P。 1.内部RAM数据传送指令
[单片机]
四种简略的拓宽51单片机中断的妙招!
一、选用硬件央求和软件查询的办法: 这种办法是:把各个接连源通过硬件“或非(高有用,如CD4002)”(与,低有用)门引进到单片机外部接连源输入端(INT0或INT1),一同再把外部接连源送到单片机的某个输入输出端口,这么当外部接连时,通过“或非”(与)门致使单片机接连,在接连效能程序中再通过软件查询,进而转相应的接连效能程序。 明显,这种办法的接连优先级取决于软件查询的次第。其硬件衔接和软件编程如下: Void zhongduan (void) interrupt 0 using 3 //接连函数 { EX0=0;//关接连 If(P0_0=1) { *****}//接连查询 If(P0_1=1) {
[单片机]
恩智浦微控制器LPC54100应用于联想最新款VIBE X2 Pro
LPC54100微控制器支持 始终开启(Always-on) 传感器处理,并延长电池使用时间 恩智浦半导体(NXP Semiconductors N.V.)(纳斯达克代码:NXPI)最近宣布,预定于2015年4月发布的联想VIBE X2 Pro智能手机,将选择恩智浦LPC54100系列微控制器实现 始终开启(always-on) 传感器处理应用。联想选择LPC54100系列,是因为该系列产品具有强大的处理能力和市场领先的能效,可最大限度延长电池使用时间,同时支持目前广受欢迎的 Always-on始终开启 传感器应用的创新性特性。 目前,智能手机平均使用多达12个传感器来检测或测量诸如移动、方向、位置、语音、光照强度等
[手机便携]
基于单片机C8051F021和时钟芯片实现定时采集存储系统的设计
随着科技的高速发展,现代工业测控领域的很多应用中都需要实现大量数据的定时采集存储。以为海流计设计的海流数据采集存储接口电路为例,介绍一种定时采集存储系统的工作原理及其实现方法。 1 总体结构 在很多情况下,尤其是恶劣的工作环境下,高性能的单片机和大容量的Flash存储器是数据采集存储系统的最佳选择,本文介绍的系统也是基于这样的考虑。系统硬件结构并不复杂,包括高性能单片机C8051F021、实时时钟芯片SD2300、大容量Flash存储器K9G8G08及其外围电路,如图1所示。工作原理也较为简单,通过串口将单片机C8051F021与海流计相连,通过对单片机的编程实现对海流计的控制和使用。同时,为了实现定时采集和数据存储的功能,还
[单片机]
基于<font color='red'>单片机</font>C8051F021和时钟芯片实现定时采集存储系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved