跟家电维修工深入浅出学单片机编程入门《二》
编辑时间:2018-06-30 作者:LCDHOME论坛 浏览量:1809 来源:LCDHOME论坛

关于常量与变量:

    “量”即数的大小或者数的多少。“常量”即就是“平常的量”,实际就是一个固定的数,它从程序开始到结束一直不变;变量”即“会变化的量”,它从程序开始到结束数的大小一直在变化。

  比如,我们经常吃的大米标准是25千克(当然也有24千克的或者是10千克的,但同一批总是相同的),这一袋(25千克)大米就是一个常量。单片机中,常量经常用十六进制或者十进制来表示。

  当大米吃到我们的肚里以后,从入口到出口也就是我们肚里的东西到底是多少(是大米还是大粪)?这是不定的。因为有时吃得多,有时吃得少,有时拉的多,有时拉的少,这就是变量。变量是随着程序运行的时间变化,它不是固定的数,用什么来表示它呢?只能用一个代号了!我们一般用英语字母或者一个英语单词来表示,有时先给它一个固定的数,也就是所谓的“赋值”。

  总之:常量是固定不变的数;变量是经常变化的数,它只有在某一时刻才是一个固定的数。

单片机的只读存储器ROM相当于电脑的硬盘,可以存放永久的程序,也就是你想要让它所做的工作。你编写的程序经过编译软件“编译”下到单片机后就保存到这里。这就相当于你教会它的技术,他记到脑子里了,以后就按里面的程序(即过程顺序)执行。

  单片机的随机读写存储器RAM相当于电脑的内存,是临时存放运行中的数据的地方。

  如果把整个单片机比作一个工厂,程序存储器ROM就是原料仓库和成品仓库;用户工作存储器RAM就相当于有一定面积的工作车间,可以临时存放原料和成品。当节假日放假时,车间里就无原料和成品了(这相当于单片机断电)。


下雨天天借工头的电脑再讲几句。说说C语言的运算符。运算符即数学运算符号,很好理解,不同的是“=”与“==”、“&”与"&&"、“|”与“||”的区别。

一个等号是赋值或者是传递数值,这与我们在小学数学的一个等号不相同。

如:i=50即是赋值(这是有文化的人故意忽悠咱这无文化的人的),就是给i一个数是50,以后凡是用到i的地方就用50代替。以人拿钱(元)用文字来说如:“张三=50”,就是给张三50元,以后用到张三的地方就是让张三拿出50元。

 如:i=j就是传递数,就是把j代表的数值传送给i,以后凡是用到i的地方就用j代替,究竟j是多少那要看j当时的数值了。以人拿钱(元)用文字来说如:“张三=李四”,就是李四拿的钱给张三,以后凡是用到张三的地方就用李四的钱代替,究竟李四是多少那要看李四给张三多少钱了。

两个等号表示两个量完全相等,这与我们在小学数学的一个等号相同。

比如i==50,i==j,。以人拿钱(元)用文字来说如:“张三==李四”,说明张三与李四拿的钱一样多。

  一般的:一个等号常用在大括号内的语句中做赋值或者传递数值,,两个等号常用在小括号内做条件判断(一般在while或者if后面的小括号里)。

 今天接着讲“&”和“&&”。

  一个“&”是表示两个数按位进行逻辑与运算,在&的前面和后面分别是两个数(常量或者变量)。按位与的运算方法是把要运算的两个数转换成二进制后,对应的位分别相乘,从而生成对应的一个二进制数。例如:第一个数为十进制是125(转换成二进制是01111101);第二个数为十六进制是0xa2(转换成二进制是10100010);那么运算的结果是:

      01111101

  &   10100010 

  --------------------

        00100000

即十进制32(十六进制0x20).


