按说学习MCS51(以下简称51),就要先学习它的构架和系统,这也教材的安排,反正开篇的那些图我在学习完整本书前基本没有看懂。估计我也不是什么例外,还是直接来形象的吧,而51的系统,构架在学习过程中也会慢慢的理解的。
我在Proteus中找到的比较顺眼的51就是AT89C51,是atmel的产品,虽然很早出道,现在还很流行。
AT89C51(DIP封装)一共有有40个管脚。
40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
特别说下9脚---复位引脚:
RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态。
51的4组8位的IO口中,P1,P2,P3为准双向口,P0为三态输入输出口,每个口的硬件都不一样。(如下图)
P0口是数据总线和地址线的低8位,P2口是地址线的高8位,故这两个口都由一个控制开关,P3口与控制总线复用,故有第二输出功能,关于3总线,以后慢慢说。
先看P1口,作为输出口时,向锁存器写1,/Q端为0,T2截止,内部上拉电阻将P1.X拉为1,输出1;
向锁存器写0,/Q端为1,T2导通,P1.X输出0。
51的IO口输出可以作为整体的寄存器使用,如:P1=0x55;
也可以按某一位单独使用,如果 sbit P10=P1^0; P10=1;这里的sbit的意思是声明一个变量P10作为P1的第一个口。
作为输入口时,需要先把口置为1,如果这里写0,T2截止,如果外部引脚对地有一个电阻,则由于内部上拉电阻,这个引脚实际不是低电平。而置1则不会。
下面是一个简单的例子
1.点亮闪烁灯
#include "reg51.h" //包含关于51单片机寄存器定义的头文件
sbit led=P1^0; //声明LED灯所在的管脚
void main()
{
int i;
while(1) //单片机系统一定要有一个死循环,否则不会一直执行
{
led=!led; //翻转管脚
for(i=0;i<0xffff;i++) // 软件延时,试验用,实际最好不这么用
;
}
}
2.读一个按键
#include "reg51.h"
sbit led=P1^0;
sbit key=P1^1;
void main()
{
while(1)
{
key=1;
if(key==1)
led=1;
else
led=0;
}
}
P2,P3口做输入输出口时和P1一样,而P0 口则需要加个一个上拉电阻,这个在P0口的结构图中可以找到答案。