凌阳单片机C语言(网站整理) 下载本文

内容发布更新时间 : 2024/5/19 2:28:04星期一 下面是文章的全部内容请认真阅读。

凌阳单片机C语言

注意点一:求实参顺序 unsigned int i; i=0;

test(i,i++); 函数test的定义如下:

void test(unsigned int f,unsigned int m) {

return; }

这里我们不去追究这个函数有无意义,这里并不作讨论。

实际上,跟前面的讲解标准C的求参顺序的例子差不多,只不过把printf函数换成了一个具体的可见的函数而已。在unSP C编写以上的代码,并在IDE中进行仿真时,所得到的结果是与标准C中的是一样的,与前面的分析一样,传递参数给test函数时,test函数的两个参数将得到如下的值:f为2,m为1。感兴趣的读者可以试试。

不言而喻,说明了unSP C是与标准C没什么差别太多的,尽管去按照C语言的标准去写程序好了。 注意点二:数据类型

这里所说的数据类型,指的是我们在编程时定义变量、常量时指定的数据类型,如“char”、“unsigned int”、“int”等。

而在最前面,已经简单提到了,对于C语言,具体的数据类型的定义是可以与具体的机器相关的,也就是说这些数据类型的具体定义(如占多少个字节长度、定义的规则等)是可以容许与最终代码所要运行的CPU(或叫机器)相关的。所以在此提出,是有必要的,因为我们本书的重要目的就是单片机的C语言编程,而且是凌阳的unSP系列单片机的C编程,即有关于使用unSP C的;我们所编写的C代码最终运行的平台是凌阳unSP系列单片机。

unSP C所定义的数据类型,下表中有述,如下:

数据类型 数据长度(位) 值域

char 16 -32768~32767 short、int 16 -32768~32767

long 32 -2147483648~2147483647 unsigned char 16 0~65535 unsigned short、unsigned int 16 0~65535 unsigned long 32 0~4294967295

float、double 32 以IEEE格式表示的32位浮点数 在上表中,需要注意的是几个数据类型:

char:在unSP C里面,由于没有byte的操作,将此数据类型定义为16位的长度,与一般的8位单片机的C编译器是有区别的,读者需要注意一下。

unsigned char:与前者一样,定义为了16位的长度。

double:这是需要注意的地方,目前unSP C里定义为32位的长度,是与一般的C编译器支持的64位长度有区别的。

注意点三:使用多种数据类型

这里所说的就与单片机的C编程有关了,桌面程序的程序员,一般都不注意编译后生成的最终代码的大小,但对于单片机(或者是底层嵌入式的编程载体)而言,对最终程序的大小(即对程序存储器、数据存储器的占用大小)是斤斤计较的。

如果程序员在编程时同时使用不着unsigned与signed型的数据,则C编译器会调用不同的支持库来完成这两者不同类型的数据的操作,也就是说会增加一些程序的大小以及对RAM的占用,所以建议读者在编程时,合理地定义自己所需的数据类型。

而对于在处理速度上有要求的读者,建立采用unsigned 的数据定义,这样在运算时,只需要进行无符整型数的运算,而不需要对负数进行判断及处理,在速度上会快些。 注意点四:谨慎使用浮点数

绝大多数的单片机是没有浮点运算单元的,即CPU不支持浮点运算,而非要进行浮点运算时只能通过软件的方式完成。unSP C是凌阳16位单片机的C编程平台,与其它的单片机一样,也没有浮点的运算单元在CPU当中,所以在unSP C当中使用的浮点运算时,也是调用库(这个“库”将在后面的内容中介绍,大家可以留意一下后面的内容)里面的浮点运算库完成,然而浮点库在执行时,需要消耗大量的时间以及资源(相对于整型数的运算)。

基于前面的介绍,可以给读者一些建议,即在单片机的编程当中,尽量避免使用浮点数,可以将浮点数当作整型数处理(在精度要求允许的情况下)。比如某数据处理的程序当中,数值将在1~0.01之间,而且精度要求为小数点后两位,那为何不将数据按比例扩大,处理时以100~1之间处理呢?

