51单片机学习笔记------>记录一个咸鱼的学习日常

51单片机学习笔记------>记录一个咸鱼的学习日常,第1张

1.关键字sfr与sbit的区别

        sfr是定义寄存器的字节地址,sbit是定义可位寻址的位地址

        例如:sfr P1 =0x90;

        sbit A = P1^0 sbit B = P1^1;

2. 单片机引脚有:电源引脚、晶振引脚、复位引脚、下载引脚、GPIO引脚

        其中晶振引脚主要是用来提供外部时钟,驱动指令执行,GPIO引脚包含P0、P1、P2、P3 四个端口

3.点亮一个LED灯

        从电路图可以得知,LED是P2端口,我们给P2.0针脚一个低电压,也就是0V,就会点亮第一个,程序如下       

#include"reg52.h" //引用头文件

int main()
{
    P2 = 0xFE;     //1111 1110  代表P2.0----P2.7引脚的输出电压状态

    while(1)
    {
    }

     return 0;
}

那如果我给P2端口所有引脚输出低电压,P2=0x00;那所有LED就会点亮,如下图

 2.LED灯闪烁

        通过输出高低电平来控制LED灯闪烁,但由于人眼余晖效应,无法去观看到闪烁情况,就得需要通过延时来达到效果,程序如下

#include"reg52.h" //引用头文件

void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}

int main()
{

    while(1)
    {
        P2 = 0xFF;
        Delay(50000); //延时大约450ms
        P2 = 0xFE;
        Delay(50000); //延时大约450ms 
    }

     return 0;
}

实验现象如下

3.LED灯流水灯效

        知道闪烁原理后,我们就可以将所有引脚依次输出0V、延时、输出5V,就能达到流水灯效果,但这样写太呆板,咱们利用C语言for循环,再进行位运算就可以简单达到效果,程序如下

#include"reg52.h" //引用头文件
void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}

int main()
{
    int i = 0;
    while(1)
    {

      for(i=0;i<8;i++)
      {
        P2=~(0x01<         Delay(50000);
      }
    }
    
     return 0;
}

实验现象如下

4.独立按键控制LED灯亮灭

        根据电路板接线图发现独立按键1按下时,对应的P3^1的引脚是低电平,松开是高电平,那就可以编写程序,加入if判断,程序如下

 #include"reg52.h"

sbit KEY1 = P3^1;    //需要注意按键1是P3^1引脚,按键2是P3^0引脚  
 int main()
 {
    while(1)
    {
        if(KEY1==0)
        {
           P2=0xFE;
        }
        else
            P2=0xFF;    

    }
 }

实验现象如下

5.独立按键控制LED灯状态 

        亮灭实验完成后,就可以控制LED状态,首先我们知道由于机械结构的d性作用,按键开关在闭合时不会一瞬间稳定的接通,在断开时,也不会一下子断开


所以就得需要程序消抖,也就是适当延时,程序如下

#include"reg52.h"
//定义LED灯
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;

//定义独立按键
sbit KEY1 = P3^1;    //需要注意按键1是P3^1引脚,按键2是P3^0引脚
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3; 

void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}

 
 int main()
 {
    while(1)
    {
        if(KEY1==0)
        {
            Delay(500);
               while(KEY1==0);
            Delay(500);
            LED1 =~ LED1;
        }
            

    }
 }

实验现象如下

6.独立按键控制LED灯显示二进制

        LED亮灭和控制LED状态实验都已完成,控制LED灯显示二进制就是直接对LED灯P2进行 *** 作,在初始状态下,P2的所有引脚都是输出高电平,那我们直接对P2自减 *** 作就能达到实验效果,程序如下

#include"reg52.h"

//定义独立按键
sbit KEY1 = P3^1;    //需要注意按键1是P3^1引脚,按键2是P3^0引脚

