从业十年,教你单片机入门 第11讲:
写程序到底是写什么?我用七个字归纳是:目标之间的行为。假定以下a,b,c,d,e.这些都是目标,那么程序往往是目标之间的以下这些行为:
(1)把某个数值赋值给目标a。
(2)把目标b赋值给目标a。
(3)把目标b与目标c运算的成果赋值给目标a。
(4)假如目标d等于某个数值,则把某个数值赋值给目标a。
(5)假如目标d等于某个数值,则把目标b赋值给目标a。
(6)假如目标d等于某个数值,则把目标b与目标c运算的成果赋值给目标a。
(7)假如目标d等于目标e,则把某个数值赋值给目标a。
(8)假如目标d等于目标e,则把目标b赋值给目标a。
(9)假如目标d等于目标e,则把目标b与目标c运算的成果赋值给目标a。
(10)…等等,不一一列举。
从上述能够看出,程序的两个要素是:目标和行为。假如把目标看作是单片机的RAM数据存储器,那么行为便是单片机的ROM程序存储器。假如把目标看作是变量,那么行为便是指令句子。本节标题“变量的界说与赋值句子”,其间“变量的界说”便是目标,“赋值句子”便是行为。
变量的界说。一个程序最大答应有多少个目标,是由数据存储器RAM的字节数决议的(字节是一种单位,后边章节会讲到)。stc89c52rc这个单片机有几百个字节的RAM,可是并不意味着程序就一定要悉数占用这些RAM。程序需求占用多少RAM,完全是依据程序的实际情况来决议,需求多少就请求多少。这儿的“目标”便是变量。这儿的“请求”便是变量的界说。
界说变量的关键字。常用有3种容量的变量,每种变量的取值规模不相同。榜首种是”unsigned char”变量,取值规模从0到255,占用RAM一个字节,比方成一房一厅。第二种是”unsigned int”变量,取值规模从0到65535,占用RAM两个字节,比方成两房一厅。第三种是“unsigned long”变量,取值规模从0到4294967295,占用RAM三个字节,比方成三房一厅。unsigned char,unsigned int和unsigned long都是界说变量的关键字。
界说变量的语法格局。界说变量的语法格局由3部分组成:关键字,变量名,分号。比方:
unsigned char a;
其间unsigned char便是关键字,a便是变量名,分号”;”便是一条句子的完毕符号。
变量名的命名规矩。变量名的榜首个字符不能是数字,有必要是字母或许下划线,字母或许下划线后边能够带数字,一个变量名之间的字符不能带空格。变量名不能跟编译器的关键字重名,不能跟函数名重名。比方:
unsigned char 3a; //不合法,榜首个字符不能是数字。
unsigned char char; //不合法,char是编译器的关键字。
unsigned char a b; //不合法,ab是一个变量名,a与b的中心不能有空格。
unsigned char a; //合法。
unsigned char abc; //合法。
unsigned char _ab; //合法。
unsigned char _3ab; //合法。
unsigned char a123; //合法。
unsigned char a12ced; //合法。
界说变量与RAM的内涵联系。当咱们界说一个变量时,相当于向单片机请求了一个RAM空间。C编译器会主动为这个变量名分配一个RAM空间,每个字节的RAM空间都有一个固定的地址。把每个字节的RAM空间比方成 房间,这个地址便是房号。地址是纯数字编号,不利于咱们回忆,C言语编译器为了下降咱们的工作难度,不必咱们记每个变量的地址,只需求记住这个变量的称号就能够了。操作某个变量名,就相当于操作到对应地址的RAM空间。变量名与对应地址RAM空间的映射联系是C编译器私自帮咱们做好了。比方:
unsigned char a; //a占用一个字节的RAM空间,这个空间的地址由C编译主动分配。
unsigned char b; //b占用一个字节的RAM空间,这个空间的地址由C编译主动分配。
unsigned char c; //c占用一个字节的RAM空间,这个空间的地址由C编译主动分配。
上述a,b,c三个变量名占用一个字节的RAM空间,一起被C编译器分配了3个不同的RAM空间地址。
赋值句子的意义。赋值句子是行为。把右边目标的内容仿制一份给左面目标。 赋值句子有一个很重要的特性,便是掩盖性,左面目标本来的内容会被右边目标仿制过来的新内容所掩盖。比方,左面目标是变量a,本来a里边存的数据是3,右边目标是当即数6,履行赋值句子后,把6赋值给了目标a,那么a本来的数据3就被掩盖丢掉了,变成了6.。
赋值句子的格局。赋值句子的语法格局由4部分组成:左面目标,关键字,右边目标,分号。比方:
a=b;
其间a便是左面目标。
其间“=”便是关键字。写法跟咱们平常用的等于号是相同,可是在C言语里不是等于的意思,而是代表赋值的意思。跟等于号是两码事。
其间b便是右边目标。
其间分号“;”代表一条句子的完毕符。
赋值句子与ROM的内涵联系。赋值句子是行为,但凡程序的行为指令都存储在单片机的ROM区。C编译器会把一条赋值句子翻译成对应的一条或许几条机器码,机器码指令也是以字节为单位的。下载程序的时分,这些机器码就会被下载进单片机的ROM区。比方以下这行赋值句子:
a=b;
经过C编译器编译后会生成以字节为单位的机器码。这些机器码记录着这些信息:变量a的RAM地址,变量b的RAM地址,以及把b变量RAM地址里边的内容赋值到a变量地址里边的RAM空间。
变量界说的初始化。讲了赋值句子之后,再回过头来讲变量界说的初始化。变量界说之后,等于被C编译器分配了一个RAM空间,那么这个空间里边存储的数据是什么?假如没有故意给它初始化,那么RAM空间里边存储的数据是不太确认的,是默许的。有些场合,需求在给变量分配RAM空间时就给它一个固定的初始值,这便是变量界说的初始化。变量初始化的语法格局由3部分组成:关键字,变量名赋值,分号。比方:
unsigned char a=9;
其间unsigned char便是关键字。
其间a=9便是变量名赋值。a从被C编译器分配RAM空间那一刻起,就默许是存了9这个数据。
分号”;”便是一条句子的完毕符号。
接下来操练一个程序实例。直接仿制前面章节中第十节的模板程序,只需求在main函数里编写操练代码,编译后,把程序下载进坚鸿51学习板,经过按S1或许S5按键即可在数码管上调查不同的变量数值。其它部分的模板程序代码就不贴出来了,具体的main函数源代码解说如下:
void main() //主程序
{
/*—C言语学习区域的开端—————————————————————————*/
unsigned char a; //界说一个变量a,而且分配了一个字节的RAM空间,里边保存的数据是默许值0.
unsigned char b; //界说一个变量b,而且分配了一个字节的RAM空间,里边保存的数据是默许值0.
unsigned char c; //界说一个变量c,而且分配了一个字节的RAM空间,里边保存的数据是默许值0.
unsigned char d=9; //界说一个变量d,而且分配了一个字节的RAM空间,里边保存的数据被初始化成9.
b=3; //把3赋值给变量b,b本来的默许数据是0被掩盖了,此刻变量b保存的数值是3
c=b; //把右边变量b的内容仿制一份赋值给左面的变量c,c本来的默许数据0被掩盖了,此刻,c保存的数值跟b的数值相同,都是3.
GuiWdData0=a; //把变量a这个数值放到窗口变量0里边显现
GuiWdData1=b; //把变量b这个数值放到窗口变量1里边显现
GuiWdData2=c; //把变量c这个数值放到窗口变量2里边显现
GuiWdData3=d; //把变量d这个数值放到窗口变量3里边显现
/*—C言语学习区域的完毕—————————————————————————*/
while(1)
{
initial();
key_service();
display_service();
}
}
上坚鸿51学习板调查程序履行的成果:
变量a的数值是0,
变量b的数值是3,
变量c的数值是3,
变量d的数值是9,
下节预告:两个变量的数据交换。