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

接下来该详细地讲讲特殊功能寄存器了。

  前面已经说过,特殊功能寄存器是单片机的管理部门,不管什么单片机,学会了操控它的的特殊功能寄存器,你就完全掌握了单片机。

  要实现单片机某一功能,首先要知道需要设置哪些特殊功能寄存器。这就好比你在工厂里遇到什么问题,你找什么领导。例如:电动机不转了你找电工或工程部门;机械坏了你找机修工或工程部门;你想调动工作找你的班组长或人事部门。总之,要完成一项任务你可能要找的不一定是一个人或者一个部门。即单片机特殊功能寄存器设置也不是设置一个。

  中断分外部中断和内部中断。由外部信号引起的中断即外部中断,就是由外部信号(如按键或其它电路产生的脉冲)去控制单片机有关的引脚引发的中断。内部中断即由但单片机内部信号产生的中断。

  比如:

  [color=blue]要实现外部中断,就要设置中断使能寄存器IE、中断优先级寄存器IP和定时器/计数器控制寄存器TCOM;

    要实现定时与计数功能,就要设置中断使能寄存器IE、定时器/计数器模式控制寄存器TMOD、中断优先级寄存器IP和定时器/计数器控制寄存器TCON;

  要实现串口通信,就要设置中断使能寄存器IE、中断优先级寄存器IP、串行端口控制寄存器SCON和电源控制寄存器PCON.   [/color] 

  以上所述特殊功能寄存器的设置有的是必设,有的是根据实际情况而定。象中断优先级控制寄存器IP在只开启一个中断时可不设置,串口中断时电源控制寄存器PCON可不设置。


C语言在单片机是通用的,只是单片机不同,操控的特殊功能寄存器不同。比如你学会了用C语言来对8051单片机编程,只要你熟悉一下AVR单片机的特殊功能寄存器,那就很快就能对AVR单片机编程了。

  以上我讲的特殊功能寄存器你没必要把它的所有都记住,那样太伤脑筋。你可以在需要时去翻翻书,死记硬背还不如陪老婆多聊一会儿,以免你对单片机太痴迷使老婆反感反对,象红太狼那样用平底锅砸你的头。

 


一、端口寄存器

  标准的8051单片机端口一共有四个端口,分别是P0口、P1口、P2口和P3口。每个端口都是8位,有高位向低位分别是Px.7、Px.6、Px.5、Px.4、Px.3、Px.2、Px.1、Px.0(x即代表0---3)。它们的端口都是场效应管的漏极,除P0口是漏极开路外,其它的端口的每一位对电源端均接有一个20----30k的电阻,即所谓的“上拉电阻”。

  8051单片机每个端口既可做输入端,也可做输出端。

  因为普通的8051单片机全是数字输入、输出,即只能输入、输出0或1,单片机在刚加电或者复位时每个端口均是高电平1,所以我们常把端口对地短路做有信号输入。做输入端时,P0口必须接一个上拉电阻,有时为了增加可靠性,其它的三个端口一般也接上5--10K左右的电阻。

  8051单片机做输出端时,把负载接到电源与每个端口之间输出的电流比较大,一般在10---20mA,完全可以驱动一个发光管(LED),这是经常采用的。把负载接到地与每个端口之间输出的电流比较小,不足10mA,这是不提倡的接法。

 


如果把8051单片机比作一个大型工厂或公司,那么P0----P3这四个端口分别就是四个独立的采购/销售部门,作采购时相当于单片机的输入,作销售时相当于单片机的输出。即单片机输入时相当于工厂购进原材料,单片机输出时相当于销售出的产品。

 