void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}
 
 int main()
 {
    while(1)
    {
        if(KEY1==0)
        {
            Delay(500);
               while(KEY1==0);
            Delay(500);
            P2--;
        }
            

    }
 }

实验现象如下

7.独立按键控制LED灯移位

        通过控制独立按键KEY1、KEY2来实现左右移位,程序如下

 #include"reg52.h"

//定义独立按键
sbit KEY1 = P3^1;    //需要注意按键1是P3^1引脚,按键2是P3^0引脚
sbit KEY2 = P3^0;

void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}
 
 int main()
 {
     int num = -1; 
    while(1)
    {
        //LED灯右移
        if(KEY1==0)
        { 
            
            Delay(500);
               while(KEY1==0);
            Delay(500);
            num++;
            if(num>=8)
                num=0; 
            P2 =~ (0x01<         
        }

        //LED灯左移
        if(KEY2==0)
        {
            if(num<=0)
                num=8;
            else
            {
                  Delay(500);
                   while(KEY2==0);
                Delay(500);
                num--;
                P2 =~ (0x01<             }    
                
        }    

    }
 }

实验现象如下

8.静态数码管显示

        点亮数码管需要用到P0端口和P2部分端口,P0端口负责显示要输出的数字,P2部分端口负责让哪个数码管点亮,具体的去看电路图,这次还包含了74HC245和74HC138芯片

        现在让单片机数码管区域第三位的数码管显示数字5,程序如下

 #include"reg52.h"

//定义P2端口
sbit LSA=P2^2; 
sbit LSB=P2^3; 
sbit LSC=P2^4;

//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};


void  Display(int Location,int Number)
{
    //利用case语句将8个数码管显示的位置一一列举
    switch(Location)   
    {
        case 1: LSC=0;LSB=0;LSA=0; break;
        case 2: LSC=0;LSB=0;LSA=1; break;
        case 3: LSC=0;LSB=1;LSA=0; break;
        case 4: LSC=0;LSB=1;LSA=1; break;
        case 5: LSC=1;LSB=0;LSA=0; break;
        case 6: LSC=1;LSB=0;LSA=1; break;
        case 7: LSC=1;LSB=1;LSA=0; break;
        case 8: LSC=1;LSB=1;LSA=1; break;
    }

    P0=str[Number];
}

int main()
{
    Display(3,5); //参数1表示数码管位置,参数2表示要输出的0-9的数字
    while(1)
    {
    }
}

实验现象如下

9.动态数码管显示

        这部分主要是注意延时和消除残影的问题,如不加延时的,两个数字切换的非常快,可能会导致篡位,程序如下

 #include"reg52.h"

//定义P2端口
sbit LSA=P2^2; 
sbit LSB=P2^3; 
sbit LSC=P2^4;

//用数组来表示数码管上每个数字输出对应的相关电平输入
int str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};

void Delay(int time)
{
    while(time--) //while循环一次需要10us
    {
    }
}

void  Display(int Location,int Number)
{
    //利用case语句将8个数码管显示的位置一一列举
    switch(Location)   
    {
        case 1: LSC=0;LSB=0;LSA=0; break;
        case 2: LSC=0;LSB=0;LSA=1; break;
        case 3: LSC=0;LSB=1;LSA=0; break;
        case 4: LSC=0;LSB=1;LSA=1; break;
        case 5: LSC=1;LSB=0;LSA=0; break;
        case 6: LSC=1;LSB=0;LSA=1; break;
        case 7: LSC=1;LSB=1;LSA=0; break;
        case 8: LSC=1;LSB=1;LSA=1; break;
    }

    P0=str[Number];

    //延时一段时间,等待显示稳定,如果不加延时,就可能上一个数字和下一下篡位
    Delay(100);
    //消除数码管残影
    P0=0x00;
}

int main()
{
     //参数1表示数码管位置,参数2表示要输出的0-9的数字
    while(1)
    {
        Display(1,1);
        Display(2,2);
        Display(3,3);

    }
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存