51单片机学习笔记

1.1开发环境搭建与单片机相关知识扫盲

什么是单片机

  • 什么是单片机

单片机(Single-Chip Microcomputer)是一种集成电路芯片

把具有数据处理能力的中央处理器CPU、随机存储器RAM只读存储器ROM、

多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)

集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

  • 什么是单片机开发板

基于单片机设计一些外接电路,模块以满足学习,日常调研等工作需求

STC89系列单片机

命名规则,封装LQFP44, 特性 定时器,计数器,串口,看门狗,IO

开发环境

  • keil

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

  • 安装省略
  • 使用
    1. 创建项目工程文件夹,可以当作模板Template
    2. 创建文件,取名main.c (要打开拓展名,在文件夹窗口上找 “查看”,勾选“文件拓展名”)
    3. 进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名字->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文件main.c

如何将代码放入单片机

STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052系列和12C5410等系列的STC单片机,使用简便。

  • 单片机通过type-C数据线和电脑连接(如果不识别,安装ch340驱动,在资料包中)
  • 选择单片机型号STC89C52RC
  • 选择生成的执行程序文件template.hex
  • 点击”下载/编程“按钮
  • 单片机开关拨动重新上电
  • 自动检测并下载了程序

1.2基本IO控制

以下是我使用的单片机开发板的电路图

image-20220628175536031
IO组 0针脚 1针脚 2针脚 3针脚 4针脚 5针脚 6针脚 7针脚 数值 输入/输出 复用
P0 P0^0 P0^1 P0^2 P0^3 P0^4 P0^5 P0^6 P0^7 0-低电平 1-高电平 给变量赋值,就是输出 被赋值,就是输入
P1 P1^1 P1^1 P1^2 P1^3 P1^4 P1^5 P1^6 P1^7 同上 同上
P2 P2^0 P2^1 P2^2 P2^3 P2^4 P2^5 P2^6 P2^7 同上 同上
P3 P3^0 P3^1 P3^2 P3^3 P3^4 P3^5 P3^6 P3^7 同上 同上
P4 P4^0 P4^1 P4^2 P4^3 P4^4 P4^5 P4^6 同上 同上

对于单片机来讲的,IO口的 输入(把外面东西拿回来)/输出(给东西给外面)

89C52比较简单粗暴,关于引脚输入还是输出的功能不需要配置

比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sbit IFfire = P1^0;

int main()
{
int io_data;
//什么情况叫做输入
io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来保存
if(io_data == 0){

}
//什么情况叫做输出
IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输出,来影响外接的电路

return 0;
}

按键控制灯

原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯

查询法按键控制灯

  • 怎么知道sw1按键被按下

    KEY1位置和GND接通,表现为低电平,值为0

  • 怎么知道sw1按键没有被按下 KEY1位置通过上拉电阻到5V,表现为高电平,值为1

  • 按键控制灯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "reg52.h"

sbit key1 = P2^1;
sbit ledOne = P3^7;

void main()
{
while(1){
//注意:用“==”两个等于号表示判断,新手容易犯错
if(key1 == 0){ //KEY1位置和GND接通,表现为低电平,值为0
//灯亮,给一个P3.7低电平
ledOne = 0;
}
}
}

按键控制灯,SW1开,SW2关,案例中只在SW1添加软件消抖

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "reg52.h"
#include <intrins.h>

sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;

void Delay50ms() //@11.0592MHz
{
unsigned char i, j, k;

_nop_();
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
//查询法检测,是否被按下
while(1){
if(key1 == 0)//KEY1位置和GND接通,表现为低电平,值为0
{
//感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
//软件消除抖动
Delay50ms();
if(key1 == 0){
//灯亮,给一个P3.7低电平
ledOne = 0;
}
}
if(key2 == 0){//KEY2位置和GND接通,表现为低电平,值为0
ledOne = 1;//灭
}

}
}