51单片机入门教程学习笔记

这篇具有很好参考价值的文章主要介绍了51单片机入门教程学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


基于江科大自化协B站教学视频《51单片机入门教程-2020版 程序全程纯手打 从零开始入门》

一、单片机介绍


单片机,英文Micro Controller Unit,简称MCU

内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能

单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制

单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用

同时,学习使用单片机是了解计算机原理与结构的最佳选择

51单片机是指80年代Intel开发的8051单片机内核的统称,就是因为这个“8051”有个51,所以凡是与“8051”内核一样的单片机都统称为51系列单片机


二、LED代码


2-1点亮一个LED


这里使用的普中单片机的LED是共阳极,所以将P2寄存器设置值为如下0xFE //1111 1110
 #include <REGX52.H>
 ​
 voidmain()
 {
     P2=0xFE;  //1111 1110
 }

2-2LED循环闪烁


通过调用延时函数实现闪烁
 #include <REGX52.H>
 #include <INTRINS.H>  //_nop_()函数所在库
 ​
 voidDelay500ms()       //@11.0592MHz
 {
     unsignedchari, j, k;
 ​
     _nop_();  //空操作,延时一个指令的时间
     i=4;
     j=129;
     k=119;
     do
     {
         do
         {
             while (--k);
         } while (--j);
     } while (--i);
 }
 ​
 voidmain()
 {
     
     while(1)
     {
         P2=0x00;
         Delay500ms();  //这里是通过STC-ISP软件生成的延时函数调用
         P2=0xFF;
         Delay500ms();
     }
 }   

2-3LED流水灯


通过进行P2寄存器的不断延时赋值实现流水灯-基础版
 #include <REGX52.H>
 #include <INTRINS.H>  //_nop_()函数所在库
 ​
 voidDelay500ms()       //@11.0592MHz
 {
     unsignedchari, j, k;
 ​
     _nop_();  //空操作,延时一个指令的时间
     i=4;
     j=129;
     k=119;
     do
     {
         do
         {
             while (--k);
         } while (--j);
     } while (--i);
 }
 ​
 voidmain()
 {
     
     while(1)
     {
         P2=0xFE;      //1111 1110
         Delay500ms();  //这里是通过STC-ISP软件生成的延时函数调用
         P2=0xFD;      //1111 1101
         Delay500ms();
         P2=0xFB;      //1111 1011
         Delay500ms();  
         P2=0xF7;      //1111 0111
         Delay500ms();
         P2=0xEF;      //1110 1111
         Delay500ms();  
         P2=0xDF;      //1101 1111
         Delay500ms();
         P2=0xBF;      //1011 1111
         Delay500ms();  
         P2=0x7F;      //0111 1111
         Delay500ms();
     }
 }   

2-4LED流水灯Plus


优化含参延时函数,但是会有一定的误差
 #include <REGX52.H>
 #include <INTRINS.H>  //_nop_()函数所在库
 ​
 voidDelay1ms(xms)      //@11.0592MHz
 {
     unsignedchari, j;
     while(xms)
     {
         _nop_();
         i=2;
         j=199;
         do
         {
             while (--j);
         } while (--i);
         xms--;
     }
 }
 ​
 ​
 voidmain()
 {
     
     while(1)
     {
         P2=0xFE;      //1111 1110
         Delay1ms(500);  //优化含参延时函数
         P2=0xFD;      //1111 1101
         Delay1ms(500);
         P2=0xFB;      //1111 1011
         Delay1ms(500);
         P2=0xF7;      //1111 0111
         Delay1ms(500);
         P2=0xEF;      //1110 1111
         Delay1ms(500); 
         P2=0xDF;      //1101 1111
         Delay1ms(500);
         P2=0xBF;      //1011 1111
         Delay1ms(500);
         P2=0x7F;      //0111 1111
         Delay1ms(500);
     }
 }   

三、独立按键与LED


  • 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开

  • LED发光二极管:Light Emitting Diode

  • LED正极引脚较长,负极引脚较短

  • LED正极闪电极较小,负极闪电极较小(在玻璃灯罩里面的)

