锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51初期简单知识整理及简单程序编写实践

时间:2023-01-06 16:30:00 电容tp结构整理

对单片机的初步理解

51单片的控制是基于对底层寄存器的控制;

一、基本构成

包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统,以及数据总线、地址总线和控制总线。

中央处理器(CPU)是整个单片机的核心部件,是8可以处理位数据宽度的处理器8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统的协调,完成输入输出功能的操作。

51内部有1288用户数据存储单元和128专用寄存器单元统一编制地址。专用寄存器只能用于存储控制指令数据,用户只能访问,不能存储用户数据。因此,用户可以使用它RAM只有128可存储读写数据、中间结果或用户定义的字型表。

程序存储器(ROM)

51共有40968位掩膜ROM,存储用户程序、原始数据或表格。

定时/计数器(ROM)

51有两个16位的可编程定时/用于控制程序转向的计数器实现定时或计数生成中断。

并行输入输出(I/O)

51共有48I/O(P0P1P2P3),用于传输外部数据。

全双工串行口

51内置全双工串行通信口,用于与其他设备之间的串行数据传输,可用作异步通信收发器或同步移位器。

51中断功能完善,有两个外部中断和两个定时/具有不同控制要求的计数器中断和串行中断2优先级选择。

51达到内置最高频率12MHz时钟电路,于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。

8051引脚图

40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,48位共32I/O口,中断口线与P3口线复用。其中

·Pin20:接地脚。

·Pin40:正电源脚,正常工作或对片内EPROM烧写程序时,接 5V电源。

·Pin19:时钟XTAL1脚,片内振荡电路的输入端。

·Pin18:时钟XTAL2脚,片内振荡电路的输出端。

51的时钟有两种方式,一种是片内时钟振荡方式,但需在1819脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另

输入输出(I/O)引脚

Pin39-Pin32P0.0-P0.7输入输出脚,Pin1-Pin1P1.0-P1.7输入输出脚,Pin21-Pin28P2.0-P2.7输入输出脚,Pin10-Pin17P3.0-P3.7输入输出脚,这些输入输出脚的功能说明将在以下内容阐述。8051时钟电路

Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000HP0-P3输出口全部为高电平,堆栈指钟写入07H

RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。

5081时钟电路

Pin30:ALE/PROG当访问外部程序器时,ALE(地址)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。

如果单片机是EPROM,在编程其间,将用于输入编程脉冲。

Pin29:PESN当访问外部程序存储器时,此脚输出负脉冲选通信号,PC16位地址数据将出现在P0P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。

Pin31:EA/Vpp程序存储器的内外部选通线,80518751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。

在编程时,EA/Vpp脚还需加上21V的编程电压。

指令时序:

时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期

我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。

MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1S1P2……S6P1S6P2(定时器那一部分中经常提到片机工作到某个状态),一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us

8051外部程序存储器读时序

8051外部程序存储器读时序图,从图中可看出,P0口提供低8位地址,P2口提供

 

指令周期

执行一条指令所需要的时间称为指令周期,MCS-51的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。

P0口和P2

图为P0口和P2口其中一位的电路图,由图可见,电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口,而不能象P1P3直接用作输出口。它们一起可以作为外部地址总线,P0口身兼两职,既可作为地址总线,也可作为数据总线。

P2口锁存器和缓存器结构

P2口作为外部数据存储器或

 

右图为P1口其中一位的电路图,P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q()=0T2截止,内上拉电阻将电位拉至"1",此时该口输出为1,当0写入锁存器,Q()=1,T2导通,输出则为0

P1口锁存器和缓存器结构

P3

P3口的电路如上图所示,P3口为准双向口,为适应引脚的第二功能的需要,增加了第二功能控制逻辑,在真正的应用电路中,第二功能显得更为重要。由于第二功能信号有输入输出两种情况。

P3口锁存器结构

P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能,P3口的第二作用

P3.0串行输入口(RXD)

P3.1串行输出口(TXD)

P3.2外中断0(INT0)

P3.3外中断1(INT1)

P3.4定时/计数器0的外部输入口(T0)

