接下来该详细地讲讲特殊功能寄存器了。
前面已经说过,特殊功能寄存器是单片机的管理部门,不管什么单片机,学会了操控它的的特殊功能寄存器,你就完全掌握了单片机。
要实现单片机某一功能,首先要知道需要设置哪些特殊功能寄存器。这就好比你在工厂里遇到什么问题,你找什么领导。例如:电动机不转了你找电工或工程部门;机械坏了你找机修工或工程部门;你想调动工作找你的班组长或人事部门。总之,要完成一项任务你可能要找的不一定是一个人或者一个部门。即单片机特殊功能寄存器设置也不是设置一个。
中断分外部中断和内部中断。由外部信号引起的中断即外部中断,就是由外部信号(如按键或其它电路产生的脉冲)去控制单片机有关的引脚引发的中断。内部中断即由但单片机内部信号产生的中断。
比如:
[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软件的使用以及编程的进一步深入,网友可以参考一些专业的书籍,这里就不一一道来了。全文完.....