所以,当您在单片机的C语言编程当中使用了浮点数,以及使用其进行了运算,结果发现程序的执行相当的慢,也就不足为奇了。 unSP IDE当中的主程序入口

在SPCE061A或者是其它的凌阳16位单片机的汇编编程当中,unSP IDE的汇编编译器把那个从复位向量跳转到指定的主程序入口的操作过程给封锁了起来,也就是说,在复位向量里面写一个跳转的指令这样的工作,无需用户去做了,只需要按照统一的主程序入口开始你的编程之旅即可。 在unSP 的汇编里面,汇编器为我们指定了统一的主程序入口:_main

其实,这仅仅是个名字而已,让大家都去统一使用的名字而已;大家在使用unSP 汇编时知道自己在“_main”标号后编写的程序即为我们的主程序,就够了,单片机在复位(包括上电)后,会自动跳到为个“_main”

的位置开始执行程序嘀。

这里多说一下有关于程序(工程)的一些概念,在利用unSP IDE进行单片机程序的开发时,首先要确认那么一个概念:一个单片机的程序即为一个工程。

将概念切入到IDE的程序开发当中,即一个工程必需有且只能有一个主程序入口,无论你是使用C语言的main函数,还是汇编语言里的_main入口。而我们要实现各种功能的子程序与主程序入口一样,可以由C语言编写,也可以由汇编语言编写,当然不能C与汇编混在一块写了(嵌入式汇编则另当他论),但不可以同名;这些不同的子程序(或称函数),可以安排在不同的文件当中,只要它们都属于一个工程当中的话,IDE在编译时会将它们链接到一起,最终生成的机器码当中与它们是没有从属关系的,都是平等的。最终来说,无非就是一个工程只有一个主程序入口(或叫主函数、主程序都可),子程序可以由程序员自行定义,支持多文件的工程结构。

在unSP IDE进行凌阳16位单片机的C语言编程,我们都要从主程序开始入手,为了与C++的规范接合,在unSP IDE里面要求最好主程序是这么定义的:int main(void)

读者大可不必追究主程序的int型返回值的意义何在,那不是进行单片机C语言编程所关注的,因为一般单片要的编程来说,主程序不应该有结束返回的时候。

在IDE当中新建好一个工程之后,新建的工程当中是没有源代码的文件的(系统自动生成的文件我们暂不作讨论,而一般也不使用那些文件进行我们的源代码编写;此外,这里所讲的是以unSP IDE2.0.0为基准,后续的IDE也许会有工程向导,会为用户自动建立源代码文件以及主程序等,但以后再说),我们需要新建一个C语言的文件(仅针对C语言编程而言),然后建议首先要完成如下代码的编写: int main(void) {

while(1) { ; }

}

其实很简单的,一个最简单的C语言程序就那么构建完成了,没有什么实际的代码,仅在主程序里面有一个死的循环,没有退出返回;单片机在复位或者是上电后,会跳转到该函数进行开始执行我们的代码,然后在while(1)的死循环当中不断的循环,我们可以将完成某些任务的代码安排在这个死循环当中,通过一定的逻辑关系进行程序结构的控制,以完成我们赋予程序的功能。 为什么要有死循环

也许有的初学者会问:为什么一定要有这么一个死循环呢?

答:我们一般将它叫做主循环,对于单片机的程序而言,一般都会有一个主循环(基于操作系统的编程实际上也会有一个无法退出返回的死循环的,只是在操作系统的支持代码里面封闭了,用户不必追究),是一会让单片机的主程序执行结束的,因为我们需要单片机一直在工作,在主循环里或者是子程序的循环里面完成我们需要它做的各种工作,试想一下,如果没有一个无法退出的死循环(主循环),让单片机将程序从头到尾执行完后,单片机还能做什么呢?那就是死机喽~~;如果您的手机是你以这们的没有主循环的程序思路进行设计的话,那么一开手机电源后,手机中的处理器将程序从头执行到尾,然后就完蛋了,这样的手机有用吗?

另外,这个简单的程序还有一个用意,也就是告诉初学者,养成良好的编程习惯,在一开始编程时将自己的程序的主要结构就构建好,然后往下的编程工作会清晰很多的。