51单片机入门教程

举报
刘斯淇 发表于 2022/04/14 20:00:38 2022/04/14
【摘要】 51单片机的使用教程,以及部分封装代码.
展示一下51单片机的全图


单片机,英文Micro Controller Unit,简称MCU
内部集成了CPURAMROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能
单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用
同时,学习使用单片机是了解计算机原理与结构的最佳选择
单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等
LED介绍以及LED发光代码!
中文名:发光二极管
外文名:Light Emitting Diode
简称:LED
用途:照明、广告灯、指引灯、屏幕
代码实现:

  1. include <REGX52.H>  
  2. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}'  
  3. void delay(unsigned int xms){  
  4.     unsigned char i,j;  
  5.     while(xms--){  
  6.         i=2;  
  7.         j=239;  
  8.         do{  
  9.             while(--j);  
  10.         }while(--i);  
  11.     }  
  12. }  
  13.   
  14.   
  15. void Nixie(unsigned char Location ,Number){  
  16.     switch (Location){  
  17.         case 1:P2_4=1;P2_3=1;P2_2=1;break;  
  18.         case 2:P2_4=1;P2_3=1;P2_2=1 ;break;  
  19.         case 3:P2_4=1;P2_3=0;P2_2=0 ;break;  
  20.         case 4:P2_4=1;P2_3=0;P2_2=1 ;break;  
  21.         case 5:P2_4=0;P2_3=1;P2_2=1;break;  
  22.         case 6:P2_4=0;P2_3=1;P2_2=0 ;break;  
  23.         case 7:P2_4=0;P2_3=0;P2_2=1 ;break;  
  24.         case 8:P2_4=0;P2_3=0;P2_2=0 ;break;  
  25.     }  
  26.     P0= NixieTable[Number];  
  27.        delay(200);  
  28.     P0=0x00;  
  29. }         
  30. void main(){  
  31.       
  32.     while(1){  
  33.             Nixie(1,1);  
  34.             delay(200);  
  35.             Nixie(2,2);  
  36.             delay(200);  
  37.             Nixie(3,3);  
  38.             delay(200);  
  39.   
  40.         }  
  41. }  

51单片机的按键教程!

轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
这里得说明一下按键的抖动~!(所以你得消抖)
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
模块化编程
这里提一提模块化编程!!!
1.传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
2.模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性
总结来说就是:将其他.C文件(必须是有定义和申明的)用来调用过去!!这种方法更加节省时间!更有效果!
.c文件:函数、变量的定义
.h文件:可被外部调用的函数、变量的声明
任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
使用到的自定义函数的.c文件必须添加到工程参与编译
使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
LCD1602基本操作
0
LCDLCD_Init(); _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); 显示二进制数字

按键介绍