3-1独立按键控制LED亮灭


通过循环和判断实现按键控制LED亮灭功能
 #include <REGX52.H>
 voidmain()
 ​
 {
     while(1)
     {
         if(P3_1==0)
             P2_0=0;
         else
             P2_0=1;
     }
 }

3-2独立按键控制LED状态


  • 按键的抖动

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
51单片机教程,嵌入式,大学,硬件工程,51单片机,嵌入式硬件,Powered by 金山文档
为了避免误操作,需要进行消抖处理:硬件消抖、软件消抖
硬件消抖: RS触发器、电容充放电滤波等方式
软件消抖:Delay函数延时消抖,定时消抖以及外部中断消抖

#include <REGX52.H>
#include <intrins.h>

void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;

    while(xms)
    {    
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    xms--;
    }
}


void main()
{
    while(1)
    {
            if(P3_1==0)
            {
                Delay(20);
                while(P3_1==0);  //判断是否还在按下按键,等松开时跳出循环,并延时消抖,执行相关操作
                Delay(20);
                P2_0=~P2_0;
            }
    }    
}

3-3独立按键控制LED显示二进制


通过二进制值的输出来让LED显示
#include <REGX52.H>
#include <intrins.h>

void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;

    while(xms--)
    {    
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    }
}
void main()
{
    unsigned char LEDnum;        //定义无符号字符变量用来存储二进制
    while(1)
    {    
            if(P3_1==0)
            {
                Delay(20);
                while(P3_1==0);
                Delay(20);
                LEDnum++;     //逐渐递增
                P2=~LEDnum;  //并将二进制结果传给P2寄存器,因为LED共阳极,低电平亮,所以取反
                // P2_0=~P2_0;   //这样不行是因为会导致P2_0值改变
            }
    }
}

3-4独立按键控制LED移位


通过C语言移位指令以及对LEDNum变量值的控制来完成LED移位显示操作
#include <REGX52.H>
#include <intrins.h>

void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;

    while(xms--)
    {    
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    }
}

unsigned char LEDnum;

void main()
{
    while(1)
    {
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            LEDnum++;
            if(LEDnum>=8)   //当到8的时候应该先清零再进行取反,不然灯会不亮
                LEDnum=0;
            P2=~(0x01<<LEDnum);
        }
        if(P3_0==0)
        {
            Delay(20);
            while(P3_0==0);
            Delay(20);
            
            if(LEDnum==0)  //因为定义的是无符号字符变量,所以为了避免向下溢出,进行0值判断置7操作
                LEDnum=7;
            else
                LEDnum--;
            P2=~(0x01<<LEDnum);
        }
        
    }

}

四、数码管


4-1静态数码管显示


注意若用开发板的时候不要接LCD1602显示屏,因为引脚共用原因会导致数字显示异常
 #include <REGX52.H>
 #include <intrins.h>
 ​
 voidDelay(unsignedintxms)        //@11.0592MHz
 {
     unsignedchari, j;
 ​
     while(xms)
     {   
         _nop_();
         i=2;
         j=199;
         do
         {
             while (--j);
         } while (--i);
     xms--;
     }
 }
 ​
 unsignedcharNixieTable[]=
 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
 0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};   //定义数码管数组,用来存储显示对应数字时应该给寄存器赋的值
 voidNixie(unsignedcharLocation,Number)
 {
     switch(Location)        //Location用来接收数字在哪一个数码管显示,通过三八译码器来实现数码管的选择
     {
         case1:P2_4=1;P2_3=1;P2_2=1;break;      
         case2:P2_4=1;P2_3=1;P2_2=0;break;
         case3:P2_4=1;P2_3=0;P2_2=1;break;
         case4:P2_4=1;P2_3=0;P2_2=0;break;
         case5:P2_4=0;P2_3=1;P2_2=1;break;
         case6:P2_4=0;P2_3=1;P2_2=0;break;
         case7:P2_4=0;P2_3=0;P2_2=1;break;
         case8:P2_4=0;P2_3=0;P2_2=0;break;
     }
     P0=NixieTable[Number];
 }
 ​
 voidmain() 
 {
     while(1)
     {
     Nixie(1,1);     //测试数字循环显示
     Delay(500);
     Nixie(2,2);
     Delay(500);
     Nixie(3,3);
     Delay(500);
     Nixie(4,4);
     Delay(500);
     Nixie(5,5);
     Delay(500);
     Nixie(6,6);
     Delay(500);
     Nixie(7,7);
     Delay(500);
     Nixie(8,8);
     Delay(500);
                         
     Nixie(1,9);
     Delay(500); 
     Nixie(2,0);
     Delay(500);
     
     Nixie(3,10);        //以下为ABCDEF
     Delay(500);
     Nixie(4,11);
     Delay(500);
     Nixie(5,12);
     Delay(500);
     Nixie(6,13);
     Delay(500);
     Nixie(7,14);
     Delay(500);
     Nixie(8,15);
     Delay(500);
     }
 }

