51单片机及补充知识
# 51单片机
# 1、单片机介绍
单片机,英文Micro Controller Unit,简称MCU
内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能
单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用
同时,学习使用单片机是了解计算机原理与结构的最佳选择
在STC89C52 (opens new window)芯片中所有的IO口都可以是输入也可以做输出,P1 P2 P3都是弱上拉,P0是开漏输出,但在开发板上已经做了外部上拉电阻和P1 P2 P3一样。IO口都是弱上拉,强下拉,所以按键扫描是可以IO口接IO的,不会发生短路的现象。
# 2、单片机的应用领域
- 单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等
# 3、STC89C52单片机
- 所属系列:51单片机系列
- 公司:STC公司
- 位数:8位
- RAM(Random Access Memory):512字节
- 随机存取存储器,相当于内存条
- ROM(Read Only Memory):8K(Flash)
- 只读存储器,相当于硬盘
- 工作频率:12MHz(本开发板使用)
- 这里我买的是普中A2的板子,是STC89C52RC ,工作频率为11.0592
# 4、单片机内部结构图
# 5、单片机管脚图
- 40正极,20接地。P0到3,镜像Z型。左侧上下,右侧里外。9脚复位,P0上拉。31引脚,电平决定,接高访低,接低访高。(看具体的单片机型号,我买的板子,不是这样排列)
# 一些基础知识
# 1、进制转换
十进制 | 二进制 | 十六进制 | 十进制 | 二进制 | 十六进制 |
---|---|---|---|---|---|
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 |
# 2、C51数据类型
# 3、数据运算
类别 | 运算符 | 意义 |
---|---|---|
逻辑 | && | 逻辑与 |
|| | 逻辑或 | |
! | 逻辑非 | |
位运算 | << | 按位左移 |
>> | 按位右移 | |
& | 按位与 | |
| | 按位或 | |
^ | 按位异或 | |
~ | 按位取反 |
// & 按位与 有0为0,同1为1(同真)
0001 1000 & 0010 1010 -> 0000 1000
// | 按位或 有1为1(有一个正确就是正确)
0001 1000 | 0010 1010 -> 0011 1010
// ^ 按位异或 不同为1
0001 1000 ^ 0010 1010 -> 0011 0010
~0001 1000 -> 1110 0111
2
3
4
5
6
7
8
9
# 4、基本逻辑判断语句
语句 | 解释 | 语句 | 解释 |
---|---|---|---|
if(逻辑表达式) { 语句体1; }else { 语句体2; } | 如果逻辑表达式成立 执行语句体1 否则 执行语句体2 (else可以不写) | for(初始化;逻辑表达式;更改条件) { 循环体; } | 先执行初始化 再判断逻辑表达式 若成立则执行循环体 执行后更改条件 再判断逻辑表达式 直到表达式不成立 |
while(逻辑表达式) { 循环体; } | 如果逻辑表达式成立 执行循环体 执行后再次判断 若还成立则继续执行直到表达式不成立 | switch(变量) { case 常量1:语句体1;break; case 常量2:语句体2;break; (...) default:语句体x;break; } | 将变量与case后的各个常量对比 若有相等,则执行相应的语句体 若没有一个相等,则执行default后的语句体 (default可以不写) |
# 5、模块化
# 5.1 模块化编程
传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等
# 5.2 模块化编程框图
- .h 文件声明函数语句记得加分号;
# 5.3 模块化编程注意事项
- .c文件:函数、变量的定义
- .h文件:可被外部调用的函数、变量的声明
- 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
- 使用到的自定义函数的.c文件必须添加到工程参与编译
- 使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
# 5.4 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 等
# 6、C51的sfr、sbit
sfr(special function register):特殊功能寄存器声明
- 例:sfr P0 = 0x80;
- 声明P0口寄存器,物理地址为0x80
sbit(special bit):特殊位声明
- 例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1;
- 声明P0寄存器的第1位
可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作
# 7、BCD码
- BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数
- 例:0001 0011表示13,1000 0101表示85,0001 1010不合法
- 在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
- BCD码转十进制:DEC=BCD/1610+BCD%16; (2位BCD)
- 十进制转BCD码:BCD=DEC/1016+DEC%10; (2位BCD)