广西正久职业学校
 广西正久职业学校欢迎您的到来!域名:http://www.gxzjzx.net 今天是:    | 加入收藏 | 设为首页

您现在所在的位置:首页 >>教学科研 >> 文章内容
C语言在单片机开发中的应用
双击自动滚屏
文章来源:互联网   发布者:admin   发布时间:2014-5-18 23:18:56   阅读:4771
  在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言可控性不好,不如汇编那样随心所欲。但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。

一、C51热启动代码的编制

对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(0x7f位和0x7e),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。

根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:

void main()

{ char data *HotPoint=(char *)0x7f;

if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))

{ /*热启动的处理 */

}

else

{ HotPoint=0x7e; /*冷启动的处进

*HotPoint=0xaa;

*(++HotPoint)=0xaa;

}

/*正常工作代码*/

}

然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段起始代码。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:

.

IDATALEN EQU 80H ; the length of IDATA memory in bytes.

.

STARTUP1:

IF IDATALEN <> 0

MOV R0,#IDATALEN - 1

CLR A

IDATALOOP: MOV @R0,A

DJNZ R0,IDATALOOP

ENDIF

.

可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对 startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):

  1. 修改startup.a51源文件(这个文件在C51\LIB目录下)

  2. 执行如下命令:

    A51 startup.a51 得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。

  3. 将编好的C源程序用C51.EXE编译好,得到目标文件HOTSTART.OBJ

  4. L51 HOTSTART, STARTUP.OBJ 命令连接,得到绝对目标文件HOTSTART

  5. OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。

对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F7F16字节内存不被清零。

二、直接调用EPROM中已固化的程序

笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:

LCALL 0DEOOH

在用C语言编程时,如何实现这一功能呢?C语言中有指向函数的指针这一概念,可以利用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:

类型标识符 (*指针变量名)();

在定义好指针后就可以给指针变量赋值,使其指向某个函数的开始存地址,然后用

(*指针变量名)()即可调用这个函数。如下例:

void main(void)

{

void (*DispBuffer)(); /*定义指向函数指针*/

DispBuffer=0xde00; /*赋值*/

for(;;)

{ Key();

DispBuffer();

}

}

三、将浮点数转化为字符数组

笔者在编制应

[1] [2]  下一页


【 字体: 打印本页 | 关闭窗口
 
 本文的地址是: http://gxzjzx.net/onews.asp?id=94  转载请注明出处!
 站内搜索
 最新推荐
图片新闻
赓续红色血
图片新闻
正久育英才
1  广西正久职业学校职业教育质…
2  赓续红色血脉,立志技能报国…
3  正久育英才 体艺展风华——…
4  2025年广西正久职业学校…
5  广西正久职业学校收费公示
6  2025年钦州市职业院校教…
7  2025年钦州市职业院校教…
8  2025年钦州市职业院校教…
9  茶叶审评五步法实操视频
10  茶叶扦样技术规范与实操视频
 热门新闻
图片新闻
赓续红色血
图片新闻
正久育英才
  CAD技巧 120个 绝… 39944
  常用英语名词之二 17599
  广西正久职业学校中等职业… 17167
  广西正久职业学校2018… 14504
  广西正久职业学校2017… 14281
  全国计算机等级考试二级笔… 12042
  中等职业学校德育教育 11825
  校园趣事 11344
  广西国际商务职业技术学院… 11261
  电子设备中电路板布局、布… 10087
广西正久职业学校
  |设为首页 | 收藏本站 | 咨询留言 | 联系我们 | 友情链接 |
广西正久职业学校页面执行时间:22.352毫秒    备案号:桂ICP备20002313号-1   技术支持QQ:1759177897