51单片机入门
2inc

课程来源:江科大自化协

1 单片机及开发板介绍

单片机

  • Micro Controller Unit 简称 MCU
  • 内部集成 CPU RAM ROM 定时器 终端系统 通讯接口等一系列常用硬件功能
  • 单片机的任务:信息采集、处理和硬件设备的控制
  • 学习使用单片机是了解计算机原理与结构的最佳选择

STC89C52 单片机

  • 所属系列:51 单片机系列
  • 公司:STC 公司
  • 位数:8 位
  • RAM:512 字节
  • ROM:8K
  • 工作频率:12MHz
  • 是对所有兼容 Intel 8031 指令系统的单片机的统称

命名规则

工作电压、程序空间 RAM 大小、工作频率、温度范围、封装类型、管脚数


2 LED

  • 2-1 LED 点亮
  • 2-2 LED 闪烁
  • 2-3 LED 流水灯
     
  • 延时代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Delay500ms()		//@12.000MHz
{
unsigned char i, j, k;

_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

3 按键开关

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

  • 轻触按键:按下开关接通、松开开关断开,原理:金属弹片受力弹动
  • 根据原理图,按下按键对应值为 0;
C51 数据运算
  • 算术:+, -, *, /, %, =
  • 判断: >, >=, <, <=, ==, !=
  • 逻辑:
    运算符 意义
    && 逻辑与
    || 逻辑或
    ! 逻辑非
  • 位运算
    运算符 意义
    << 按位左移
    >> 按位右移
    & 按位与
    | 按位或
    ^ 按位异或
    ~ 按位去反
C51 基本语句

if for while switch

3-2 按键控制 LED 状态

按键抖动

在开关闭合及断开的瞬间会伴随一连串的抖动

消抖
  • 硬件消抖:
    1. RS 触发器
    2. 电容器
  • 软件消抖
    1. 延时函数
      优点:简单方便
      缺点:程序空跑浪费 CPU 资源
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //@12.000MHz-1ms 延时函数
    void Delay(unsigned int xms){//延时1ms
    unsigned char i, j;
    while(xms--){
    i = 2;
    j = 239;
    do{
    while (--j);
    } while (--i);
    }
    }
    //消抖函数
    void debounce(){
    if(PXin(x)==KEY_PRESS) //代表按下按键
    Delay(10); //刚按下时出现抖动,延时10ms
    while(PXin(x)==KEY_PRESS); //按键闭合,不做处理
    Delay(10); //按键弹起出现抖动,延时10ms
    /*按键处理*/
    }

4 数码管

4-1 静态数码管显示

数码管介绍
  • 动态数码管模块原理图
    image
  • 74HC138(U5):
    三线-八线译码器,详见数电课本
  • 74HC245(U4):
    • 作用:双向数据缓冲器,将数据由 AX 传至 BX
    • 原因:单片机驱动能力弱,将驱动改为控制信号,使 LED 数码管的驱动能力来源 VCC
  • RP3&4 100R
    • 100 欧姆排阻
    • 作用:分流
  • 应用原理
    1. 74HC138 译码器,输入三位 421 二进制数,输出结果作为位码
    2. 74HC245,八位输入作为段码
C51 数组
1
2
int x[3];   //定义一组变量
int x[]={1,2,3}; //定义一组变量并初始化
C51 子函数

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

数码管段码表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
uchar code table[]={
/*共阳极,位选高电平有效,段选低电平有效*/
0xc0//0
0xf9//1
0xa4//2
0xb0//3
0x99//4
0x92//5
0x82//6
0xf8//7
0x80//8
0x90//9
0x88//A
0x83//B
0xc6//C
0xa1//D
0x86//E
0x8e, //F
0x8c, //P
0xc1,//U
0x91,//Y
0x7c,//L
0x00,//全亮
0xff //熄灭
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uchar code leddata[]={
/*共阴极,位选低电平有效,段选高电平有效*/
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00 //熄灭
};

4-2 动态数码管显示

数码管串位现象(数码管消影)下一次位选和上一次段选重合。
解决方式:在下一次位选之前段选清零

1
2
3
4
//....
P0=NixieTable[Number];
Delay(1);
P0=0x00//清零
数码管驱动方式
  1. 单片机直接扫描(动态扫描)
    硬件设备简单,但会耗费大量的单片机 CPU 时间
  2. 专用驱动芯片
    内部自带现存、扫描电路,单片机只需告诉它显示什么即可

5 编程与调试

5-1 模块化编程

  • 传统方式编程
    所有函数在 main.c,模块较多则不利于代码组织与管理,影响思路。
  • 模块化编程
    将模块独立放在不同的.c 文件,在.h 文件里提供外部可调用函数的声明,其他.c 文件想使用其中的代码,只需 include 调用即可。使用模块化编程课极大提高代码的可阅读性、可维护性、可移植性等。
    fun.c->fun.h->main.c
  • 模块化编程的注意事项
    • .c 文件:函数、变量的定义
    • .h 文件:可被外部调用的函数、变量的声明
    • 任何自定义的变量、函数在调用前有定义或声明
    • 使用到的自定义函数的.c 需参与编译
    • 使用到的.h 文件必须要放在百年一起可寻找到的地方(工程文件夹根目录、安装目录、自定义)

C 预编译

以#开头,在编译前对代码做出的一些处理

5-2 LCD1602 调试工具

常用函数
image

1
2
3
4
5
6
7
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

函数定义详见LCE1602.c

6 矩阵键盘

6-1 矩阵键盘

为节省 IO 口,逐行逐列扫描,可读出任何位置按键的状态

6-2 矩阵键盘密码锁

矩阵键盘+LCD1602
补充:单行清屏显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//第二行的清除函数
void LCD1602_Clear_2LINE()
{
int i=0;
LCD_WriteCommand(0x80+0x40);
for(i=0;i<16;i++)
{
LCD_WriteData(0x20); //无显示
}//详见函数定义文件及LCD指令集





}

7 定时器

7-1 定时器

  • 定时器介绍:51 单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
  • 定时器作用:
    (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
    (2)替代长时间的 Delay,提高 CPU 的运行效率和处理速度
    (…)
  • 定时器工作模式
    • 模式 0:13 位定时器/计数器
    • 模式 1:16 位定时器/计数器
    • 模式 2:8 位自动重装模式
    • 模式 3:两个 8 位定时器
  • 时钟来源:
    • 系统时钟(晶振周期),本开发板晶振的频率 12MHz,周期 1/12us,机器周期为 12*1/12us=1us
    • 外部 IO 口时钟(T0-P3.4,T1-P3.5)
  • 定时器和计数器:
    • 二者核心部件都是一个加减法计数器,其本质相同均为对脉冲进行计数
    • 区别在于定时器的计数脉冲来自系统时钟,计数器的计数脉冲来自外部时钟
中断系统

是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。
CPU 总是先相应优先级别最高的中断请求。

相关寄存器

51单片机内计时器是由特殊的功能寄存器控制
寄存器是连接软硬件的媒介
在单片机中寄存器就是一段特殊的 RAM 存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式
寄存器相当于一个复杂机器的“操作按钮”
具体定义详见手册

  • 控制寄存器TCON:
    • 低四位:外部中断的控制位
    • 高四位用于定时器启动、停止、移除的标志控制位
  • 模式寄存器TMOD:定时器工作方式及功能的确定(定时|计数)
    image

7-2 按键控制 LED 流水灯模式&定时器闹钟

 评论
评论插件加载失败
正在加载评论插件