8051单片机的端口寄存器P0---P3是可按位寻址的。凡是能按位寻址的寄存器,一般都可以按字节寻址,相反则不一定。

  8051单片机是8位的,它的特殊功能寄存器有8位的,也有16位的,16位的是用两个8位的寄存器来承担,一个存储数据的高8位,一个存储数据的低8位。这就好比是工厂里干活,每班是8个人,有的一班人不够用,就用两班人马,一班干这里,一班干那里。

  按位寻址与按字节寻址的区别前面已讲过,这里再重复一下:

  1、不管特殊功能寄存器是8位的还是16位的,每8位算是工厂里的一个管理部门的8个人。

  2、按位寻址好比是你要开后门办一件事,只要找到这个管理部门主要负责人,给他一个人送礼(相当于设置这个寄存器的这一位),一切都OK了。

  3、按字节寻址好比你要开后门办一件事,这个管理部门所有负责人你都要意思意思(相当于这个寄存器的每一位你都得设置),这样才行。

 


对于P0-----P3口,我们不管是按位寻址还是按字节寻址都可以,要根据实际情况灵活选用,区别是语句的多少。都是给它的对应的位赋值,实际就是把它对应的某一位置1或清0.

  按位寻址就是直接把它对应的某一位写上0或者1;按字节寻址(又称总线操作法)是把所有的8位的每一位分别写上0或者1.

  在我们操作这四个端口的方法完全一样,会一个所有的就都会了。只不过是P0口在做输入口用时要接一个上拉电阻,它的输出电流较其它三个略大。

  作输入端时把对应的端口时你要把它设置(写上)1,0当然也可以,这种方法采用的不多。

  作输出时根据情况把对应的端口设置为(写上)1时为输出高电平,设置为(写上)0时为输出低电平。

 


操作端口时,有两种方法:即位操作法和总线操作法。

1、位操作法:

  位操作法就是一个位一个位的确定。

  用作输入时一般把对应的位置1,当信号为低电平输入时有效。所以应把P1.0赋值为1,即:

  P1^0=1;

    注意:在操作任何端口的某一位时,C语言用的是“^”,而不是“.”,这点与汇编语言不同。上面的“P1^0=1;”,就不能写成“P1.1=0” 

  特殊情况下作输入时也可以把它的位设置成低电平,只是当信号为高电平输入时才有效,此时应写成:

  P1^0=0;

  在作输出端时方法与上面相同,当用P1^0=1时单片机1脚输出的是高电平;当用P1^0=0时单片机1脚输出的是低电平电平 

.例如:我们要把P1口的P1.0(也就是40脚标准8051单片机的第1脚)用作输入端,把P1口的P1.1(第2脚)用作输出端,用位操作法完整的写法是:

  P1^0=1;

  P1^1=0;(输出低电平)或 P1^1=0;(输出低电平)

  其它的位也就是P1^2------P^7(3----8脚)一般情况下就不管了。

2、字节操作法:

  就是把所有的为填上0或者1.还是以上例P1口为例:

  P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

    ?   ?   ?   ?   ?   ?   0     1

  前面的“?”表示你这些位无用时可以是1或者是0的任意一个数,这里我们都填上1,结果是11111101,化成十六进制是0xfd,0x在这里表示是十六进制数。如果都填上0,结果是00000001;化成十六进制是0x01。分别写成程序语句是

  P1=0xfd;   //

这个例子表示单片机除第2脚为低电平0外,其它全是高电平1.

或   P1=0x01;

这个例子表示单片机除第1脚为高电平1外,其它全是低电平0。

如果P1.2------------P1.7还有别的作用,我们操作P1.0和P1.1口时有不想影响它的状态,就采用相与运算来操作,不想改变的脚位全部设为1,再与原值相与.即:

  P1=P1&0xfd;

  或P1=P1&0x01;

 


接着我们讲怎样进行单片机的编程。

  要对8051单片机编程,首先要安装编译软件“Keil“,这个软件网上一搜大把的,有2K限制版(2k对我们初学者已足够了),也有破解的。版本有好几个了,对于我们初学者哪个就行。关于它的安装一般人都回,我就不说了。


至于keil软件的使用以及编程的进一步深入,网友可以参考一些专业的书籍,这里就不一一道来了。全文完.....

来说两句吧