按说学习MCS51(以下简称51),就要先学习它的构架和系统,这也教材的安排,反正开篇的那些图我在学习完整本书前基本没有看懂。估计我也不是什么例外,还是直接来形象的吧,而51的系统,构架在学习过程中也会慢慢的理解的。

我在Proteus中找到的比较顺眼的51就是AT89C51,是atmel的产品,虽然很早出道,现在还很流行。

AT89C51(DIP封装)一共有有40个管脚。                                                

       

单片机有没有bios 单片机有没有io设备_上拉电阻

 

 

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为三态输入输出口,每个口的硬件都不一样。(如下图)

 

单片机有没有bios 单片机有没有io设备_寄存器_02

 

 

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;
  }
}

单片机有没有bios 单片机有没有io设备_上拉电阻_03

 

 

P2,P3口做输入输出口时和P1一样,而P0 口则需要加个一个上拉电阻,这个在P0口的结构图中可以找到答案。