×
关于关于关于1. 如何学习单片机7. LED 点阵的学习13.1602 液晶与串口的应用1.1 学习什么单片机7.1 C 语言变量的作用域13.1 通信时序解析1.2 如何学习单片机7.2 C 语言变量的存储类别13.2 1602 整屏移动1.3 单片机学习的准备工作7.3 LED 点阵的介绍13.3 多个 .c 文件的初步认识1.4 单片机开发环境搭建--Keil uVision4安装教程7.4 LED 点阵的图形显示13.4 单片机计算器实例1.5 Keil uVision4 简单使用教程7.5 LED 点阵的纵向移动13.5 串口通信原理和控制程序第一章问题汇总7.6 LED 点阵的横向移动14. I2C 总线与 EEPROM2. 点亮你的 LED 灯8. 单片机按键14.1 单片机 I2C 时序介绍2.1 单片机内部资源8.1 单片机最小系统解析14.2 I2C 寻址模式2.2 单片机最小系统8.2 C 语言函数的调用14.3 单片机 EEPROM 简介2.3 发光二极管(LED 灯)8.3 C 语言函数的形参和实参14.4 EEPROM 单字节读写操作时序2.4 特殊功能寄存器和位定义8.4 单片机按键介绍14.5 EEPROM 多字节读写操作时序2.5 新建一个工程8.5 ​单片机独立按键扫描程序14.6 EEPROM 的页写入2.6 第一个单片机程序8.6 单片机按键消抖程序14.7 I2C 和 EEPROM 的综合编程2.7 将程序下载到单片机8.7 单片机矩阵按键的扫描15. 实时时钟 DS13023. 单片机硬件基础知识学习8.8 简易加法计算器程序15.1 BCD 码介绍3.1 电磁干扰 EMI9. 步进电机与蜂鸣器15.2 单片机 SPI 通信接口3.2 单片机中去耦电容的应用9.1 单片机 IO 口的结构15.3 实时时钟芯片 DS1302 介绍3.3 三极管的的概念及其工作原理9.2 单片机上下拉电阻15.4 DS1302 的硬件信息3.4 单片机中三极管的应用9.3 电机的分类15.5 DS1302 寄存器介绍3.5 74HC138 三八译码器的应用9.4 28BYJ-48 步进电机原理15.6 DS1302 通信时序介绍3.6 LED 灯闪烁程序9.5 让电机转起来15.7 DS1302 的 BURST 模式4. 流水灯的实现9.6 转动精度与深入分析15.8 C 语言复合数据类型4.1 二进制、十进制和十六进制9.7 电机控制程序基础15.9 单片机电子时钟程序设计4.2 C 语言变量类型和范围9.8 实用的电机控制程序16. 红外通信与温度传感器4.3 C 语言基本运算符9.9 单片机蜂鸣器16.1 红外光的基本原理4.4 C 语言 for 循环语句10. 实例练习与经验积累16.2 红外遥控通信原理4.5 C 语言 while 循环语句10.1 单片机数字秒表程序16.3 NEC 协议红外遥控器4.6 C 语言函数的简单介绍10.2 PWM 的原理与控制程序16.4 温度传感器 DS18B204.7 单片机延时方法10.3 单片机交通灯实例17. 模数转换与数模转换4.8 LED 流水灯程序10.4 51单片机 RAM 区域的划分17.1 A/D 和 D/A 的基本概念5. 定时器与数码管基础10.5 单片机长短按键的应用17.2 A/D(模数转换)的主要指标5.1 逻辑电路与逻辑运算11. UART 串口通信17.3 PCF8591 硬件接口5.2 定时器介绍11.1 单片机串行通信介绍17.4 PCF8591 应用程序5.3 定时器的寄存器11.2 RS232 通信接口17.5 A/D 差分输入信号5.4 定时器的应用11.3 USB 转串口通信17.6 D/A 输出5.5 LED 数码管的介绍11.4 IO 口模拟 UART 串口通信17.7 单片机信号发生器程序5.6 数码管的真值表11.5 UART 串口通信的基本应用18. RS485 通信与 Modbus 协议5.7 数码管的静态显示11.6 通信实例与 ASCII 码18.1 RS485 通信6. 中断与数码管动态显示12. 1602 液晶介绍18.2 Modbus 通信协议介绍6.1 C 语言数组12.1 C 语言变量的地址18.3 Modbus 多机通信程序6.2 C 语言 if 语句12.2 C 语言指针变量的声明6.3 C 语言 switch 语句12.3 C 语言指针的简单示例6.4 数码管的动态显示12.4 C 语言指向数组元素的指针6.5 单片机数码管显示消隐12.5 ​C 语言字符数组和字符指针6.6 单片机中断系统12.6 1602 液晶介绍6.7 单片机中断的优先级12.7 1602 液晶的读写时序介绍12.8 1602 液晶指令介绍12.9 1602 液晶简单显示程序