按位与“&”一般用在如下的场所:

  1、使变量的某一位清零;或者使某一个寄存器的某一位清零,从而关闭寄存器相应的功能(寄存器是单片机的管理部门)。

  例如:假设一个变量(或者寄存器)的代码是abc,我们需要把它的最高位置0,那么就与01111111(十六近制为0x7f)作与运算就可以了,即abc&0x7f.


  2、检测变量(或寄存器)中某一位是0或者是1.

  例如:假设一个变量(或者寄存器)的代码是abc,我们需要判断它的最高位是不是0,那么就与10000000(十六近制为0x80)作与运算后,再判断运算结果是否为0x80.

  同样,假设一个变量(或者寄存器)的代码是abc,我们需要判断它的最高位是不是1,那么就与01111111(十六近制为0xef)作与运算后,再判断运算结果是否为0xef.

  以上两种方法也可反着用,只是最后决定符合条件做什么,不符合条件做什么。


  3、屏蔽变量(或寄存器)的某些位而保留其它位。

  例如:假设一个变量(或者寄存器)的代码是abc,我们需要它的高四位,低四位不需要,那么就与11110000(十六近制为0xf0)作与运算.

  一般的,我们要保留某一位,对应位就设为1,不需要的位设为0.

两个“&&”表示两个条件参与判断,两个条件全满足时为真,为真时执行对应的程序;两个条件有一个或者两个均不满足,都为假,为假时不执行对应的程序,即跳出或者跳过对应的程序。 两个“&&”一般与if或while(在if或while后面的小括号里)配合使用作条件判断,满足条件执行什么,不满足条件执行什么。


例如:

  如果(张三拿的钱>90&&李四拿的钱==100)

  两个人一起喝酒去!

上面如果张三拿的钱要是不大于90,即使李四拿的钱为2000,两个人也不去喝酒了(可能李四是个小气鬼,他想他把喝酒的钱全拿出来肯定觉得吃亏了!),更不用说两个人拿的钱都不符合条件了。

  以上的文字如果用8051C语言来写的话是下面得语句:

  If(zhangsan>90&&lisi==100)

  P1=0xff;                       (因为8051C语言没有喝酒一说,所以我把它改成了P1口全部输出高电平了)

    大家这样记忆,因为&&是两个,所以你记住是两个条件。


该讲“|”与“||”的区别了。


一个“|”是表示两个数按位进行逻辑或运算,在|的前面和后面分别是两个数(常量或者变量)。按位或的运算方法是把要运算的两个数转换成二进制后,对应的位分别相加,从而生成对应的一个二进制数。例如:第一个数为十进制是125(转换成二进制是01111101);第二个数为十六进制是0xa2(转换成二进制是10100010);那么运算的结果是:

      01111101

      10100010 

--------------------

      11111111

即十进制255(十六进制0xff).

  按位或“|”一般用在对变量(或寄存器)某些位置1的场合(寄存器置1时可打开其对应的功能)。

  按位或常用在数值运算或者条件判断的场合,在用在条件判断时常和if与while配合使用(一般在if或while后面的小括号里),符合条件做什么,不符合条件做什么。

现在接着说“^”这玩艺。“^”用在不同的地方,作用截然不同。

  主要有两个功能:

  1、表示某个端口的某个引脚。

  例如:LED=P0^0,它表示一个LED接到了标准8051/8052的39脚上,即表示8051/8052的39脚控制的是LED。在8051的C语言中不是用P0.0表示39脚的。同样,P1^2表示8051的第3脚;P2^7表示8051的第28脚...

  2、表示两个常量或者变量进行按位作逻辑异或运算(即不相同时作或运算:不相同时为1,相同时为0)。

  假设一个长长的会议桌两边分别坐着两排人(8位)面对面谈对象:男人用1代表,女人用0代表,当面对面性别不同时即可组成1对(结果为1),面对面性别相同时就不能组成1对(结果为0,除非搞同性恋)。

  例如:

        10110001

    ^   01100010

    ----------------------

        11010000



