上海龙凤419

C说话

C说话在单片机开辟中的题目

时候:2024-11-01 07:33:47 C说话 我要投稿
  • 相干保举

C说话在单片机开辟中的题目

  开辟操纵中,已逐步起头引入高等说话,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说话在单片机开辟中的几个题目C说话在单片机开辟中的几个题目。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):

  点窜startup.a51源文件(这个文件在C51\LIB目次下)。

  履行以下号令:

  A51 startup.a51 获得startup.obj文件。将此文件拷入HOTSTART.C地点目次!。

  将编好的C源法式用C51.EXE编译好,获得方针文件HOTSTART.OBJ。

  用 L51 HOTSTART, STARTUP.OBJ 号令毗连,获得相对方针文件HOTSTART。

  用 OHS51 HOTSTART 获得HOTSTART.HEX文件,便可。

  对startup.a51的点窜,按照自已的须要停止,如将IDATALEN EQU 80H中的80H改成70H,就能够使6F到7F的16字节内存不被清零。

  二、间接挪用EPROM中已固化的法式

  笔者用的仿真机,由6位数码管显现,在内存DE00H处放显现子法式,只需将要显现的数放入显现缓冲区,而后挪用这个子法式就能够操纵了,汇编指令为:

  LCALL 0DEOOH

  在用C说话编程时,若何完成这一功效呢?C说话中有指向函数的指针这一观点,能够操纵这类指针来完成用函数指针挪用函数。指向函数的指针变量的界说格局为:

  范例标识符 (*指针变量名)();

  在界说好指针后就能够给指针变量赋值,使其指向某个函数的起头存地点,而后用

  (*指针变量名)()便可挪用这个函数。以下例:

  void main(void)

  {

  void (*DispBuffer)(); /*界说指向函数指针*/

  DispBuffer=0xde00; /*赋值*/

  for(;;)

  { Key();

  DispBuffer();

  }

  }

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

  笔者在体例操纵法式时有如许的请求:将运算的成果(浮点数)存入EEPROM中。咱们晓得,浮点数在C说话中因此IEEE格局存储的,一个浮点数占用四个字节,比方浮点数34.526存为(160,26,10,66)这四个数。C说话在单片机开辟中的几个题目计较机测验。要将一个浮点数存入EEPROM,现实上便是要存这四个数。那末若安在法式中获得一个浮点数的构成数呢?

  浮点数在存储时,是存储持续的字节中的,只需想法找到存储地位,就能够获得这些数了。能够界说一个void的指针,将此指针指向须要存储的浮点数,而后将此指针强迫转化为char型,如许,操纵指针就能够获得构成该浮点数的各个字节的值了。详细法式以下:

  #define uchar unsigned char#define uint unsigned intvoid FtoC(void)

  { float a;

  uchar i,*px

  uchar x[4]; /*界说字符数组,筹办存储浮点数的四个字节*、

  void *pf;

  px=x; /*px指针指向数组x*/

  pf=&a; /*void 型指针指向浮点数首地点*/

  a=34.526;

  for(i=0;i<4;i++)

  { *(px+i)=*((char *)pf+i); /*强迫void 型指针转成char型,由于*/

  } /*void型指针不能运算*/

  }

  若是已将数存入EEPROM,要将其掏出归并,体例也是一样,可参考上面的法式。

  #define uchar unsigned char#define uint unsigned int

  void CtoF(void)

  { float a;

  uchar i,*px

  uchar x[4]={56,180,150,73};

  void *pf;

  px=x;

  pf=&a;

  for(i=0;i<4;i++)

  { *((char *)pf+i)=*(px+i);

  }

  }

  以上所用C说话为FRANKLIN C51 VER 3.2。

【C说话在单片机开辟中的题目】相干文章:

单片机C说话有几种内存泄漏题目08-29

单片机C说话的益处06-25

若何优化C说话(单片机)06-01

C++、C说话和JAVA开辟的区分06-28

C说话八皇后题目10-22

C说话的可变参数题目08-23

C说话中内存分派题目09-13

C说话函数参数通报题目10-17

C++、C说话和JAVA开辟有哪些区分08-09

若何进步单片机C说话代码效力10-30