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

    xiaoxiao2021-12-14  34

                   单片机初期理解

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

    一.基本构成

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

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

        折叠数据存储器(RAM)

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

    程序存储器(ROM)

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

    定时/计数器(ROM)

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

    并行输入输出(I/O)

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

    全双工串行口

    51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

    折叠中断系统

    51具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

    折叠时钟电路

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

    折叠MCS-51的引脚说明

    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口其中一位的电路图,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 <reg52.h>

    #include <intrins.h>

    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<<i);

     delay(50000)}}

    2#include <reg52.h>

    #include <intrins.h>

     

    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 <reg52.h>

    #include <intrins.h>

     

    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 <reg52.h>

     

    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 <reg52.h>

     

    #ifndef uchar

    #define uchar unsigned char

    #endif  

     

    #ifndef uint

    #define uint unsigned int

    #endif  

     

    sbit DSPORT=P3^7;

     

    int Ds18b20ReadTemp();

     

    #endif

    Temp.c文件

    #include <temp.h>

     

    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 <reg52.h>

    #include <temp.h>

    #include <intrins.h>

     

    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[temp000/1000];

          DisplayData[3]=smgduan[temp00000/100]|0x80;

       DisplayData[4]=smgduan[temp0/10];

             DisplayData[5]=smgduan[temp0];

    }

     

    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();

          }

    }

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-969246.html

    最新回复(0)