P3.5定时/计数器1的外部输入口(T1

P3.6外部数据存储器写选通(WR)

P3.7外部数据存储器读选通(RD)

程序存储器()

数据存储器()

内部数据存储器的配置

 

数据存储器也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个是内部数据存储区和一个外部数据存储区。MCS-51内部RAM128256个字节的用户数据存储,它们是用于存放执行的中间结果和过程数据的。51的数据存储器均可读写,部分单元还可以位寻址。

特殊功能寄存器(SFR)也称为专用寄存器,特殊功能寄存器反映了MCS-51单片机的运行状态。很多功能也通过特殊功能寄存器来定义和控制程序执行

 

 

二.个人实验部分

1.流水灯

2.蜂鸣器

3.继电器

4.静态数码管

5.独立按键

6.ds18b20(可独立编程)

 

编程:

1#include

#include

typedef unsigned char u8;

typedef unsigned int u16;

#define led P1

void delay(u16 i)

{while(i--);}

void main()

{ while(1){u8 i;

led=0x01;

 delay(50000);        

 while(1)

{  for(i=0;i<8;i++)

                 { led=(0x01<

 delay(50000)}}

2#include

#include

 

typedef unsigned char u8;

typedef unsigned int u16;

 

sbit beep=p1^5;

 

void delay(u16 i)

{

    while(i--);

}   

 

void main()

{

   while(1)

      {

        beep=~beep;

          delay(10);

      }

}

3#include

#include

 

typedef unsigned char u8;

typedef unsigned int u16;

 

u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

 

void main()

{

   P0=~smgduan[0];

   while(1)

      {

    

      }

}

4#include

 

sbit led=P0^0;

sbit k1=P1^0;

 

typedef unsigned char u8;

typedef unsigned int u16;

 

void delay(u16 i)

{

    while(i--);

}   

 

void keypros()

{

    if(k1==0)

     {

          delay(1000);

          if(k1==0)

         {

               led=~led;

          }

     }   

}

 

void main()

{

     led=0;

    while(1)

    {

         keypros();

     }

}

6.DS18520

定义头文件 

#ifndef_temp_H

#define_temp_h

 

#include

 

#ifndef uchar

#define uchar unsigned char

#endif  

 

#ifndef uint

#define uint unsigned int

#endif  

 

sbit DSPORT=P3^7;

 

int Ds18b20ReadTemp();

 

#endif

Temp.c文件

#include

 

void Delay1ms(uint y)

{

    uint x;

    for(;y>0;y--)

       {

             for(x=110;x>0;x--);

         }

}   

uchar Ds18b20Init()

{

    uchar i=0;

       DSPORT=0;

       i=70;

       while(i--);//642us

       DSPORT=1;

       i=0;

       while(DSPORT)

         {

            Delay1ms(1);

            i++

            if(i>5)

       {

                   return 0;

               }                

         }   

    return 1;

}

 

void Ds18b20WriteByte(uchar dat)

{

    uchar i,j;

       for(j=0;j<8,j++)

    {

             DSPORT=0;

                i++;

                DSPORT=dat&0x01;

                i=6;

                while(i--);

              DSPORT=1;

                dat>>=1;

         }

}   

 

uchar Ds18b20ReadByte()

{

    uint i,j;

       uchar bi,byte;

       for(j=8;j>0,j++)

    {

             DSPORT=0;

                i++;

                DSPORT=1;

                i++;

        i++;

                bi=DSPORT;

                byte=(byte>>1)|(bi<<7);

                i=4;

                while(i--);

         }

         return byte;

}       

 

void Ds18b20ChangeTemp()

{

    Ds18b20Init();

       Delay1ms(1);

       Ds18b20WriteByte(0xcc);

   Ds18b20WriteByte(0x44);

}   

 

void Ds18b20ReadTempCom()

{

    Ds18b20Init();

       Delay1ms(1);

       Ds18b20WriteByte(0xcc);

   Ds18b20WriteByte(0xbe);

}   

 

int Ds18b20ReadTemp()

{

    int temp=0;

       uchar tmh,tml;

     Ds18b20ChangeTemp();

     Ds18b20ReadTempCom();

     tml=Ds18b20ReadByte();

    tmh=Ds18b20ReadByte();

    temp=tmh;

    temp<<=8;

    temp|=tml;    

       return temp;

}   

主函数:  

#include

#include

#include

 

typedef unsigned char u8;

typedef unsigned int u16;

 

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit beep=p1^5;

sbit k1=P1^0;

 

u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

u8 num=0,disp[4];

 

void delay(u16 i)

{

    while(i--);

}   

 

void keypros()

{

    if(k1==0)

     {

          delay(1000);

          if(k1==0)

     {

               beep=~beep;

                  delay(100);

               datapros(DS18b20ReadTemp());

               DigDisplay();

          }

     }   

}

 

void datapros(int temp)

{

       float tp;

       if(temp<0)

         {

            DisplayData[0]=0x40;

                  

            temp=temp-1;

               temp=~temp;

               tp=temp;

               temp=tp*0.0625*100+0.5;

         }   

         else

         {

              DisplayData[0]=0x00;

                 tp=temp;

              temp=tp*0.0625*100+0.5;

        

         }   

   DisplayData[1]=smgduan[temp/10000];

       DisplayData[2]=smgduan[temp%10000/1000];

      DisplayData[3]=smgduan[temp%10000%1000/100]|0x80;

   DisplayData[4]=smgduan[temp%100/10];

         DisplayData[5]=smgduan[temp%100%10];

}

 

void DigDisplay()

{

    u8 i;

       for(i=0;i<6;i++)

       {

             switch(i)

                   {

                      case(0);

                          LSA=0;LSB=0;LSC=0;break;

                        case(1);

                          LSA=1;LSB=0;LSC=0;break;

                        case(2);

                          LSA=0;LSB=1;LSC=0;break;

                        case(3);

                          LSA=1;LSB=1;LSC=0;break;

                       case(4);

                          LSA=0;LSB=0;LSC=1;break;

                       case(5);

                          LSA=1;LSB=0;LSC=1;break;

                      

                   }   

         P0=disp[5-i];

         delay(100);

    P0=0x00;          

         }

}   


void main()

{

   while(1)

      {

        keypros();

          beep=~beep;

          delay(100);

          

          datapros(DS18b20ReadTemp());

          DigDisplay();

      }

}

 

 

 

 

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章