- 相干保举
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