4-2动态数码管显示


想要进行多个数码管同时显示,需要进行消影操作
出现串位显示的原因是因为数码管的位选和段选出现了交叉,导致串位:位选-段选-位选-段选-位选-段选
消影:位选-段选-清零-位选-段选-清零
 #include <REGX52.H>
 #include <intrins.h>
 ​
 voidDelay(unsignedintxms)        //@11.0592MHz
 {
     unsignedchari, j;
 ​
     while(xms)
     {   
         _nop_();
         i=2;
         j=199;
         do
         {
             while (--j);
         } while (--i);
     xms--;
     }
 }
 ​
 ​
 ​
 unsignedcharNixieTable[]=
 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
 0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
 voidNixie(unsignedcharLocation,Number)
 {
     switch(Location)
     {
         case1:P2_4=1;P2_3=1;P2_2=1;break;
         case2:P2_4=1;P2_3=1;P2_2=0;break;
         case3:P2_4=1;P2_3=0;P2_2=1;break;
         case4:P2_4=1;P2_3=0;P2_2=0;break;
         case5:P2_4=0;P2_3=1;P2_2=1;break;
         case6:P2_4=0;P2_3=1;P2_2=0;break;
         case7:P2_4=0;P2_3=0;P2_2=1;break;
         case8:P2_4=0;P2_3=0;P2_2=0;break;
     }
     P0=NixieTable[Number];
     Delay(1);  //保持显示,避免变暗
 ​
     P0=0X00;  //清零进行消影
 }
 ​
 voidmain() 
 {
     while(1)
     {
     Nixie(1,1);
     // Delay(500);    //消除延时之后,再加上消影功能就可以实现同时显示
     Nixie(2,2);
     // Delay(500);
     Nixie(3,3);
     
     }
 }
数码管驱动方式:
1.单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
2.专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可
以上代码均为针对单片机直接扫描实现的,while(1)不断循环实现

五、LCD1602(模块化编程开始)


5-1模块化编程


模块化编程:
•传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
•模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

以Delay函数为例
  • main.c

 #include "Delay.h"
 voidmain()
 {
     Delay(10);
 }
  • Delay.h

 #ifndef __DELAY_H__
 #define __DELAY_H__
 ​
 voidDelay(unsignedintxms);
 ​
 #endif
  • Delay.c

 voidDelay(unsignedintxms)
 {
     unsignedchari, j;
     while(xms--)
     {
         i=2;
         j=239;
         do
         {
             while (--j);
         } while (--i);
     }
 }
  • 图示

51单片机教程,嵌入式,大学,硬件工程,51单片机,嵌入式硬件,Powered by 金山文档

模块化实现数码管显示
  • main.c

 #include <REGX52.H>
 #include "Delay.h"
 #include "Nixie.h"
 ​
 voidmain() 
 {
     while(1)
     {
     Nixie(1,1);
     // Delay(500);
     Nixie(2,2);
     // Delay(500);
     Nixie(3,3);
     Nixie(4,4);
     Nixie(5,5);
     }
 }
  • Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
    void Delay(unsigned int xms);
