中断系统
1.什么是中断
当CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断
2.为什么要设置中断系统
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的
3.中断优先级:在执行中断的过程中,如果外界又发生一次中断,比较中断优先级,优先处理优先级高的中断
4.外部中断:引脚电平变化所引发的中断(P3_2由高电平变为低电平 触发中断)
3.中断的执行流程是什么?
中断源发出中断请求;
CPU检查该中断源是否被屏蔽,处理器内核是否允许处理中断;
查询中断优先级;
保护现场;
执行中断服务函数;
恢复现场;
4.中断源
51单片机只有前五个中断源,优先级自上而下
外部中断0, 定时器0, 外部中断1, 定时器1, 串口通信
中断向量表
中断向量表是一个函数指针数组,在内存中有固定的存储单元地址,每个地址对应一个中断源的中断服务程序入口,当中断源触发中断时,CPU会自动跳转到该中断源在向量表中对应的固定地址
51单片机外设
1.GPIO类
ds18b20,DHT11,HCSR04
2.ADC类
MQ系列,气体浓度,烟雾浓度
3.I2C
MPU6050六轴加速度传感器
MAX301000血氧浓度传感器
BH1750光照强度传感器
SPI类
ADXL345三轴加速度传感器
UART类
GPS传感器
三大总线
地址总线:专门用于传输地址信息,由CPU单向传输,指向内存和外设
数据总线:CPU和内存/外设双向传输
控制总线:CPU向内存/外设发出指令,内存/外设向CPU反馈状态
GPIO
通用输入输出端口,51单片机与外界交互最基本的方式
引脚:两种模式 输入模式 输出模式
输出功能:引脚独立去输出一个高电平(5V)/低电平(0V)
输入功能:检测引脚电平状态 按键
PWM
脉冲宽度调制
高电平所占的总周期的比例叫占空比
有源蜂鸣器---接入直流电就可以发声,只能发出固定频率的声音
无源蜂鸣器---需要脉冲信号,不同频率不同音调 源->震荡源
通信方式
单工:两个主机之间通过一根数据线进行传输,发送方和接收方是固定的,数据传输方向是固定的
半双工:两个主机之间通过一根数据线进行传输,通信的双方既可以作为发送方也可以作为接收方,数据的传输方向是双向的
全双工:两个主机之间通过两根线进行传输,通信的双方既可以作为发送方也可以作为接收方,数据的传输方向是双向的
串行:传输数据时通过一根线实现,需要按照1个bit1个bit的次序先后传输(资源消耗小->1根线,传输速度慢)
并行:多个bit在多根数据线上同时进行传输(传输速度快,资源消耗大,需要多根线)
串口通信-全双工串行通信
TTL工作流程
①空闲时数据线为高电平
②发送一个低电平表示起始位
③发送的第一个比特是最低位(最右边)
④校验位分为奇校验,偶校验和无校验
⑤为保证下一个字节发送前的起始位能够表现出来,校验位之后发送一个停止位1
串口通信时序
起始位+数据位(8bit)+校验位(奇偶校验)+停止位
波特率bps:每秒传输的bit数量
9600,n,8,1 9600bps,无校验,8位数据位,1位停止位
同步和异步
串口通信通过波特率实现同步
I2C通过时钟线实现同步
UART
通用异步收发器
代码
中断寄存器配置
1.IE寄存器:中断控制寄存器
EA(B7):手动置1,代表CPU响应所有的中断
EX0(B1):手动置1,代表允许外部中断0产生中断
2.TCON寄存器 定时器控制寄存器
IT0(B0):置1,代表外部中断0(P3_2)在下降沿触发中断
main.c
#include <reg51.h>
#include "led.h"
void init_eint(void)
{P3 |= (1 << 2) | (1 << 3);IE |= (1 << 7) | (1 << 0) | (1 << 2);TCON |= (1 << 0) | (1 << 2);
}void eint0_handler(void) interrupt 0
{Led_Allon();
}void enin1_handler(void) interrupt 2
{Led_Alloff();
}
int main(void)
{init_eint();Led_Init();while (1){}
}
led.c
#include <reg51.h>void Led_Init(void)
{P2 = 0xFF;
}void Led_Allon(void)
{P2 = 0;
}void Led_Alloff(void)
{P2 = 0xFF;
}
PWM控制蜂鸣器
蜂鸣器以400HZ工作时
代码
timer.c
#include "timer.h"
#include "led.h"
#include <reg51.h>
unsigned int g_t = 0;void Timer0_Handler(void) interrupt 1 //定时器0中断服务函数
{ P2 ^= (1 << 1); //指定位翻转TH0 = 64383 >> 8; //高位TL0 = 64383; //低位
}
void Timer0_Init(void) //定时器0初始化
{IE |= (1 << 7) | (1 << 1);//打开中断总控制和T0溢出中断//初始化定时器寄存器TMOD &= ~(0x0F << 0);TMOD |= (1 << 0);TH0 = 64383 >> 8;TL0 = 64383;TCON |= (1 << 4);
}
main.c
#include "timer.h"
#include "led.h"
#include "key.h"
int main(void)
{ Timer0_Init();while (1){ } return 0;
}