单片机C语言编程应注意的若干问题

发布者:码梦创想最新更新时间:2012-03-09 来源: 微计算机信息 关键字:单片机  C语言  汇编语言  结构化设计 手机看文章 扫描二维码
随时随地手机看文章

    作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。

1 单片机C语言主要特点
    用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能[1],这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。
在实际单片机程序设计中,程序结构一般均采用如下结构:
#include        /*头文件说明部份*/
unsigned char x1,x2;  /*全局变量声明部份*/
…Function1(… ){       /*功能函数定义部份*/
……     }
main() {
  inti,j;          /* 整型变量声明部份*/ 
Function1(…);  /* 功能函数说明部份*/
……}

2 单片机C语言与标准C语言的区别
    由于现在越来越多的产品都采用单片机开发,所完成的计算和控制工作也日趋复杂,但是单片机系统是一种资源十分有限的系统,这主要表现在程序存储器资源的不足,因此在程序设计时如何使用好这些有限的资源就显得十分重要。用C语言编程虽然具有许多的优点,但是生成的代码相对要长,要是编程技术不好,生成的代码甚至有可能比汇编语言生成的代码长几倍,因此对编程者来说,应该注意到单片机C语言和一般意义上的标准C语言的区别,对程序进行适当的优化。
2.1 数据类型的选用
     单片机C语言编程不同于一般的C语言编程的显著的一个特点,就是要和程序存储器资源结合起来,虽然其提供的数据据类型十分丰富,但是只有bit和char 等数据类型是是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短;而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说用该类数据类型的语句生成的代码要长。有些C语言程序表面上看起来十分的简单,但在在实际编译时,生成的代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大的减少所生成的代码长度。例如在C51中每种数据类型变量所占用存储器字节数和经编译后生成的代码长度如表1所示:

表1 不同数据类型占用存储器字节数和代码长度对比

     通过表1我们知道,不同的数据类型所生成的机器代码长度相差很多,相同类型的数据类型有无符号对机器代码长度也有影响。在程序编译时生成机器代码长的数据类型的优先级越高,不同的数据类型在进行程序运算时要转化为高优先级的的数据类型,相应的代码长度也会增长[2]。因此我们应尽可能地使用 bit,char等机器语言直接支持的数据类型,无符号数的变量应声明为无符号数,尽可能地减少程序中使用的数据类型的种类。
2.2 算法设计问题
     单片机C语言和标准C语言存在着很大差别,在计算机上进行C语言程序设计时由于不必考虑程序代码的长短,只需考虑程序功能实现,但是在单片机上进行C语言程序设计就必须考虑系统的硬件资源。有时并不是程序的算法越简单、长度越短越好,因为有一些算法要调用一些内部的子程序和函数,生成的机器代码长度非常长。不同的算法对程序代码长度影响十分大,因此在进行程序设计时,就尽量采用程序生成代码短的算法,在不影响程序功能实现的情况下可以采用一些优化算法 [2]。
     在单片机C语言编译成机器代码时,不同的运算生成的机器代码的长度相差很大,尽可能地减少程序中对某种数据类型的运算种类,越复杂的数据类型效果越明显。在进行数据计算时,在一定的精度范围内,可以用一些近似的计算来完成一些运算,既不损失精度又能减少大量的代码。比如:用逻辑AND/&取模比MOD/%操作更有效。
    在用热敏电阻测量温度时,可根据热敏电阻—温度特性公式来求值。数学表达式表示为:
RT=RT0expB(1/T-1/T0)
    如果直接按照公式温度时程序结构简单,算法复杂度不高,但是程序将调用文件中的对数函数,在编译成机器码时函数有1K多字节,对于一般只有几K字节的单片机系统来说,这是十分不合适的。考虑到系统资源问题可以用一种替代方法—查表法来实现算法。只要给出一定温度范围内不同温度值对应热敏电阻的电阻值,然后建立表格,只要按照系统求出的阻值,进行查表,插值,就可以求出相应的温度值。这种算法相比前面的的公式法的算法复杂高,C语言程序代码也长,但在编译成机器码时,代码长度却很短,只有一、二百字节。[page]

3  数据存储器的分配
    单片机内部数据存储器RAM只有几百字节,如果扩展外部存储器RAM来提高数据存储量话必将会增加了硬件成本,使系统更加的复杂,访问外部存储器比访问内部存储器所需的代码也要长得多。有效地使用片内存储器、提高存储器空间的利用率对开发者来说十分关键。
    内部处理器、内部堆栈、压缩栈、所有程序变量和所有包含进来的库函数都将使用数量有限的内部数据存储器RAM。因为C语言采用了存储器的覆盖技术[2],可以在程序进行连接时,它将那些已经被其它程序段释放了的存储器空间重新定义给另一个程序段的变量使用,当这个程序运行结束时再将这些存储器释放以供其它程序段使用。全局变量的作用范围是整个程序,因此不能被释放;静态变量由于在函数的调用中专用不变,也不能被释放;只有局部变量中的动态变量可以被释放。
    因此在进行程序设计时应该尽量的使用局部变量,提高内部数据存储器的使用率。在C语言中程序中间结果及参数传传递是通过内部的寄存器来完成的,要是内部的存储器不够,将会给你的程序带来许多莫名其妙的错误。例如在进行程序设计时语句不应该太长,一个长语句可以分成多个语句,这样的话可以大的减少中间变量,当然太长时就会造成临时寄存器的不够用,导致计算出错。