#endif
  • Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__
    void Nixie(unsigned char Location,Number);
#endif
  • Delay.c

#include <intrins.h>

void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;

    while(xms)
    {    
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    xms--;
    }
}
  • Nixie.c

#include "Delay.h"
#include <REGX52.H>

unsigned char NixieTable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
 0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void Nixie(unsigned char Location,Number)
{
    switch(Location)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
        case 4:P2_4=1;P2_3=0;P2_2=0;break;
        case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
    }
    P0=NixieTable[Number];
    Delay(1);
    P0=0X00;
}

5-2LCD1602调试工具*


LCD1602调试函数模块
不同的LCD1602调试函数代码决定了不同的调试函数以及使用方法
使用时应注意对应的文件函数的异同

函数

作用

LCD_Init();

初始化

LCD_ShowChar(1,1,'A');

显示一个字符

LCD_ShowString(1,3,"Hello");

显示字符串

LCD_ShowNum(1,9,123,3);

显示十进制数字

LCD_ShowSignedNum(1,13,-66,2);

显示有符号十进制数字

LCD_ShowHexNum(2,1,0xA8,2);

显示十六进制数字

LCD_ShowBinNum(2,4,0xAA,8);

显示二进制数字


代码暂略,等后续对头文件以及源代码进行全方面分析之后再复盘补充

六、矩阵键盘


6-1矩阵键盘*


涉及到了施密特触发电路和上拉电阻和下拉电阻,等模电再学一学复盘一下
这里同样使用了前面的LCD1602的调试文件:LCD1602.H、LCD1602.C
编译时会出现WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的报错,是因为引用的LCD1602的文件中的函数虽然定义了,但是并没有在程序中显式调用到定义过的函数,可以无视,但是会浪费RAM
  • main.c

 #include "DELAY.H"
 #include "lcd1602.h"
 #include "Delay.h"
 #include "MatrixKey.h"
 ​
 unsignedcharKeyNum;       //定义无符号整型用来接收键码
 ​
 voidmain()
 {
     lcd1602_init();     //初始化LCD1602
     lcd1602_show_string(0,0,"MatrixKey:");//在第一列第一行显示MatrixKey:
     while(1)
     {
         KeyNum=MatrixKey();   //调用函数接收键码
         if(KeyNum)              //接受到键码则判断键码值并显示
         {
             switch(KeyNum)
             {
               case1: lcd1602_show_string(0,1,"1");break;
                 case2: lcd1602_show_string(0,1,"2");break;
                 case3: lcd1602_show_string(0,1,"3");break;
                 case4: lcd1602_show_string(0,1,"4");break;
                 
                 case5: lcd1602_show_string(0,1,"5");break;
                 case6: lcd1602_show_string(0,1,"6");break;
                 case7: lcd1602_show_string(0,1,"7");break;
                 case8: lcd1602_show_string(0,1,"8");break;
                 
                 case9: lcd1602_show_string(0,1,"9");break;
                 case10: lcd1602_show_string(0,1,"10");break;
                 case11: lcd1602_show_string(0,1,"11");break;
                 case12: lcd1602_show_string(0,1,"12");break;
                 
                 case13: lcd1602_show_string(0,1,"13");break;
                 case14: lcd1602_show_string(0,1,"14");break;
                 case15: lcd1602_show_string(0,1,"15");break;
                 case16: lcd1602_show_string(0,1,"16");break;
             }
         }
     }
 }
     
  • MatrixKey.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

    unsigned char MatrixKey();

#endif
  • MatrixKey.c

 #include <REGX52.H>
 #include "Delay.h"
 ​
 unsignedcharMatrixKey()
 {
         unsignedcharKeyNumber=0;
         P1=0xff; // 全部拉高
         P1_3=0;  //单独留一个低电位进行扫描按键
         if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
         if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
         if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
         if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
         
         P1=0xff; // 全部拉高
         P1_2=0;  //单独留一个低电位进行扫描按键
         if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
         if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
         if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
         if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
         
         P1=0xff; // 全部拉高
         P1_1=0;  //单独留一个低电位进行扫描按键
         if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
         if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
         if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
         if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
         
         P1=0xff; // 全部拉高
         P1_0=0;  //单独留一个低电位进行扫描按键
         if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
         if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
         if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
         if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
     
         returnKeyNumber;
 }