2.4 51单片机特殊功能寄存器和位定义


接下来的几节,我们会带着大家编写第一个单片机程序。在此之前,我们先来了解一些51单片机特有的程序语法以及 Keil 软件的基本操作步骤,请大家一定要有耐心。

我们主要是用 C 语言来对单片机编程,而有的单片机有那么几条很特殊的独有的编程语句,51单片机就有,先介绍2条。

第一条语句是:sfr P0 = 0x80;

sfr 这个关键字,是51单片机特有的,他的作用是定义一个单片机特殊功能寄存器(special function register)。51单片机内部有很多个小模块,每个模块居住在拥有唯一房间号的房间内,同时每个模块都有8个控制开关。P0 就是一个功能模块,就住在了 0x80 这个房间里,我们就是通过设置 P0 内部这个模块的8个开关,来让单片机的 P0 这8个 IO 口输出高电平或者低电平的。而51单片机内部有很多寄存器,如果我们想使用的话必须提前进行 sfr 声明。不过 Keil 软件已经把所有这些声明都预先写好并保存到一个专门的文件中去了,我们要用的话只要文件开头添加一行#include即可,这个在后边有用法详解。

第二条语句是:sbit LED = P0^0;

这个 sbit,就是对刚才所说的 SFR 里边的8个开关其中的一个进行定义。经过上边第二条语句后,以后只要在程序里写 LED,就代表了 P0.0 口(“^”这个符号在数字键6上边),注意这个 P 必须大写,也就是说我们给 P0.0 又取了一个更形象的名字叫做 LED。

了解了这两个语句后,我们来大概看一下单片机的特殊功能寄存器。请注意,每个型号的单片机都会配有生产厂商所编写的数据手册(Datasheet),所以我们来看一下 STC89C52 的数据手册,从21页到24页,全部是对特殊功能寄存器的介绍以及地址映射列表。我们在使用这个寄存器之前,必须对这个寄存器的地址进行说明。是不是花花绿绿的太多了,记不住啊,这个没关系的,不需要你记住,了解一下,后边大部分我会慢慢给大家解释,少部分需要用到的时候,自己过来查手册就可以了,做技术不是为了应付考试,你可以随时翻阅手册查找你需要的资料。

如图2-7,是截取的手册中第22页最下边的一个表格。

图2-7 IO 口特殊功能寄存器

我们来看一下这个表,其中 P4 口 STC89C52 对标准51的扩展,我们先忽略它,只看前边的 P0、P1、P2、P3 这4个,每个 P 口本身又有8个控制端口。大家可以结合我们的开发板原理图或者图2-1来看,那么这样就确定了我们的单片机一共有32个 IO 口(IO,Input 和 Output,分别是输入和输出)。

其中 P0 口所在的地址是 0x80,一共有从7到0这8个 IO 口控制位,后边有个 Reset Value(复位值),这个很重要,是我们看寄存器必看的一个参数,8个控制位复位值全部都是1。

这就是告诉我们,每当单片机上电复位的时候,所有的引脚的值默认是都是1,即高电平,我们在设计电路的时候也要充分的考虑这个问题。

那么上边那2条语句,我们写 sfr 的时候,必须要根据手册里的这个地址(Add)去写,写 sbit 的时候,就可以直接将一个字节其中某一位取出来。我们编程的时候,也有现成的写好寄存器地址的头文件,我们直接包含该头文件就可以了,不需要逐一去写了。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)