“<”与“<<”的区别:

  “<”即我们小学时就学到的小于符号,它一般用在条件判断场合:当符合条件时执行什么或不执行什么,常与if或while配合使用(一般用在二者后面的小括号里)。

  “<<”在数学里表示“远小于”,在8051C语言里却表示按位向左移动。即把一个数转换成二进制后按照指定的位数向左移动。

  假设对面一排座有8位,上面有的座有人,有的为空位,有人为1,无人为0。 那么左移就是向左移动。左边(相当于二进制的最高位)即使有人(相当于1)移动后也不能在座到这一排座位上了(相当于1舍去),最右边成空位了(相当于补0)

通俗易懂的讲就是有个恶霸,拿着0,拿着鸡毛当令箭,获得了左移命名的时候就从右边往左边挤,左移几位就是叫以前的二进制数据往左边移几位,右边的空位他直接用0填充。因为一般51单片机只有8个位置,前面的就被它挤掉下去了。

右移同理,恶霸拿着0往左边塞,把数据全部往右边赶,右边的良民全部被赶下去了,完蛋了。如果是左移因为机器位数的不同左移数据还有救的话,如16为机器和8为机器同样左移算出来结果是不同的,右移则是数据都是标准的,右移被赶下去的数据统统死啦死啦的。

  例如:133转换成二进制后是10000101,左移一位后是00001010(十进制10);左移4位后是01010000(十进制160)


“>”与“>>”的区别:

“>”即我们小学时就学到的大于符号,它一般用在条件判断场合:当符合条件时执行什么或不执行什么,常与if或while配合使用(一般用在二者后面的小括号里)。

  “>>”在数学里表示“远大于”,在8051C语言里却表示按位向右移动。即把一个数转换成二进制后按照指定的位数向左移动。

  假设对面一排座有8位,上面有的座有人,有的为空位,有人为1,无人为0。 那么左移就是向右移动。右边(相当于二进制的最低位)即使有人(相当于1)移动后也不能在座到这一排座位上了(相当于1舍去),最左边成空位了(相当于补0)

  例如:133转换成二进制后是10000101,右移一位后是01000010(十进制66)右移4位后是00001000(十进制8).

  左移“<<”或者右移“>>”一般用在流水灯(跑马灯)控制、或者数据处理的地方。比如:有的器件在读取数据时是两字节,高字节和低字节分别保存到两个数据存储器里的高4位(或低4位),这时候我们就可以用左移或者右移的方法把一个移动相应的位数后(此例为4位)将其合并成一个字节再作处理

 


“+”与“++”,“-”与“--”的区别:

    

“+”与“-”在小学一年级我们就认识了。“++”表示一个变量自身加1;“--”表示一个变量自身减1。

  比如:我们定义一个变量i,i++其实就等于i=i+1,i--就等于i=i-1。

  “++”与“--”一般以下场合:

    1、用作延时。   

    2、用来计数。   

    定义一个变量后,让它自身加1或者自身减1,当满足条件后即退出。这就好像让一个人正着或反着数一批货物,当数完后就起身干别的事了。


定义变量,就好像我们在车间里划出一块区域来存放工件。这个区域有大有小,数据类型(char,int..)就好像它的大小。其实就是在内存区域中我们申请了一块地方来存放这些数据,为了方便我们使用,我们就给它起了个名字,比如,我们定义的变量为i,实际就是給它起了一个名字叫“i”,这个字母或单词(几个字母)随便起,用拼音代替也行,就是别与C语言的关键字相同即可。

  C语言的“关键字”就是C语言中规定用的单词,比如“char”、“main”、“auto”.

这些可以从书中查到。不但定义变量不能用C语言的关键字,连以后我们起函数名也不能用C语言的关键字。


在单片机中我对“定义”二字的解释:

  1、指定有关寄存器的地址。这相当于指定有关单位领导、管理人员的办公室门牌号码,办什么事情找什么领导或管理人员。

  2、为某些端口(数据输入输出引脚)从新起别名或代码。相当于把一些房间标上做什么工作的牌子,如“会议室”、“生产车间”..

  3、划分变量的范围。相当于你需要装什么物品选多大的容器。



来说两句吧