2016 - 2024

感恩一路有你

单片机为什么要用c语言 单片机C语言的优点有哪些?

浏览量:4808 时间:2023-03-01 19:50:59 作者:采采

单片机为什么要用c语言 单片机C语言的优点有哪些?

单片机编程是用C语言开发的,因为单片机需要非常底层的开发语言,效率非常高,而C语言可以非常灵活,非常适合控制硬件。

C语言最大的优点就是可以通过指针控制内存中的各种变量,所以非常适合单片机的开发。

当然,如果是带操作系统的硬件,也可以用cpp开发。

常用的有汇编-。asmc语言。c编译-。十六进制(十六进制)。Bin(二进制)也要看你用的是什么单片机,比如51,avr,430,pic,ARM等。

单片机C语言的优点有哪些?

C语言是单片机开发中常用的语言,其优点如下:

1)丰富的运营商;

2)丰富的数据结构;

3)简洁、紧凑、灵活、方便;

4)C是结构化语言;

5)C语言应用范围广,移植性好;

6)C语言语法限制少,编程自由度高;

7)允许直接访问物理地址,可以直接在硬件上操作;

8)C语言程序生成高质量代码,程序执行效率高。

逐渐将高级语言引入单片机的开发和应用。

c语言就是其中之一。对于习惯于组装的人来说,他们总是觉得 可控性 高级语言的不好,所以不如汇编自由。

但是,只要我们有一定的C语言知识,有些东西还是很容易做出来的。以下是笔者在实际工作中遇到的一些问题,希望对C51初学者有所帮助。

一、C51热启动代码的编译

对于工业控制计算机,通常有一个看门狗电路。当看门狗动作时,计算机复位,这是热启动。

一般情况下,热态启动时不允许从零开始,这会导致现有的测量值或计算值被重置,从而导致系统运行异常。

所以当一个程序必须判断是热启动还是冷启动时,常见的方法有:确定某个内存单元为标志位(如0x7f位和0x7e位),

启动时,首先读取存储单元的内容,如果它等于特定值(例如,两个存储单元都是0xaa),则认为是热启动。

否则就是冷启动,程序执行初始化部分,给这两个存储单元赋值0xaa。

按照上面的设计思路,在编程的时候,设置一个指针指向某个特定的存储单元,比如0x7f,然后在程序中进行判断。该计划如下:

void main()

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

if((*热点==0xaa)ampamp(*( -热点)==0xaa))

{/*热启动的处理*/

}

其他

{HotPoint=0x7e /*冷启动位置进入

*热点=0xaa

*(热点)=0xaa

}

/*正常工作代码*/

}

但在实际调试中发现,无论是热启动还是冷启动,启动后所有存储单元的值都被重置为0,当然也无法实现热启动的要求。这是为什么呢?原来用C语言编程时,启动时执行的代码并不是从main()函数的第一句开始,而a 开始代码 应该在main()函数的第一句执行之前执行。正是这个代码执行清除工作。c编译器提供了这个初始代码的源程序,命名为CSTARTUP。A51打开这个文件,可以看到下面的代码:

IDATA

如果IDATALEN ltgt 0

MOV R0,#伊达伦- 1

CLR A

·MOV

DJNZ R0,IDATALOOP

ENDIF

可以看出,初始代码在执行代码判断是否热启动之前,已经清空了所有的存储单元。如何解决这个问题?幸运的是,可以通过修改startup.a51的源文件,然后用编译器附带的a51.exe程序编译startup.a51得到startup.obj文件,再用这段代码替换原来的启动代码,来改变启动代码。具体步骤是(设C源程序命名为HOTSTART。c):

修改startup.a51源文件(该文件位于C51LIB目录中)。

执行以下命令:

A51 startup.a51获取startup.obj文件。将该文件复制到HOTSTART的目录中。C

用C51.EXE编译编译好的C源程序,得到目标文件HOTS。

酸酸的。OBJ .

使用命令L51 HOTSTART,STARTUP进行连接。OBJ获得绝对目标文件热启动。

获得快速启动。带OHS51热启动的十六进制文件。

startup.a51的修改要根据自己的需求进行。例如,如果。

LCALL 0DEOOH

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

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

定义指针后,可以给指针变量赋值以指向函数的起始地址,然后使用

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

无效总管(无效)

{

Void (*DispBuffer)() /*定义指向函数的指针*/

DispBuffer=0xde00 /*赋值*/

用于()

{密钥()

调度缓冲区()

}

}

3、将浮点数转换成字符数组

作者在编写应用程序时有这样一个要求:运算结果(浮点数)存储在EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节。例如,浮点数34.526存储为四个数字(160,26,10,66)。在EEPROM中存储一个浮点数,实际上就是存储这四个数。那么如何在程序中得到一个浮点数的组成呢?

存储浮点数时,它们存储在连续的字节中。只要你试着找到存放地点,就能得到这些数字。可以定义一个void的指针,将指针指向要存储的浮点数,然后将指针强制转换为char类型,这样就可以使用指针获得构成浮点数的每个字节的值。具体程序如下:

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

浮动a

uchar i,*px

Uchar x[4] /*定义了一个字符数组,准备存储4个字节的浮点数*,

void *pf

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

Pf=ampa /*void指针指向浮点数的第一个地址*/

a=34.526

for(i=0ilt4i)

{ *(PXI)= *(char *)pf I)/*强制将void指针改为char,因为*/

} /*void指针不能操作*/

}

如果号码已经存在EEPROM中,就要取出来合并,方法相同。请参考以下程序。

#define uchar无符号char#define uint无符号int

void CtoF(无效)

浮动a

uchar i,*px

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

void *pf

px=x

pf=ampa

for(i=0ilt4i)

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

}

}

上面使用的C语言是富兰克林C51 VER 3.2。

热启动 指针 代码 程序

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。