4 单片机C语言与汇编语言的混合编程
    在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。这种混合编程[2]的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。
    目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。
    当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。在这种混合编程技术中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。
    对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。
    下面就以AT89C2051单片机在模拟电压检测中的应用为例说明C语言程序与汇编语言程序的调用。电路图如图1所示:

    AT89C2051单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。由于系统对时钟要求很严格,因此就采用了C语言和汇编语言混合编程技术,程序调用形式如下:
    汇编子程序:
PUBLIC  _AD           ;入口地址
con  SEGMENT CODE     ;程序段
RSEG    con
_AD:   SETB  P3.7       ;充电
Loop:    JB  p3.6,AD_END   ;开始计数匹配
INC A       
CJNE  A,#100,Loop
AD_END:  CLR P3.7  ;放电       
CJNE  A,#100,Ret_Val   ;看结果是否有溢出,有溢出说明结果不对
SJMP  Con_OV;返回值         
Ret_Val:DEC A
MOV R7,A         ;A/D转换的结果保存在R7中,传递给主程序
Con_OV: RET 
        END
 单片机C程序:
 include
unsigned char AD(unsigned char);//在C程序中声明汇编模数转换子程序
……………
 void timer0(void) interrupt 1 using 1{   
    ………
 unsigned char x;           
 x=AD();             //在C程序中调用汇编程序
    ………
}
Main{                 //主程序
………
}
    在以上程序中,函数的返回值为一无符号字符型数,根据调用规则,返回值在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。

5 结束语
    C语言具有很强的功能性和结构性,可以缩短单片机控制系统的开发周期,而且易于调试和维护,已经成为目前单片机语言中最流行的编程语言。
    本文就单片机C语言的特点以及在开发过程中的一些问题给予分析并提供了解决方法,为广大单片机开发人员提供了可借鉴的经验。

参考文献
1 王平,邢建春,王林.一种快速有效拦截弹飞的单片机程序新方法. 微计算机信息,1997,4(13):80-81.
2 马忠梅,籍顺心,张凯,马岩.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1999.

关键字:单片机  C语言  汇编语言  结构化设计 引用地址:单片机C语言编程应注意的若干问题

上一篇:单片机测控系统的软硬件平台技术
下一篇:AT89C52单片机与VB串行通信的实现

推荐阅读最新更新时间:2024-03-16 12:55

