• 单片机diy电压表头 > 要:介绍用高级语言C自动生成单片机的查表程序
  • 要:介绍用高级语言C自动生成单片机的查表程序

    免费下载 下载该文档 文档格式:DOC   更新时间:2008-04-01   下载次数:0   点击次数:1
    文档基本属性
    文档语言:Simplified Chinese
    文档格式:doc
    文档作者:Ray
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    摘 要:介绍用高级语言C自动生成单片机的查表程序,用查表的方法取代繁琐复杂的数学运算,计算精度高,时间短.包括自动生成程序的原理以及D/A输出复杂波形,非线性插值的示例.
    关键词:单片机 自动编程 查表 高级语言
    在单片机应用系统中,常用到许多复杂的数学计算,如计算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("cont 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; /*转换成弧度*/

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 DOC格式下载
  • 您可能感兴趣的
  • 单片机diy  lcd数字电压表头  电压表数显表头  数字电压表头  电压表头  交流电压表  高精度数字电压表  数显电压表  指针电压表