0
矩阵键盘的使用
矩阵键盘其实就是为了减少IO位置占用
矩阵键盘扫描(它是一种输入扫描),原理:读取第一行第二行,然后快速循环整个过程,最终实现按键的按键效果!
实现动态扫描矩阵键盘的扫描:

  1. #include <REGX52.H>  
  2.  #include "Delay.h"  
  3. unsigned char Matrixkey(){  
  4.     unsigned char KeyNumber=0;  
  5.       
  6.     P1=0xFF;  
  7.     P1_3=0;  
  8.     if(P1_7==0){Delay(20);while(P1_7==0);Delay(20); KeyNumber=1;}  
  9.     if(P1_6==0){Delay(20);while(P1_6==0);Delay(20); KeyNumber=5;}  
  10.     if(P1_5==0){Delay(20);while(P1_5==0);Delay(20); KeyNumber=9;}  
  11.     if(P1_4==0){Delay(20);while(P1_4==0);Delay(20); KeyNumber=13;}  
  12.           
  13.   
  14.     P1=0xFF;  
  15.     P1_2=0;  
  16.     if(P1_7==0){Delay(20);while(P1_7==0);Delay(20); KeyNumber=2;}  
  17.     if(P1_6==0){Delay(20);while(P1_6==0);Delay(20); KeyNumber=6;}  
  18.     if(P1_5==0){Delay(20);while(P1_5==0);Delay(20); KeyNumber=10;}  
  19.     if(P1_4==0){Delay(20);while(P1_4==0);Delay(20); KeyNumber=14;}  
  20.               
  21.         P1=0xFF;  
  22.     P1_1=0;  
  23.     if(P1_7==0){Delay(20);while(P1_7==0);Delay(20); KeyNumber=3;}  
  24.     if(P1_6==0){Delay(20);while(P1_6==0);Delay(20); KeyNumber=7;}  
  25.     if(P1_5==0){Delay(20);while(P1_5==0);Delay(20); KeyNumber=11;}  
  26.     if(P1_4==0){Delay(20);while(P1_4==0);Delay(20); KeyNumber=15;}    
  27.           
  28.     P1=0xFF;  
  29.     P1_0=0;  
  30.     if(P1_7==0){Delay(20);while(P1_7==0);Delay(20); KeyNumber=4;}  
  31.     if(P1_6==0){Delay(20);while(P1_6==0);Delay(20); KeyNumber=8;}  
  32.     if(P1_5==0){Delay(20);while(P1_5==0);Delay(20); KeyNumber=12;}  
  33.     if(P1_4==0){Delay(20);while(P1_4==0);Delay(20); KeyNumber=16;}        
  34.               
  35.               
  36.     return KeyNumber ;  
  37. }  
    在使用两者结合的时候需要封装库的调用!
    LCD1602显示的调用!(注释已写)
    1. #include <REGX52.H>  
    2.   
    3. //引脚定义  
    4. sbit LCD_RS=P2^6;  
    5. sbit LCD_RW=P2^5;  
    6. sbit LCD_E=P2^7;  
    7. #define LCD_DataPort P0  
    8.   
    9. /** 
    10.   * @brief  LCD1602延时函数,12MHz调用可延时1ms 
    11.   * @param  无 
    12.   * @retval 无 
    13.   */  
    14. void LCD_Delay()        //@12.000MHz 1ms  
    15. {  
    16.     unsigned char i, j;  
    17.   
    18.     i = 2;  
    19.     j = 239;  
    20.     do  
    21.     {  
    22.         while (--j);  
    23.     } while (--i);  
    24. }  
    25.   
    26. /** 
    27.   * @brief  LCD1602写命令 
    28.   * @param  Command 要写入的命令 
    29.   * @retval 无 
    30.   */  
    31. void LCD_WriteCommand(unsigned char Command)  
    32. {  
    33.     LCD_RS=0;  
    34.     LCD_RW=0;  
    35.     LCD_DataPort=Command;  
    36.     LCD_E=1;  
    37.     LCD_Delay();  
    38.     LCD_E=0;  
    39.     LCD_Delay();  
    40. }  
    41.   
    42. /** 
    43.   * @brief  LCD1602写数据 
    44.   * @param  Data 要写入的数据 
    45.   * @retval 无 
    46.   */  
    47. void LCD_WriteData(unsigned char Data)  
    48. {  
    49.     LCD_RS=1;  
    50.     LCD_RW=0;  
    51.     LCD_DataPort=Data;  
    52.     LCD_E=1;  
    53.     LCD_Delay();  
    54.     LCD_E=0;  
    55.     LCD_Delay();  
    56. }  
    57.   
    58. /** 
    59.   * @brief  LCD1602初始化函数 
    60.   * @param  无 
    61.   * @retval 无 
    62.   */  
    63. void LCD_Init(void)  
    64. {  
    65.     LCD_WriteCommand(0x38);  
    66.     LCD_WriteCommand(0x0C);  
    67.     LCD_WriteCommand(0x06);  
    68.     LCD_WriteCommand(0x01);  
    69. }  
    70.   
    71. /** 
    72.   * @brief  LCD1602设置光标位置 
    73.   * @param  Line 行位置,范围:1~2 
    74.   * @param  Column 列位置,范围:1~16 
    75.   * @retval 无 
    76.   */  
    77. void LCD_SetCursor(unsigned char Line,unsigned char Column)  
    78. {  
    79.     if(Line==1)  
    80.     {  
    81.         LCD_WriteCommand(0x80|(Column-1));  
    82.     }  
    83.     else  
    84.     {  
    85.         LCD_WriteCommand(0x80|(Column-1)+0x40);  
    86.     }  
    87. }  
    88.   
    89. /** 
    90.   * @brief  在LCD1602指定位置上显示一个字符 
    91.   * @param  Line 行位置,范围:1~2 
    92.   * @param  Column 列位置,范围:1~16 
    93.   * @param  Char 要显示的字符 
    94.   * @retval 无 
    95.   */  
    96. void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)  
    97. {  
    98.     LCD_SetCursor(Line,Column);  
    99.     LCD_WriteData(Char);  
    100. }  
    101.   
    102. /** 
    103.   * @brief  在LCD1602指定位置开始显示所给字符串 
    104.   * @param  Line 起始行位置,范围:1~2 
    105.   * @param  Column 起始列位置,范围:1~16 
    106.   * @param  String 要显示的字符串 
    107.   * @retval 无 
    108.   */  
    109. void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)  
    110. {  
    111.     unsigned char i;  
    112.     LCD_SetCursor(Line,Column);  
    113.     for(i=0;String[i]!='\0';i++)  
    114.     {  
    115.         LCD_WriteData(String[i]);  
    116.     }  
    117. }  
    118.   
    119. /** 
    120.   * @brief  返回值=X的Y次方 
    121.   */  
    122. int LCD_Pow(int X,int Y)  
    123. {  
    124.     unsigned char i;  
    125.     int Result=1;  
    126.     for(i=0;i<Y;i++)  
    127.     {  
    128.         Result*=X;  
    129.     }  
    130.     return Result;  
    131. }  
    132.   
    133. /** 
    134.   * @brief  在LCD1602指定位置开始显示所给数字 
    135.   * @param  Line 起始行位置,范围:1~2 
    136.   * @param  Column 起始列位置,范围:1~16 
    137.   * @param  Number 要显示的数字,范围:0~65535 
    138.   * @param  Length 要显示数字的长度,范围:1~5 
    139.   * @retval 无 
    140.   */  
    141. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)  
    142. {  
    143.     unsigned char i;  
    144.     LCD_SetCursor(Line,Column);  
    145.     for(i=Length;i>0;i--)  
    146.     {  
    147.         LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);  
    148.     }  
    149. }  
    150.   
    151. /** 
    152.   * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字 
    153.   * @param  Line 起始行位置,范围:1~2 
    154.   * @param  Column 起始列位置,范围:1~16 
    155.   * @param  Number 要显示的数字,范围:-32768~32767 
    156.   * @param  Length 要显示数字的长度,范围:1~5 
    157.   * @retval 无 
    158.   */  
    159. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)  
    160. {  
    161.     unsigned char i;  
    162.     unsigned int Number1;  
    163.     LCD_SetCursor(Line,Column);  
    164.     if(Number>=0)  
    165.     {  
    166.         LCD_WriteData('+');  
    167.         Number1=Number;  
    168.     }  
    169.     else  
    170.     {  
    171.         LCD_WriteData('-');  
    172.         Number1=-Number;  
    173.     }  
    174.     for(i=Length;i>0;i--)  
    175.     {  
    176.         LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);  
    177.     }  
    178. }  
    179.   
    180. /** 
    181.   * @brief  在LCD1602指定位置开始以十六进制显示所给数字 
    182.   * @param  Line 起始行位置,范围:1~2 
    183.   * @param  Column 起始列位置,范围:1~16 
    184.   * @param  Number 要显示的数字,范围:0~0xFFFF 
    185.   * @param  Length 要显示数字的长度,范围:1~4 
    186.   * @retval 无 
    187.   */  
    188. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)  
    189. {  
    190.     unsigned char i;  
    191.     unsigned char SingleNumber;  
    192.     LCD_SetCursor(Line,Column);  
    193.     for(i=Length;i>0;i--)  
    194.     {  
    195.         SingleNumber=Number/LCD_Pow(16,i-1)%16;  
    196.         if(SingleNumber<10)  
    197.         {  
    198.             LCD_WriteData('0'+SingleNumber);  
    199.         }  
    200.         else  
    201.         {  
    202.             LCD_WriteData('A'+SingleNumber-10);  
    203.         }  
    204.     }  
    205. }  
    206.   
    207. /** 
    208.   * @brief  在LCD1602指定位置开始以二进制显示所给数字 
    209.   * @param  Line 起始行位置,范围:1~2 
    210.   * @param  Column 起始列位置,范围:1~16 
    211.   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111 
    212.   * @param  Length 要显示数字的长度,范围:1~16 
    213.   * @retval 无 
    214.   */  
    215. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)  
    216. {  
    217.     unsigned char i;  
    218.     LCD_SetCursor(Line,Column);  
    219.     for(i=Length;i>0;i--)  
    220.     {  
    221.         LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);  
    222.     }  
    223. }  
    1. #ifndef __LCD1602_H__  
    2. #define __LCD1602_H__  
    3.   
    4. void LCD_Init(void);  
    5. void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);  
    6. void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);  
    7. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  
    8. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);  
    9. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  
    10. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);  
    11.   
    12. #endif  
    延迟函数的写法!!
    1. #include <REGX52.H>  
    2.   
    3. void Delay(unsigned int xms)  
    4. {  
    5.     unsigned char i, j;  
    6.     while(xms--)  
    7.     {  
    8.         i = 2;  
    9.         j = 239;  
    10.         do  
    11.         {  
    12.             while (--j);  
    13.         } while (--i);  
    14.     }  


LED介绍

LED介绍

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。