单片机为什么要用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。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。