单片机用c语言
A. c语言在单片机中的应用
单片机就像是一个躯体,而程序就是它的灵魂。C语言就是制造(编写)它的灵魂的工具。
单片机中的C语言与标准C语言有一些不同,有很多对位的定义和操作。在单片机应用中最常用的编译软件是KEIL
C51,功能强大。
C语言是一种高级语言,在单片机应用中其优点也是非常突出:编程灵活、可读性、可移植性都很强。当然,若能在学C之前懂一些汇编语言,就更好啦。既能熟悉位操作,又能发挥C语言的优势。
B. C语言,单片机主要运用到那些
在单片机的开发应用中,已逐渐开始引入高级语言,
C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲。
但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。
一、C51热启动代码的编制
对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启春悔动。
热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。
因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),
启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,
否则就是冷扒亏正启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。
根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:
voidmain()
{chardata*HotPoint=(char*)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))
{/*热启动的处理*/
}
else
{HotPoint=0x7e;/*冷启动的处进
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
/*正常工作代码*/
}
然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段’起始代码’。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:
.
IDATALENEQU80H;thelengthofIDATAmemoryinbytes.
.
STARTUP1:
IFIDATALEN<>0
MOVR0,#IDATALEN-1
CLRA
IDATALOOP:MOV@R0,A
DJNZR0,IDATALOOP
ENDIF
.
可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):
修改startup.a51源文件(这个文件在C51LIB目录下)。
执行如下命令:
A51startup.a51得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。
将编好的C源程序用C51.EXE编译好,得到目标文件HOTS
TART.OBJ。
用L51HOTSTART,STARTUP.OBJ命令连接,得到绝对目标文件HOTSTART。
用OHS51HOTSTART得到HOTSTART.HEX文件,即可。
对于startup.a51的修改,根据自已的需要进行,如将IDATALENEQU80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。
二、直接调用EPROM中已固化的程序
笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:
LCALL0DEOOH
在用C语言编程时,如何实现这一功能呢?C语言中有指向函数的指针这一概念,可以利空租用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:
类型标识符(*指针变量名)();
在定义好指针后就可以给指针变量赋值,使其指向某个函数的开始存地址,然后用
(*指针变量名)()即可调用这个函数。如下例:
voidmain(void)
{
void(*DispBuffer)();/*定义指向函数指针*/
DispBuffer=0xde00;/*赋值*/
for(;;)
{Key();
DispBuffer();
}
}
三、将浮点数转化为字符数组
笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节,例如浮点数34.526存为(160,26,10,66)这四个数。要将一个浮点数存入EEPROM,实际上就是要存这四个数。那么如何在程序中得到一个浮点数的组成数呢?
浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为char型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:
#defineucharunsignedchar#defineuintunsignedintvoidFtoC(void)
{floata;
uchari,*px
ucharx[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,要将其取出合并,方法也是一样,可参考下面的程序。
#defineucharunsignedchar#defineuintunsignedint
voidCtoF(void)
{floata;
uchari,*px
ucharx[4]={56,180,150,73};
void*pf;
px=x;
pf=&a;
for(i=0;i<4;i++)
{*((char*)pf+i)=*(px+i);
}
}
以上所用C语言为FRANKLINC51VER3.2。
C. 51单片机c语言是什么意思
C 语言,是计算机编程语言。
适合于入门者学习、使用。
51 单片机,是一种微型计算机。
用 C 语言,对其编程,就是“51单片机c语言”。
D. 单片机用什么语言编程
单片机用以下语言可以编程:
1、C语言。单片机C语言是一种编译语言,具有编译语言的特点。C语言具有功能丰富的库函数、计算速度快、编译效率高、可移植性好,可直接控制系统。此外,C语言程序具有完整的程序模块结构,为软件开发中模块化程序设计方法的使用提供了有力的保证。
2、汇编语言。它的主要优点是占用资源少,程序执行效率高。因为它有一个指令,所以每个指令都很清晰,堆叠和调整都很容易控制,调试也很方便。但是不同类型的单片机可能有不同的编码语言,所以不容易移植。
3、PL/M编程语言。P/M是一种具有L/M语言的高级语言,不仅具有L/M语言的高级汇编,而且直接利用CPU的硬件特性进行编程。因此,与其他高级语言相比,它具有更多的功能和更广泛的应用,尤其是在16台单片机的应用领域。
4、BASIC编程语言。BASIC是一种高级语言,其英文意思是初学者通用符号代码。在过去的几十年里,BASIC语言被认为是初学者编程的语言,已经从QBASIC发展到很多版本,有很多结构化的思维和编程方法,比如函数、模块、局部变量、全局变量、数据传输等。
使用单片机语言的注意事项。
1、单片机编程的特点对单片机编程来说,首先要考虑的是单片机的程序空间和数据空间都是有限的,所以要让程序尽量短小精悍,以节省程序占用的存储空间。
2、单片机编程的一个主要对象是对单片机的端口和内部寄存器的操作和配置,这个需要比较精确的时序控制。
3、单片机算法运算中,尽量使用加法、减法、移位运算,因为乘法和除法运算会非常费时间,尤其是除法,会耗费很多时间,这对于速度本身就有限制的单片机来说,是一个很大的负担。
4、高级语言编写单片机程序的缺陷高级语言可以实现更为优化的算法,更为方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言多很多。这是最致命的一点,单片机有限的存储空间需要靠精打细算来设计程序,根本经不起高级语言臃肿的代码体积。
E. 单片机c语言char和int什么区别啊
在单片机C语言中,char和int都是数据类型,但它们的数据范围和作用有很大的区别。
char类型通常被用来表示字符型数据,比如字母、数字、符号等。在单片机中,char类型通常占用1个字节(8位),其数据范围一般是-128到127或0到255。char类型的变量通常用于存储单个搭态首字符或字符串。
int类型通常被用来表示整型数据,比如整数。在单片机中,int类型的大小通常是2个字节(16位),其数据范围一般是-32768到32767或0到65535。int类型的变量通常用于存储整数型闭歼数据。
因此,char和int的区别主要在于数据范围和作用。在单片机C语言中,char类型通常用于存储字符型数据,而int类型则用于存储整型数据。需要注意的是,char类型的变量可知数以通过强制类型转换(如(int)ch)转换为int类型的变量,但可能会导致数据精度的损失。
F. C语言与单片机C语言的区别 急求
单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c语言的基础部分。具体体现在:
1、单片机中C的语法一般都对ANSIC有些扩展,及一些特殊写法如C51扩展的dataxdatabitsbit一类的,还有一些中断程序写法voidint()interrput1一类的。
2、C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样DOS上的TC2TC3WINDOWS上的VC8051的C51都有自已的编译器。具体区别是由编译器决的,只能参考对应的编译手册,即使同种平台不同的编译器对C的扩展也有不同。
3、单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。
C51本质就是C,是为在单片机上使用C而出来的,如果C不牢固,还是多掌握一点C再学C51,不过新增的知识也不少,而且基本上跟C无关。
4、C只是一种高级语言。它除具有一般高级语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使之方便于在写语句的时候,直接直观的编写。这样就差不多是单片机C语言。
C语言的特性差不多都可以用于单片机C语言,因为它们的编译机理都是一样的。
(6)单片机用c语言扩展阅读:
C语言:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、TurboC等。
单片机的C语言:
单片机软件设计使用C语言作为编程开发软件,采用模块化的程序结构,设计了按键模块程序、RFID模块程序、日历时钟模块程序、GPRS模块程序、显示存储模块程序等,并编写系统主程序,将五个程序模块组合在一起,实现单片机控制系统的整体功能。
51单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。
单片机的C语言采用C51编译器(简称C51)。有C51产生的目标代码短,运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用
C语言-网络
单片机C语言-网络