6-2矩阵键盘密码锁


所使用的前述模块化列表
LCD1602
Delay
MatrixKey
  • main.c

 #include "lcd1602.h"
 #include "Delay.h"
 #include "MatrixKey.h"
 ​
 unsignedcharKeyNum;   //定义KeyNum用于接收键码值
 unsignedintPassword,Count;  //定义无符号整型用于存储 密码值 和 密码位数
 ​
 voidmain()
 {
     LCD_Init();
     LCD_ShowString(0,1,"Password:");
     while(1)
     {
         KeyNum=MatrixKey();
         if(KeyNum)
         {
             if(KeyNum<=10) //如果S1~S10按键按下,输入密码
             {
                 if(Count<4) //如果位数不超过设定范围
                 {
                     Password*=10; //向左移动一位
                     Password+=KeyNum%10; //累加密码
                     Count++; //计次加一,确保四位
                 }   
                 LCD_ShowNum(1,1,Password,4); //更新显示
             }
             if(KeyNum==11) //确认键
             {
                 if(Password==2345)  //设定密码为2345
                 {
                     LCD_ShowString(1,14,"OK!");
                     Password=0; //密码清零
                     Count=0;  //计次清零
                     LCD_ShowNum(1,1,Password,4); //更新显示
                 }
                 else
                 {
                     LCD_ShowString(1,14,"ERR");
                     Password=0; //密码清零
                     Count=0;  //计次清零
                     LCD_ShowNum(1,1,Password,4); //更新显示
                 }
             }
             if(KeyNum==12) //删除键
             {
                 Password=Password/10; //删除数字
                 LCD_ShowNum(1,1,Password,4); //更新显示
                 Count--; //计次减少
             }
         }
     }
 }

七、定时器


7-1定时器


定时器介绍:

51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成

定时器作用:

