点击查看【bilibili】
STC89Cxx中文参考手册.pdf
51单片机入门教程.pptx

软件设备

image.png

Keil5软件注意事项

  • Keil5 C51和Keil5 MDK的区别
  • 两者都是Keil系列软件,但前者是用来开发51单片机的,后者是用来开发ARM系列,比如STM32的。

单片机介绍

  • 单片机,英文Micro Controller Unit,简称MCU
  • 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能
  • 单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
  • 单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用
  • 同时,学习使用单片机是了解计算机原理与结构的最佳选择

STC89C52单片机

  • 所属系列:51单片机系列
  • 公司:STC公司
  • 位数:8位
  • RAM:512字节
  • ROM:8K(Flash)
  • 工作频率:12MHz(本开发板使用)

image.png 命名规则 image.png image.png 单片机内部结构图 image.png image.png 单片机管脚图 image.png 单片机最小系统 image.png

LED介绍

  • 中文名:发光二极管
  • 外文名:Light Emitting Diode
  • 简称:LED
  • 用途:照明、广告灯、指引灯、屏幕

image.png

进制转换

十进制 二进制 十六进制 十进制 二进制 十六进制
0 0000 0 8 1000 8
1 0001 1 9 1001 9
2 0010 2 10 1010 A
3 0011 3 11 1011 B
4 0100 4 12 1100 C
5 0101 5 13 1101 D
6 0110 6 14 1110 E
7 0111 7 15 1111 F

C51数据类型

image.png

按键介绍

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

C51数据运算

类别 运算符 意义 类别 运算符 意义
算术 + 逻辑 && 逻辑与
- || 逻辑或
* ! 逻辑非
/ 位运算 << 按位左移
% 取余 >> 按位右移
= 赋值 & 按位与
判断 > 大于 | 按位或
>= 大于等于 ^ 按位异或
< 小于 ~ 按位取反
<= 小于等于


== 等于


!= 不等于



C51基本语句

语句 解释 语句 解释
if(逻辑表达式)
{
语句体1;
}
else
{
语句体2;
}
如果逻辑表达式成立
执行语句体1
否则
执行语句体2
(else可以不写)
for(初始化;逻辑表达式;更改条件)
{
循环体;
}
先执行初始化
再判断逻辑表达式
若成立则执行循环体
执行后更改条件
再判断逻辑表达式
直到表达式不成立
while(逻辑表达式)
{
循环体;
}
如果逻辑表达式成立
执行循环体
执行后再次判断
若还成立则继续执行直到表达式不成立
switch(变量)
{
case 常量1:语句体1;break;
case 常量2:语句体2;break;
(…)
default:语句体x;break;
}
将变量与case后的各个常量对比
若有相等,则执行相应的语句体
若没有一个相等,则执行default后的语句体
(default可以不写)

按键的抖动

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
image.png

数码管介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
image.png

数码管引脚定义

image.png
image.png
image.png

C51数组

数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据

  1. int x[3]; //定义一组变量(3个)
  2. int x[]={1,2,3}; //定义一组变量并初始化
  3. x[0] //引用数组的第0个变量
  4. x[1] //引用数组的第1个变量
  5. x[2] //引用数组的第2个变量

引用x[3]时,数组越界,读出的数值不确定,应避免这种操作

C51子函数

子函数:将完成某一种功能的程序代码单独抽取出来形成一个模块,在其它函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的

  1. void Function(unsigned char x, y)
  2. {
  3. }
  4. 返回值 函数名(形参)
  5. {
  6. 函数体
  7. }

数码管段码表

  1. 0 1 2 3 4 5 6 7 8 9
  2. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
  3. A B C D E F
  4. 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,

数码管驱动方式

  • 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
  • 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可

image.png
image.png
image.png

模块化编程

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

模块化编程框图

image.png

模块化编程注意事项

  • .c文件:函数、变量的定义
  • .h文件:可被外部调用的函数、变量的声明
  • 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c
  • 使用到的自定义函数的.c文件必须添加到工程参与编译
  • 使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)

    C预编译

    C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)
预编译 意义
#include <REGX52.H> 把REGX52.H文件的内容搬到此处
#define PI 3.14 定义PI,将PI替换为3.14
#define ABC 定义ABC
#ifndef __XX_H__ 如果没有定义XX_H
#endif 与#ifndef,#if匹配,组成“括号”

此外还有#ifdef,#if,#else,#elif,#undef

LCD1602调试工具

  • 使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。
  • 本视频提供的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); | 显示二进制数字 |

矩阵键盘介绍

  • 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
  • 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态

image.png

扫描的概念

  • 数码管扫描(输出扫描)
    • 原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果
  • 矩阵键盘扫描(输入扫描)
    • 原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
  • 以上两种扫描方式的共性:节省I/O口

    定时器介绍

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

  • 定时器作用:

    • (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
    • (2)替代长时间的Delay,提高CPU的运行效率和处理速度
    • (…)

      STC89C52定时器资源

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

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

    定时器框图

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

    定时器工作模式

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

    • 模式0:13位定时器/计数器
    • 模式1:16位定时器/计数器(常用)
    • 模式2:8位自动重装模式
    • 模式3:两个8位计数器
  • 工作模式1框图:

image.png

  • SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz

    中断系统

    image.png

    中断程序流程

    image.png

    STC89C52中断资源

  • 中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)

  • 中断优先级个数:4个
  • 中断号:
    • image.png
  • 注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

    定时器和中断系统

    image.png