当前位置: 首页 > news >正文

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

#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;
}

http://www.lryc.cn/news/612914.html

相关文章:

  • 数据推荐|标贝科技方言自然对话数据集 构建语音交互新基建
  • 全球化2.0 | 泰国IT服务商携手云轴科技ZStack重塑云租赁新生态
  • 最新教程 | CentOS 7 内网环境 Nginx + ECharts 页面离线部署手册(RPM 安装方式)
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • 如何为WordPress启用LiteSpeed缓存
  • HTML已死,HTML万岁——重新思考DOM的底层设计理念
  • 炫酷圆形按钮调色器
  • Ubuntu 系统 Docker 启动失败(iptables/nf\_tables)
  • 应急响应复现
  • Android 原生与 Flutter 通信完整实现 (Kotlin 版)
  • JPA 分页查询与条件分页查询
  • 《深入理解 WSGI:解锁 Python Web 应用背后的奥秘》
  • Java+Vue合力开发固定资产条码管理系统,移动端+后台管理,集成资产录入、条码打印、实时盘点等功能,助力高效管理,附全量源码
  • 前端性能优化:从请求到资源的精细调控
  • Event Stream输出优化:Vue3节流函数的正确实现
  • 【大前端】vite忽略指定前缀的静态资源
  • 【插件式微服务架构系统分享】之 解耦至上:gateway 网关与APISIX 网关的不同分工
  • 一文解读“Performance面板”前端性能优化工具基础用法!
  • SpringAI
  • 数据结构---循环队列(补充 应用实例)、哈希表(哈希存储、哈希冲突、解决方法、举例实现)
  • Linux Docker 新手入门:一文学会配置镜像加速器
  • 躺平发育小游戏微信抖音流量主小程序开源
  • 透明矿山:科技重塑矿业未来
  • Numpy科学计算与数据分析:Numpy随机数生成入门
  • 光纤滑环 – 光纤旋转接头(FORJ)- 杭州驰宏科技
  • AutoMQ-Kafka的替代方案实战
  • QML与C++交互的方式
  • Kafka数据生产和发送
  • 基于Spring Cloud Stream与Kafka的事件驱动微服务架构设计与实战指南
  • 【Kafka系列】第二篇| Kafka 的核心概念、架构设计、底层原理