(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作

(2)替代长时间的Delay,提高CPU的运行效率和处理速度

(3)多任务处理

(…)

STC89C52定时器资源

•定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源

•注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

定时器框图

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行

51单片机教程,嵌入式,大学,硬件工程,51单片机,嵌入式硬件,Powered by 金山文档
定时器工作模式

STC89C52的T0和T1均有四种工作模式:

模式0

13位定时器/计数器

模式1

16位定时器/计数器(常用)

模式2

8位自动重装模式

模式3

两个8位计数器


工作模式1(16位定时器/计数器)框图:
51单片机教程,嵌入式,大学,硬件工程,51单片机,嵌入式硬件,Powered by 金山文档
  • SYSclk:系统时钟,用来产生固定频率的脉冲(晶振电路)来使后面的计数器的技术值累加,此时作定时器使用,

  • MCU in 12T/6T mode:分频模式,例如当晶振频率为12MHz,采用MCU in 12T mode时,产生的脉冲频率就是1MHz

  • T0 Pin:外部接口,当由外部接口来提供脉冲时,作计数器使用

  • C/T非:配置寄存器时若其对应的控制字为1,则为Count计数器模式,为0,则为Time定时器模式

  • TH0和TL0:Time High 0和Time Low 0,代表了定时器的高位和低位,后面的0表示计时器0,计数器共十六位,最大计数值为65535

  • TF0:Time Flag 0,表示计时器0的标志位,当达到最大技术值后,下一次计数就会溢出,产生脉冲传送到标志位从而影响后面的Interrupt,从而申请中断文章来源地址https://www.toymoban.com/news/detail-751942.html

到了这里,关于51单片机入门教程学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)

    得益于瑞萨强大的MCU、强大的软件开发工具(e² studio),也得益于瑞萨和RA生态工作室提供的支持,我们团队编写了《ARM嵌入式系统中面向对象的模块编程方法》,全书37章,将近500页: 讲解面向对象编程在单片机开发中的使用 结合FSP软件包实例分析外设驱动 讲解如何使用RASC配

    2024年02月08日
    浏览(47)
  • 单片机入门教程:第七章 1602LCD液晶显示模块

    在单片机的人机交互系统中,常常需要显示系统运行中的某些信息和数据,例如,字符、汉字或者图形等。液晶显示器(LCD)正好可以完成此项任务,它是一种功耗很低的显示器,在电子表、计算器、数码相机、计算机的显示器和液晶电视上都可以看到它的身影。液晶显示器

    2024年02月09日
    浏览(55)
  • 51单片机学习入门(三):串口

    串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。 51单片机内部自带 UART (Universal Asynchronous Receiver Transmitter,通用异步收发器

    2024年02月01日
    浏览(52)
  • 洋桃电子STM32F407单片机入门教程笔记九:低功耗模式

      此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接: 第28集)低功耗模式_哔哩哔哩_bilibili         在之前的程序里应用程序在while(1)主循环中反复执行,ARM内核以100%的功率工作。这样的设计简单稳定,内核全速运行的功耗也只有几十毫安,对于外接电源的设备

    2024年01月23日
    浏览(65)
  • 51单片机和32单片机有什么区别?该从哪个开始入门学习?

    单片机 (microcontroller)是一种能够完成特定功能的微型电脑。它包含了中央处理器(CPU)、存储器(ROM、RAM)以及输入/输出接口(I/O)。单片机被广泛应用于各种电子设备中,如电子手表、电子计算器、家用电器、汽车电子、机器人等等。 目前市面上最常见的单片机有 51单

    2024年02月08日
    浏览(43)
  • 洋桃电子STM32F407单片机入门教程笔记一:RCC时钟设置

    此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:2023更新 STM32入门F4= STM32F407单片机入门教程=WIFI连接阿里云物联网+CubeMX+HAL库+TFT彩屏+杜洋主讲_哔哩哔哩_bilibili 由于单片机内部的时钟结构都是相互关联的,一个时钟源出发可以供给多个功能,类似于树根、树杆、树

    2024年02月04日
    浏览(49)
  • STC8H系列单片机入门教程之ADC基础知识(四)

    目录 一、A/D转换过程 二、ADC转换流程图 三、采样定理 四、ADC基本参数 4.1、分辨率 4.2、采样速率 4.3、转换时间 4.4、量程  4.5、最低有效位 五、静态参数 5.1、微分非线性 5.2、积分非线性 六、逐次逼近型模数转换器 七、ADC常用分压电路 八、示例代码 ADC即模数转换器,用来

    2024年04月11日
    浏览(59)
  • STC8H系列单片机入门教程之GPIO基本知识(一)

    IO口即输入输出口,STC8H系列单片机支持四种工作模式, 即准双向口、推挽输出、高阻输入、开漏输出,每个IO通过两个寄存器进行配置,如下图所示,注:n = 0,1,2,3,4,5,6,7。 PnM1 PnM0 I/O 口工作模式 0 0 准双向口(弱上拉),灌电流可达 20mA ,拉电流 150-270uA 0 1 推挽输出,强上拉

    2024年04月14日
    浏览(68)
  • 第1章_瑞萨MCU零基础入门系列教程之单片机程序的设计模式

    本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总 : https://blog.csdn.net/qq_35181236/article/details/132779862 本章目标 理解裸机程序设

    2024年02月09日
    浏览(52)
  • 立创EDA入门3 通过51单片机最小板学习PCB设计

    练习立创EDA基本操作 学习立创EDA PCB板设计中用到的工具 把原理图文件改名为51最小板, PCB文件名为PCB_51系统。 51最小板电路大致分为以下几个模块: 电源电路 复位电路 下载电路 晶振电路 本文重点不在于电路设计,每个模块电路分析可参考这里: 电源电路: 复位电路 下

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包