一.寄存器点灯
1.1使能 GPIO 时钟
1.2配置 GPIO 输入输出模式
1.1.1输入模式
- 浮空输入:输入浮空(GPIO_Mode_IN_FLOATING),不经过上拉下拉电阻,经过TTL施密特触发器(边沿转换电路),转换成上升沿或者下降沿,在储存在寄存器,供内部读取
- -输入上拉(GPIO_Mode_IPU),输入下拉(GPIO_Mode_IPD),顾名思义,经过上拉或下拉电阻,经过TTL施密特触发器(边沿转换电路),转换成上升沿或者下降沿,在储存在寄存器,供内部读。
- 模拟输入(GPIO_Mode_AIN),直接输入模拟信号,不需要转换,直接输入到内部
1.1.2输出模式
-
开漏输出(GPIO_Mode_Out_OD),输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型 的驱动,其吸收电流的能力相对强(一般20ma以内).
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式 可以把端口 -
开漏复用功能(GPIO_Mode_AF_OD) :复用功能的开漏输出_AF_OD–片内外设功能(TX1,MOSI,MISO.SCK.SS),可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)
-
推挽式输出(GPIO_Mode_Out_PP),可以输出高,低电平,连接数字器件。
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。
- 推挽式复用功能(GPIO_Mode_AF_PP):复用功能的推挽输出 --片内外设功能(I2C的SCL,SDA),可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
1.3 配置输入输出
- 查手册,看初始地址和偏移地址
1.3.1GPIO的主要寄存器
-
每个GPIO端口都有
-两个32位配置寄存器(GPIOx_CRL , GPIOx_CRH) -两个32位数据寄存器(GPIOx_IDR 和 GPIOx_ODR) -一个32位置位/复位寄存器(GPIOx_BSRR) -一个16位复位寄存器(GPIOx_BRR) -一个32位锁定寄存器(GPIOx_LCKR)
-
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)
1.3.2端口配置
-
端口配置低寄存器(GPIOx_CRL)
-
端口配置高寄存器(GPIOx_CRH)
-
端口输入数据寄存器(GPIOx_IDR)
-
端口输出数据寄存器(GPIOx_ODR)
二.中断(以52为例)
2.1 中断系统示意图(51)
2.2中断查询次序
2.3 中断服务函数
2.4 中断相关寄存器
2.4.1 IE中断允许寄存器和XICON辅助中断控制寄存器(可位寻址)
- EA:CPU总中断允许控制位,EA = 1开放中断,EA = 0,屏蔽中断请求。形成两级控制,即:受EA总控制,又受个各断源自己的中断允许控制
- ET2:定时/计数器T2的溢出中断允许位,ET2 = 1,允许T2中断。ET2 = 0,禁止T2中断。
cpu运行,和定时器是并行进行的.。cpu在工作中,得到了定时中断,那么它停止手头的工作去中断请求中服务,完成服务,返回原来的断点位置继续工作 - ES:串口一中断允许位。ES = 1,允许中断。
- ET1:同上T1
- EX1:外部中断允许位
- ET0:同上T0
- EX0:外部中断0
- PX3:置位表明外部中断3的优先级为高。
- EX3:置1,允许外部中断3中断
- IE3:外部中断3中断请求标志位,由硬件自动清零。
- IT3:外部中断3,中断源类型选择。IT3 = 0,低电平触发。IT3 = 0,下降沿触发。
- PX2:同上
- EX2:同上
- IE2:同上
- IT2:同上
2.4.2 TCON 定时器/计数器0/1控制寄存器(可位寻址)
- TF1:T1溢出中断标志位。
T1允许计数后,从初值开始加1计数,溢出后,由硬件置1。然后TF1向CPU请求中断,CPU响应中断时,才由硬件置0.(也可由软件查询置0) - TR1定时器1的运行控制位
- TF0:同上
- TR0:同上
- IE1:外部中断0,请求源标志(INT0/P3.2),IE1 = 1,请求中断。响应时由硬件清0.
- IT1:外部中断1,中断源类型选择。IT1 = 0,低电平触发。IT1 = 0,下降沿触发。
- IE0:同上
- IT0:同上
2.4.3 SCON 串行口控制寄存器(可位寻址)
- RI:串行口1接收中断标志,RI = 1 ,表示正向CPU申请中断,RI必须由中断服务程序清0
- TI:串行口1发送中断标志,同上。
- 其它位与中断无关。
2.4.4 T2CON 定时器/计数器2控制寄存器(可位寻址)
- TF2:定时器2溢出标志,溢出时置位,必须由软件清除。当TCLK/RCLK = 1时,将不会置位。
- EXF2:定时器2外部标志,EXEN2 = 1 且T2EX的负跳变产生捕获或重装时,置位。定时器2中断使能时,EXF2 = 1将使CPU执行中断子程序。必须由软件清0。在递增/递减计数器模式(DCEN = 1),EXF2不会引起中断
- RCLK:接收时钟标志。RCLK = 1,将定时器2溢出脉冲作为作为串行口模式1和模式3的接收时钟。RCLK = 0,将定时器1的溢出脉冲作为接收时钟。
- TCLK:发送时钟标志。同上。
- EXEN2:定时器外部使能标志。
- TR2:定时器2启动/停止控制位。
- C/T2:定时器/计数器选择。(定时器2),0表示内部定时器,1表示外部事件计数器(下降沿触发)
- CP/RL2:捕获/重装标志。置位:EXEN2 = 1时,T2EX的负跳变,产生捕获。清0:EXEN2 = 0时,定时器2溢出或T2EX的负跳变,都可使定时器自动重装。当RCLK/TCLK = 1 时,该位无效,且定时器强制为溢出时自动重装。
2.4.5 中断优先级控制器IP,IPH,XICON
2.5 应用举例,相关寄存器配置中断
#include<REG52.H>
#include"delay500ms.h"
#include"int0.h"
sbit LED = P1^1;
//中断
void int0_init(){
EA =1;//开启总中断
EX0 = 1;//开启EX0外部中断
IT0 = 1;//低电平触发方式
}
//中断服务函数
void int0() interrupt 0
{
LED = 0;
Delay500ms();
LED= 1;
}
三.定时器配置
3.1定时器/计数器0/1的相关寄存器
3.1.1 定时器/计数器控制计数器TCON
- 见中断TCON,一样
3.1.2 定时器/计数器工作模式寄存器TMOD(不可位寻址)
3.1.3 TH0,TH1,TLO,TL1
- TH0,TH1,TH0,TL1,用来计数的寄存器,两两配合(TH0和TH0,TH1和TH1),分别表示高八位和低八位
3.2 应用(可以使用STC-ISP辅助设置)
#include<REG52.H>
#include"delay500ms.h"
#include"Timer0.h"
sbit LED = P1^1;
//配置定时器
void Timer0_Init(){
TMOD &= 0xF0; //高四位不变,低四位置1
TMOD |= 0x01; //高四位不变,末尾置1 XXXX 0001
TF0 = 0; //手动关闭中断溢出标志位,防止一开始就发生中断
TR0 = 1;//开启定时器0
//2的16次方位65536,计数1000等于1us,所以每触发一次中断,从64535到65535计数1000次,计时1ms。
TH0 = 64535/256;//TCON高八位
TL0 = 64535%256;//TCON低八位
ET0 = 1; //打开定时器/计数器中断0
EA = 1; //打开总中断
PT0 = 1; //中断优先级
}
//中断服务函数
void Tmer0_Routine() interrupt 1
{
static unsigned int T0Count = 0;
TH0 = 64535/256;//高八位
TL0 = 64535%256;//低八位
T0Count++;
if(T0Count >= 1000){
LED = 0;
Delay500ms();
LED= 1;
T0Count = 0;
}
}
四.串行口通信
4.1 常用通信接口比较
4.2 51单片机UART
4.3串口相关寄存器
4.3.1 串口控制寄存器SCON和PCON
4.3.2 其它
- 参考中断
4.4 应用
#include<REG52.H>
#include"uart.h"
//串口初始化
void Uart_Init(){
PCON |= 0x80;//配置波特率加倍
SCON = 0x50;//配置串口控制寄存器
//配置T1定时器
TMOD = 0; //高四位清零,低四位不变 0000 xxxx
TMOD |= 0x20; //0010 xxxx
TR1 = 1;//打开定时器1
TL1 = 0xF4;//用计数器,配置波特率,这里是配的4800
TH1 = 0xF4;
ET1 = 0; //打开定时器1中断
ES =1;//打开串口控制
EA = 1;//打开总控制
}
//串口发
void UART_SendByte(unsigned char Byte){
SBUF = Byte;
while(TI == 1){
TI =0;
}
}
//中断服务函数,读取数据
void UART_Rountine() interrupt 4 {
if(RI == 1){
P1 = SBUF;
UART_SendByte(SBUF);
RI = 0;
}
}
五. LCD 1602显示屏
一.概述
1.1 LCD 1602 ( Liquid Crystal Display)
液晶显示屏,是一种字符型液晶显示模块。可以显示ASCll码的标准字符和其它一些内置特殊符号。还可以有8个自定义字符。
1.2 显示容量:
16 X 2 个字符,每个字符为5*7点阵。
1.3 引脚功能
1.4 字符显示流程
1.5 指令集
1.6 操作时序图
二.显示一个字符
2.1 LCD 1602 操作流程
- 指令初始化
1. 发送指令0x38,八位数据接口,两行显示,5*7点阵
2. 发送指令0x0C,显示开,光标开,闪烁关
3. 发送指令0x06,数据读写操作后,光标 自动加1,画面不动
4. 发送指令0x01,清屏 - 显示字符
1. 0x80|AC,设置光标位置
2. 发送数据 ,发送要显示的字符数据
3. …