用C51系列单片机设计物体分级设备的测量光幕
1 引言 光幕是电子测量系统中应用比较多的一种设备。利用光幕可以测量恒速传送带上的物体高度、长度或宽度等一系列数据,以便为后面的电子系统提供相应的参数。本文给出了一种利用单片机实现物体高度测量的光幕测量方法。 2 光幕测量物体高度的基本原理 图1所示是一个用普通光幕测量物体高度的测试原理结构示意图。图中,光幕的一边等间距安装有多个红外发射管,另一边相应的有相同数量同样排列的红外接收管,每一个红外发射管都对应有一个相应的红外接收管,且安装在同一条直线上。当同一条直线上的红外发射管、红外接收管之间没有障碍物时,红外发射管发出的调制信号(光信号)能顺利到达红外接收管。红外接收管接收到调制信号后,相应的电路输出低电平,而在有障碍物的
[测试测量]
用C51系列<font color='red'>单片机</font><font color='red'>设计</font>物体分级设备的测量光幕
单片机上电复位时间
单片机及其应用电路每次上电的过程中,由于电源回路中通常存在一些容量大小不等的滤波电容,使得单片机芯片在其电源引脚VCC和VSS之间所感受到的电源电压值VDD,是从低到高逐渐上升的。该过程所持续的时间一般为1~100 ms(记作taddrise)。上电延时taddrise的定义是电源电压从10% VDD上升到90% VDD所需的时间.在单片机电源电压上升到适合内部振荡电路运行的范围并且稳定下来之后,时钟振荡器开始了启动过程(具体包括偏置、起振、锁定和稳定几个过程)。该过程所持续的时间一般为1~50 ms(记作tosc)。起振延时tosc的定义是时钟振荡器输出信号的高电平达到Vih1所需的时间。从图1所示的实际测量图中也可以看得很清楚
[单片机]
128*64液晶采用"单片机内部显示缓冲"的程序
/* * * 文件名称: * 摘 要 : 读写lcd显示缓冲区 * * 当前版本:v1.0 * 作 者 :laoliu2008 * 完成日期:2008年4月12日 */ #i nclude pcb.h #i nclude 全局变量.h unsigned char xx,yy;//全局插入点坐标 extern const unsigned char character_tab ; //显示数据库 extern const unsigned char Chinese_characters_tab ;//显示数据库 unsigned char lcd_bit_buffer ;//显示缓冲区
[单片机]
STC12系列单片机解密介绍
STC单片机是由深圳宏晶公司销售的一款单片机芯片,至于设计和生产,有很多说法,网络上可以查到的资料,有的说是美国公司按照SST公司的内核设计的,由宏晶公司贴牌销售的,也有的说是由ST公司设计的。至于生产的说法更多,有的说是由台积电生产。有的说是由台湾其它公司代工生产的。而在宏晶公司的官方网站上看不到任何这个方面的信息,只有简单的两个页面,基本上全是芯片的PDF文件和ISP下载软件,并且发现用户手册的PDF手册是无法复制的,正如很多网友评论好象是遮遮掩掩,其实这样给设计人员选择带来了很多疑虑,好象没有了使用该产品的信心,不过做为解密工程师并不关心这个问题。 在STC89系列单片机推出后,曾经号称无法解密的单片机,但是经过芯片解密工
[单片机]
STC12系列<font color='red'>单片机</font>解密介绍
基于单片机的基于模糊控制的客车烘房温控仪
0 引 言 目前,国内客车烘房有燃油、燃气(天然气)、电加热,以及蒸汽烘房等。烘房的温度是生产工艺的一项重要指标。本课题研究的烘房类型为热风对流型烘房,热源为200℃的过热蒸汽,温度控制采用较为传统的PID类调节器,通过温控阀门调节蒸汽流量,控制烘房温度。由于PID类调节器具有原理简单,易于实现等优点,因而在过程控制中得到广泛的运用。始终占据过程控制的主导地位,但鲁棒性能不理想,对大滞后和强干扰的过程表现出明显的不足。模糊控制是一种无需建模、方便易懂、执行简便、开发成本低廉的非线性控制技术。由于具有这些优点,本文拟将模糊控制技术应用于客车烘房的温度控制,并做出了一些尝试。 1 温控仪原理框图 样机以AT89C55WD
[单片机]
单片机学习札记5---定时器和中断配置
这一节,解释一下上一节的那个程序,用到什么,我们就学什么。 ①新建一个程序,首先要包含头文件,比如很多人用STC89C52,因为是标准的51内核,要写 #include reg51.h 就可以了,但是STC15W系列不是标准的51内核,他加了很多的功能进来,加了很多的特殊功能寄存器(SFR),所以要添加一个自己新建的头文件,stc15w.h ,这个是官方提供的,在下载客户端栏目里头,找头文件,直接复制添加进来就是了,如下图: 所谓的特殊功能寄存器,简单点就是8个开关,8个开关的不同组合开关状态会实现不同的功能,有些外设在使用前必须要设置,有的寄存器必须8个位一起操作,这叫不可位寻址,有的可以单独操作,比如EA = 1;这个
[单片机]
<font color='red'>单片机</font>学习札记5---定时器和中断配置
基于嵌入式PsoC的MCU选色控制器设计
摘要:阐述Cypress公司的可配置片上系统(PSoC)的功能及其实现结构;结合选色控制器开发实例,详细阐述使用PsoC开发的方法和流程。其设计方法也可用于其它控制系统或工业自动化等各种应用。 关键词:PsoC(可配置片上系统) 选色控制器MCU 引言 最近几年,随着电子技术及半导体工艺的迅猛发展,片上系统(SoC),特别是可配置片上系统PsoC(Programmable System on Chip),已逐渐成为微控制器的主流产品。因此,要求设计工程师必须迅速地掌握SoC的开发特点和要求,尽快融入SoC的开发大潮中去。但是,SoC系统设计带来了与传统系统设计全然不同的挑战,其中包括从处理器和存储器的选择到产品环境的考虑。
[单片机]
德州仪器宣布其SimpleLink™ MCU平台集成全新的Amazon FreeRTOS
德州仪器(TI)近日宣布,SimpleLink™微控制器(MCU)平台集成全新的亚马逊FreeRTOS,帮助开发商快速而安全地将物联网(IoT)终端连接到云端。亚马逊网络服务(AWS)与德州仪器合作开发了集成的硬件和软件解决方案,使开发人员能够快速建立与AWS物联网服务的连接,立即开始系统开发。如需了解更多信息,敬请访问 www.ti.com/AWSIoT-pr-cn 。 亚马逊近日在拉斯维加斯的AWS re:Invent 2017大会上推出了FreeRTOS,可提供快速方便地部署基于微控制器的连接器件和开发物联网应用所需的工具,使用户无需再为涉及数百万器件的扩展而困扰。连接后,物联网器件应用程序可以利用云服务提供的各项功能
[物联网]
德州仪器宣布其SimpleLink™ <font color='red'>MCU</font>平台集成全新的Amazon FreeRTOS
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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