51单片机

中断系统

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

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#include "timer.h"
#include "led.h"
#include "key.h"
int main(void)
{ 
	Timer0_Init();
	
	while (1)
	{	
	}	
	return 0;
}