初学C语言编程基础知识
(1)学习过C语言的同学在对单片机有了基本了解之后,就可以开始试着写一两个基于单片机的C语言的程序了。C51语言继承了ANSI C 的绝大部分的特性,基本的语法相同,同学们上手会比较快。但是,由于C51语言是对硬件进行控制的编程语言,其本身又在硬件结构上有所扩展以增强C语言对硬件的控制,如关键字sbit,data,code等(后面会讲他们是做什么的)。
(2)因为单片机不是我们平时用的计算机,他的英文名为MCU(微控制器),特点体现在这个“微”字。因而,它里面的硬件资源是非常少的,所以你在写程序的时候就要注意对RAM(存储数据)和ROM(存储程序)的使用。说白了,就是也程序的时候要尽量精简,如各种算法,不要让系统负担太大。少用浮点运算,能够使用unsigned的无符号型数据,就不要使用有符号的(当你写程序时,你会发现很多位置都用的unsigned,不像我们在ANSI C里面不同,不太注意,C51里面就非常注意资源的控制)。避免乘除,多用移位运算(写走马灯程序时,会使用到,很有意思,不是我们想象的用循环控制)。
基本的特性了解之后,我们来讲下,具体的东西:
首先,是C51针对硬件控制增加的一些关键字,数据类型。
(1)bit : 和我们平时用的int,char相同,只不过int是两个字节(16位,16bit),char是单字节(8位,8bit),bit就是一位,取值范围是0和1,类似windows编程里的BOOL。
(2)sbit : sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbit x x x = REGE^6这样的定义(例如,sibt a = P0^0,定义P0口的第0位为变量a,此时对a赋值0或者1时,就是在对P0口的第0位进行控制,赋低电平或高电平),这个sbit量就确定地址了。(sbit大部分是用在特殊功能寄存器中的,方便对寄存器的某位进行操作的`。)
(3)sfr:用于定义特殊功能寄存器(8位的)(在程序中会写头文件#include,在Keil中右键点击打开reg51.h,就可以看到很多sfr的定义),如sfr P0 = 0x80,就定义了端口P0。
(4)sfr16:同上用于16位的
其次,C51还提供了对8051所有存储区的访问。
8051芯片的存储区从逻辑上分为内部数据存储区,外部数据存储区和程序存储区(内外统一编址)。
80C51有4KB的内部程序存储区(片内ROM)(0000H~0FFFH),其中前43单元有特殊用处,0000H~0002H无条件跳转,0003H~002AH用于存放中断程序(中断程序这里不解释)
256B的内部数据存储区(片内RAM),分为低128B和高128B,有不同作用(可见硬件资源有多小了吧,所以我们要节省使用),低128B又分为为工作寄存器区,又称通用寄存器(00H~1FH),位寻址区(20H~2FH,之前的sbit就是对应位寻址空间中的一位),数据缓冲区(30H~7FH,这个区域就是给用户用得,没有任何限制,一共80个单位)
高128B为特殊功能寄存器(就是上面说的sfr),具体的内容在很多书上面都有。
http://www.mytutorialcafe.com/MicrocontrollerSpecialFunctionRegister.htm
给个英文的sfr的解释的网址,不过没必要看,看书就行了。
在这里讲这么多的原因是因为C51中在对变量进行声明的时候还可以明确的指定存储空间。关键字有:DATA,IDATA,BDATA(RAM中高128B),CODE等。
(1)DATA指定RAM中低128B,可以在一个机器周期内直接寻址,寻址速度最快,所以应该把经常使用的变量放在DATA区
例如:unsigned char data system_status = 0;
(2)BDATA指定的是RAM中的位寻址区,在这个区域定义的变量可以进行位操作,什么意思呢?举例吧
unsigned char bdata status_byte,这里定义变量status_byte,是一个单字节(8位)的数据变量,我们可以对这个变量中的一位进行置0或置1的操作。我们把 status_byte=0x00,即变量里面的8位都置为了0,前面讲过一个sbit,用于位寻址区域中的一位,sbit a = status_byte^2;a = 1,表示把变量 status_byte的第2位置为了1(0,1,2,3,4,5,6,7共八位),于是变量 status_byte就等于了0x02;
(3)CODE 程序存储区,他里面的内容是不变的,我们要使用的一些固定数据存于这个里面就不用占用RAM的空间了,比如我们学习数码管显示程序时,数码管上面的每一个数字都对应一个16进制的数字,我们可以把它存到程序存储区中去,例如:
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
关于特殊功能寄存器sfr的使用,我们以一个简单的程序为例,在80C51芯片的P0^0上接上一个发光二极管LED,一个电阻RES和一个电源VCC,三者串联,电流方向是从电源流向P0^0口。给80C51接上电源,接地,晶振,复位电路。如果使用proteus仿真,则这些电路不用接。
在Keil软件中写程序
#include
sbit a = P0^0;
void main(){
a = 0;
while(1);
}
因为芯片刚刚上电,P0管教为高电位,我们在程序中把它置为0;电流就可以流过LED,于是LED灯就会发光。并用while(1)让程序停在这里。
一个最简单的单片机C语言程序就写完了。讲了这么多希望同学们了解,C51对C语言的扩展有所了解,知道可以通过C语言对硬件进行控制,学会常用的关键字。
C语言基础知识总结
算法结构:
一、顺序结构、选择结构、循环结构;二、循环结构又分为while型、until型、for循环结构;程序流程图;
结构化程序设计方法:
(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码。
数据类型:
常量:常量包括字面常量、直接常量和符号常量;
变量:C语言规定标志符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或者下划线;必须压迫先定义后使用;每一个变量被定义以确定类型后,在编译时就能为其分配相应的存储单元;
整数类型:整数常量有十进制、八进制和十六进制;“%d”
整形变量:数据在内存中存放形式是以二进制形式存放;有int型、short int型和long int型,无符号整型变量的范围是-32768—32767,有符号型为0~65535.通常把long定义为32位,把short定义为16位,int可以是32位也可以为16位,这都主要取决于机器字长。
实型常量的表示方法:(1)十进制,0.0;(2)指数形式,123e3
实型变量:实数型数据在内存中的存放形式,一般在内存中占4个字节,分成整数部分和小数部分存放。实型变量分为float型、double型long double型。实型数据会存在舍入误差。
实型常量的类型:C编译系统将实型常量作为双精度来处理。
字符型数组:(一)字符常量:转义字符(\n——换行,\t——tab,\r——回车,\f——换页,\b——退格,\ddd——1到3位8进制的数代表的字符)
(二)字符变量:字符数据存储形式实际是以ASCII码存储。“%c”
字符串常量:双撇号括起来的一系列字符序列。
C的运算符有以下几种:
1、算术运算符(+ - _ / %)结合方向自左向右
2、关系运算符(> < =="">= <= !="">
3、逻辑运算符(! && ||)
4、位运算符(<>> ~ | ^ &)
5、赋值运算符(=及符号扩展赋值运算符)
6、条件运算符(? : )
7、逗号运算符( , )
8、指针运算符(_ &)
9、求字节运算符(sizeof)
10、强制类型转换运算符((类型))
11、分量运算符( . ->)
12、下标运算符([])
13、其他
控制语句:
完成一定的控制功能。
1、if()~else~
2、for()~
3、while()~
4、do~while()
5、continue
6、break
7、switch
8、goto
9、return
字符数据的输入输出:
1、putchar()输入字符变量
2、getchar()只能接受一个字符
格式输入输出:
1、printf(%d—整型,%c—字符型,%ld,%md,%o,%u,%s,%-m.nf,%e,%g)
2、scanf(格式控制,地址列表)
数组
一维数组的定义:类型说明符 数组名【常量表达式】;先定义后引用;一维数组初始化时可以只对一部分元素初始化,在对全部数组元素初始化的时候可以部规定长度;但是若被定义的数组长度与提供的初始值不一样时,则数组长度不能省略。
二维数组的定义:类型说明符 数组名【常量表达式】【常量表达式】C语言中存放二维数组是先存放第一行的元素,紧接着是第二行,其实也是以一维的方式存放。如果初始化时能指定所有元素的初始值,第一维大小可以省略,但是第二维不能省略。
字符数组:定义和初始化跟数组差不多,只是需要加单引号。字符和字符串结束标志,C语言规定,以'\0’代表。
字符串处理函数:
1、puts()将一个字符串输出到终端
2、gets()从终端输入一个字符串到字符数组,并且得到一个函数值。
3、strcat()链接两个字符数组中的字符串。
4、strcpy()字符串复制函数。
5、strcmp()比较字符串作用。
6、strlen()测试字符串长度的函数不包括“\0”
7、strlwr()将字符串中的大写字母转换为小写字母。
8、strupr()将字符串中的小写字母转换为大写字母。
函数
(1)一个源程序由多个函数组成。
(2)C程序的执行从main()函数开始;
(3)所有函数都是平行的;
(4)函数分类;可以分为标准和自定义,还可以分为有参函数和无参函数。
函数定义的一般形式:
(1)类型标志符 函数名()
{
声明部分
语句
}
(2)类型标志符 函数名(形式参数列表)
{
声明部分
语句
}
关于形参和实参的说明:
(1) 在定义函数中指定的形参,在未出现函数调用时,他们并不占用内存中的存储单元,只有发生调用时,才会分配内存。
(2) 实参可以是常量、变量或者表达式;有时传递的时地址;
(3) 在被定义中,形参必须指定类型;
(4) 实参与形参的类型应相同或赋值兼容;
(5) C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只有实参传递给形参,而不能由形参传递给实参。
函数的返回值:
希望通过函数调用使主调函数得到一个确定的值。
(1)函数的返回值是通过函数中的return语句获取的。
(2)函数值的类型;
(3)如果函数值的类型和return语句中表达式的值不一样,则以函数类型为准。
(4)如果调用函数中没有return语句,并不带回一个确定的用户需要的值,函数不是不带回值,而只是不带回有用的值,带回一个不确定的值。
(5)如不需要带回任何值,用void。
函数的调用:
调用方式1、函数语句;2、函数表达式;3、函数参数。
被调用的函数的声明:
一个函数调用另一个函数所具备的条件:
1、首先被调用的函数必须是已经存在的函数;
2、如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。
3、如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。
4、如果被调用的函数定义出现在主调函数之前可以不必声明。
5、如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明。
局部变量和全局变量:
(一)局部变量在一个函数内部定义的变量是内部变量,它只是在本函数范围内的有效,主函数也不能使用其它函数中定义的变量;不同函数中可以使用相同的名字的变量,他们代表不同的对象,互不干扰;形式参数也是局部变量;在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合句也可以称为“分程序”或“程序块”;
(二)全局变量,在函数之外定义的变量称为外部变量,全局变量可以增加函数间数据联系的渠道,一般不再必要时不要使用,他在程序的全部执行过程中占用存储单元,是函数的通用性,使用全局变量会使程序的清晰性降低。还要注意若果同一源文件中,外部变量和局部变量同名,则在局部变量作用范围内,外部变量被“屏蔽”,不起任何作用。
变量的存储类别:
(变量值存储时间)动态存储方式,在程序运行期间进行分动态的分配存储空间的方式,静态存储方式是指在程序运行期间分配固定的存储空间的方式;存储空间分为程序区、静态存储区和动态存储区;全局变量全部放在静态存储区中,程序开始时分配空间,完毕时释放;动态存储区中存放以下数据:
1、函数形式参数;
2、自动变量;
3、函数调用时的现场保护和返回地址;在C语言中每个变量和函数都有两个属性,是数据类型和数据存储类型,存储类别是数据在内存中存储的方式。
存储方式分为静态和动态存储类,具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,就自认为是auto型就会自动分配存储空间属于动态存储方式。
Static声明局部变量是在函数调用结束后不消失而保留原值,即占用存储单元不释放,在下一次调用该函数时,该变量已有值,就是上次函数调用结束时的值。其中需要说明的是在定义局部变量不赋初值的话,则静态局部变量编译时自动赋值为0或者空字符,虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能引用它的。静态局部变量主要用在当初始化后,变量只是被引用而不改变其值。
Register变量是C语言中允许将局部变量的值放在CPU中的寄存器中需要时直接从寄存器中取出来参加运算,不必再到内存中提取,但是计算机系统中寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量。
Extern声明外部变量,用以扩展外部变量的作用域。在一个文件中,如果定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做外部变量声明。在多文件中,也可以采用extern声明的办法进行外部变量声明。有时希望某些局部变量只限于被本文件引用,而不能被其他文件引用,这时就可以采用在定义外部变量时外加一个static,这在程序模块化设计中加强了通用性。
Static来声明一个变量的作用有二个,一个是在声明对局部变量时。则为该变量分配的空间在整个程序执行期间始终存在;一个是在对全局变量声明中,该变量的作用域仅限于本文件模块操作。
注意:这些方法同样适用于函数的声明
C语言程序设计 基础知识点
1、&是取地址符号,&x表示的是x在内存中的地址,表示把输入的数据放到x所在的内存单元中去。
2、C程序源程序扩展名为.c。目标程序扩展名为.obj。可执行程序的扩展名为.exe。
3、指针用来表示某个变量在内存储器中的地址。
4、十进制写法除非要写的整数本身就是0,否则开头第一个数字字符不能为0.
5、八进制整常数必须以0开头,数码取值为0-7。八进制数通常为无符号数。
6、十六进制数常数的前缀为0X或者0x。其数直码维阿0—9,A—F或者a—f。
二进制、八进制、十进制、十六进制之间的转换
7、字符串常量在内存中存储时有串尾标记 ‘ \0 ’,所以字符常量占一个字节的内存空间,而字符串常量占的内存字节数等于字符串中字符所占的字节数加1.
8、可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。C语言中没有专门的字符串变量。字符串如果需要存放在变量中,需要使用字符型数组来存放。
9、++i与i++的区别:
n = ++i;先加再赋值。n = i++;先赋值再加。eg:i = 1时,n = ++i,n = 2,i = 2;n = i++,n = 1,i = 2。
int i = 5,j;
j = ++i+i++;
printf(“%d,%d”,i,j); //7,12
j=(++i)+(++i);
printf(“%d,%d”,i,j); //9,17
10、数据类型转换;double类型最高。
11、
int m,n,k;
m = 15,n = 20;
k = (--m)+(--n);
printf(“k = %d,m = %d,n = %d”,k,m,n); //k = 33,m = 14,n = 19
m = 15,n = 20;
k = (m--)+(n--);
printf(“k = %d,m = %d,n = %d”,k,m,n); //k = 35,m = 14,n = 19
河南高考排名195560左右排位理科可以上哪些大学,具体能上什么大学
吉林外国语大学和湘潭大学兴湘学院哪个好 附对比和区别排名
江西工商职业技术学院在黑龙江高考历年录戎数线(2024届参考)
甘肃高考排名5480左右排位理科可以上哪些大学,具体能上什么大学
四川文化艺术学院和天津城建大学哪个好 附对比和区别排名
江西高考排名71510左右排位理科可以上哪些大学,具体能上什么大学
军训个人收获心得体会全新范文2024
父亲节主持词开场白和结束语五篇
二年级语文笋芽儿教案样本
初中生庆祝国庆节的作文五篇
咽喉疾病知识大全最新
狗狗养护知识有哪些
有关大熊猫科普知识有哪些
怎样养狗知识大全
中华鲟鱼知识最新大全
貂皮知识大全最新
齐齐哈尔工程学院在新疆高考招生计划人数专业代码(2024参考)
宁夏工商职业技术学院在河南高考招生计划人数专业代码(2024参考)
河北高考排名184970左右排位历史可以上哪些大学,具体能上什么大学
湖北高考排名174600左右排位物理可以上哪些大学,具体能上什么大学
考福州外语外贸学院要多少分宁夏考生 附2024录取名次和最低分
湖南师范大学在云南高考招生计划人数专业代码(2024参考)
广东高考排名247430左右排位物理可以上哪些大学,具体能上什么大学
陕西青年职业学院在宁夏高考历年录戎数线(2024届参考)
安徽文达信息工程学院的审计学专业排名怎么样 附历年录戎数线
安徽高考排名263910左右排位理科可以上哪些大学,具体能上什么大学
考安顺学院要多少分广东考生 附2024录取名次和最低分
广东高考排名94120左右排位物理可以上哪些大学,具体能上什么大学
四川高考排名6710左右排位理科可以上哪些大学,具体能上什么大学
考洛阳科技职业学院要多少分甘肃考生 附2024录取名次和最低分
福建高考排名46830左右排位物理可以上哪些大学,具体能上什么大学
重庆机电职业技术大学的数控技术专业排名怎么样 附历年录戎数线
郑州升达经贸管理学院和辽宁工业大学哪个好 附对比和区别排名
赣州职业技术学院和扬州工业职业技术学院哪个好 附对比和区别排名
江西外语外贸职业学院在内蒙古高考历年录戎数线(2024届参考)
四川高考排名14260左右排位理科可以上哪些大学,具体能上什么大学
中华鲟鱼知识大全最新
狗场养狗知识最新大全
养狗知识大全最新
鹦鹉知识的资料大全最新
貂皮基本知识大全最新
关于仓鼠的基本知识有哪些
关于蝴蝶的基础知识有哪些
居家宠物要注意哪些事情
咽喉疾病知识最新大全
关于肾病的知识最新大全
肾财普知识大全
心肺复苏中常见的问题有哪些
心血管疾病最新知识大全
心血管怖治最新知识杂志
食醋知识普及最新