51单片机快速入门之中断的应用 2024/11/23 串口中断

51单片机快速入门之中断的应用 

基本函数:

 void T0(void) interrupt 1 using 1

{

这里放入中断后需要做的操作

}

void T0(void):

这是一个函数声明,表明函数 T0 不接受任何参数,并且不返回任何值。


interrupt 1:

这是关键字和参数,用于指定这个函数是一个中断服务例程,其中 1 表示中断号。不同的中断号对应不同的中断源.


using 1:

这是另一个关键字和参数,用于指定该中断服务例程使用的工作寄存器组。

在一些微控制器中,允许程序员在中断服务例程中使用不同的工作寄存器组,以避免与主程序中的寄存器冲突。这里的 1 表示使用第1个工作寄存器组


中断号解释:  interrupt

  1. 外部中断0 (INT0)         中断号0
  2. 定时器/计数器0 (T0)    中断号1
  3. 外部中断1 (INT1)         中断号2
  4. 定时器/计数器1 (T1)    中断号3
  5. 串行口中断 (串行I/O)   中断号4

使用中断前必要的设置:

串行通信控制寄存器 SCON 简称:串口控制      图片来源于网络

多机通信控制位 (SM2)
SM2 位主要用于多机通信模式(方式2和方式3)。它的功能如下:

方式0:SM2 必须为0。
方式1:SM2 不使用。


方式2和方式3:

如果 SM2 为0,无论接收到的第9位数据(RB8)是什么,
都会将前8位数据送入接收缓冲区 SBUF 并产生中断请求。

如果 SM2 为1,只有当接收到的第9位数据(RB8)为1时,
才会将前8位数据送入接收缓冲区 SBUF 并产生中断请求;否则,丢弃前8位数据。

 REN:是串行接收允许位

                                        1时:允许串行接收  

                                        0时:禁止串行接收  

  • REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
快速理解参考:

SM0 SM1 串行通信 模式选择 ,参考前面文章中的传送门

关于 通信模式 设置 的资料 传送门

TI = 1; 表示数据 发送成功     一帧数据   触发中断处理 之后需要手动 =0

RI =1; 表示数据 接收成功      一帧数据   触发中断处理 之后需要手动 =0

复习拓展:
一帧数据的组成
  1. 起始位(Start Bit)
    • 通常是一个低电平(0),用于标记数据传输的开始。
    • 起始位的宽度通常是一个比特时间。
  2. 数据位(Data Bits)
    • 通常包含8位数据,但也可能是5位、6位、7位或9位。
    • 数据位是实际要传输的有效数据。
  3. 校验位(Parity Bit)(可选):
    • 用于检测传输过程中是否发生错误。
    • 校验位可以是奇校验或偶校验。
    • 奇校验:数据位中1的个数加上校验位后为奇数。
    • 偶校验:数据位中1的个数加上校验位后为偶数。
  4. 停止位(Stop Bit)
    • 通常是一个高电平(1),用于标记数据传输的结束。
    • 停止位的宽度可以是一个或两个比特时间。


 51单片机快速入门之串口中断的应用 

举例说明:通过 串口控制1602 显示文字

1602驱动代码(省略),不会写的参考 之前的文章.
串口通信原理:
  • 接收:

RXD串口信息过来,当接收到起始信号,SCON寄存器将打开接收,允许接收,通过T1 计数器/定时器 来产生移位脉冲 由低位到高位传入 移位寄存器,再 传输到SBUF(数据缓冲器) 中 中断后可取出其中内容

串口初始化

  1.  SCON = 0x50;:设置串口工作方式 1(8 位数据,1 位停止位)。
  2.  PCON = 0x00;:不使用倍速模式。

配置 T1 计数器/定时器  

  1. 定时器初始化

    • TMOD = 0x20;:设置定时器 1 为模式 2(8 位自动重装)。
    • TH1 = 0xA0;                                                                                                         设置初值,计算公式为 256 - (晶振频率(晶振频率需要转换成 Hz(赫兹)1 MHz 等于 (10^6) Hz) / 12 / 波特率)。对于 11.0592 MHz 的晶振和 9600 bps 的波特率,初值为 0xFD。1 MHz 等于 (10^6) Hz  11.0592x10^6 =11059200  11059200/12/9600=96  256-96=160   1010 0000 A0
    •  TL1 = 0xA0;
    • TR1 = 1;:启动定时器 1。
  • 发送:

只需要把数据写入SBUF中即可发送

        串口中断代码:


#include <STC89C5xRC.H>

#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit rs = P3^3;
sbit rw = P3^4;
sbit ep = P3^5;

BYTE  *rr= "WELCOME!1602";
BYTE  *rt= "2024/11/24";
void delay(BYTE ms);    //延时
void lcd_wdat(BYTE dat);//因为不能在声明前使用,这里声明一下函数1602 输出
void lcd_pos(BYTE pos);
void lcd_wcmd(BYTE cmd);

void Uart1_Init(void)	//9600bps@18.432MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF6;			//设置定时初始值
	TH1 = 0xF6;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
}






void delay(BYTE ms)
{

    while(ms--);
}



void lcd_wcmd(BYTE cmd)
{


    rs = 0;
    rw = 0;
    ep = 1;

    P0 = cmd;
    delay(500);
    ep = 0;

}



void lcd_wdat(BYTE dat)
{


    rs = 1;
    rw = 0;
    ep = 1;
    P0 = dat;
    delay(500);
    ep = 0;

}

lcd_init()
{

    lcd_wcmd(0x3c);
    delay(50);
    lcd_wcmd(0x0f);
    delay(50);
    lcd_wcmd(0x01);
    delay(50);

}

int main(void)
{

	unsigned char dtt=33;
    P10=0;
    lcd_init();
    lcd_wcmd(0x01);
    delay(50);
    lcd_wcmd(0x80);

    while(*rr) {
        lcd_wdat(*rr);

        rr++;
    }



    lcd_wcmd(0xc0);
    while(*rt) {
        lcd_wdat(*rt);

        rt++;
    }


		Uart1_Init();


    
				
			SBUF=dtt;
				while(TI==0);
				TI=0;
				
		

}

    发现电脑串口无法识别单片机发出的信息2024/11/26

 

                  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/926206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】聊聊@EventListener注解原理

1.一个Demo出发 在平时的开发中&#xff0c;其实编写同步线程代码是比较容易的&#xff0c;但是如何将一些操作和另外一些操作进行解除耦合&#xff0c;而事件方式 是一种很好的解耦合方式&#xff0c;比如当一个用户注销一个APP之后&#xff0c;需要发送一些短信 让他引流回来…

【和春笋一起学C++】使用new创建动态数组

目录 1. 什么是动态数组 2. 怎么使用动态数组 1. 什么是动态数组 char name[20]; 上面这种方式创建的数组在程序编译时将为它分配内存空间&#xff0c;不管程序最终是否使用数组&#xff0c;数组都在那里&#xff0c;它占用了内存空间。在编译时给数组分配内存被称为静态联编…

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

ECharts柱状图-极坐标系下的堆叠柱状图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

Android复习简答题

一、基础入门 Android程序架构 &#xff08;1&#xff09;app:用于存放程序的代码和资源等内容。包含很多子目录 libs:存放第三方jar包 src/androidTest&#xff1a;存放调试的代码文件 src/main/androidMainfest.xml 整个程序的配置文件&#xff0c;可配置程序所需要的权…

PaddleOCR:一款高性能的OCR工具介绍

一、引言 随着人工智能技术的不断发展&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在各行各业得到了广泛应用。OCR技术能够将图片、扫描件等非结构化数据中的文字信息提取出来&#xff0c;转换为可编辑的文本格式。在我国&#xff0c;百度开源了一款优秀的OCR工具…

HTML5好看的音乐播放器多种风格(附源码)

文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&…

11、数组

1、数组概念 数组就是存储多个相同数据类型的数据。 比如&#xff1a;存储26个字母&#xff0c;存储一个班级的学生成绩。 2、数组使用 数组要遵循先定义再使用 2.1、数组定义的格式 存储数据---空间 ---- 数据类型 多少个 --- 数据个数 >> 数据类型 数…

C底层 函数栈帧

文章目录 一&#xff0c;什么是寄存器 二&#xff0c;栈和帧 前言 我们在学习c语言程序的时候&#xff0c;是不是有很多的疑问&#xff0c;如 1&#xff0c;为什么形参不可以改变实参 2&#xff0c;为什么我们编写程序的时候会出现烫烫烫......这个乱码 3&#xff0c;那些局…

MATLAB期末复习笔记(二)

三、MATLAB函数和程序结构 1.MATLAB文件 两种类型的M文件&#xff1a; • 脚本 &#xff0c;不接受输入参数或返回输出参数。它们处理工作区中的数据。 • 函数 &#xff0c;可接受输入参数&#xff0c;并返回输出参数。内部变量是函数的局部变量。 ① 函数文件是另一类 m 文…

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

2025年Java面试八股文大全

很多人会问Java面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 而且&#xff0c;我国的八股文确…

JiaJia-CP-1,2,3的WP(2)

一.JiaJia-CP-2 一看题目&#xff0c;聊天软件&#xff0c;用的什么聊天软件直接userassist看运行过什么程序 vol -f JiaJia_Co.raw --profileWin7SP1x64 userassist 发现Telegram.exe(小飞机) 可能性很大啊(真是个摸鱼大神) 除此之外&#xff0c;filescan也能看到&#xff0…

小F的矩阵值调整

问题描述 小F得到了一个矩阵。如果矩阵中某一个格子的值是偶数&#xff0c;则该值变为它的三倍&#xff1b;如果是奇数&#xff0c;则保持不变。小F想知道调整后的矩阵是什么样子的。 测试样例 样例1&#xff1a; 输入&#xff1a;a [[1, 2, 3], [4, 5, 6]] 输出&#xff1a…

Docker Buildx 与 CNB 多平台构建实践

一、Docker Buildx 功能介绍 docker buildx 是 Docker 提供的一个增强版构建工具&#xff0c;支持更强大的构建功能&#xff0c;特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。 1.1 主要功能 多平台构建支持 使用 docker buildx&#xff0c;可以在单台设备上构建…

uni-app 使用笔记

1.缓存用法 &#xff08;1&#xff09;uni-app 存值取值删除 官网&#xff1a;https://uniapp.dcloud.net.cn/api/storage/storage.html#setstorage 存值 uni.setStorageSync(storage_key, hello);取值 uni.getStorageSync(storage_key)删除 uni.removeStorageSync(storag…

Unity的GPU Instancing技术

首先新建一个场景&#xff0c;添加一个相机&#xff0c;并创建一个Render Texture给相机。 然后在相机上挂载以下脚本TestBatches &#xff0c;同时脚本的Inspector面板的Mesh中选择Cube&#xff0c;另外创建一个新的材质拖动给mat&#xff1a; public class TestBatches : M…

你真的会用饼图吗?JVS-智能BI饼图组件深度解析

在数据可视化的世界里&#xff0c;饼图是我们常见的一种可视化图形。在JVS-智能BI中提供了数据可视化饼图组件&#xff0c;接下来我通过这篇文章详细介绍&#xff0c;从配色方案到图形配置&#xff0c;从显示数据到提示信息&#xff0c;饼图的每一个细节配置。 饼图类图表概述…

IOS ARKit进行图像识别

先讲一下基础控涧&#xff0c;资源的话可以留言&#xff0c;抽空我把它传到GitHub上&#xff0c;这里没写收积分&#xff0c;竟然充值才能下载&#xff0c;我下载也要充值&#xff0c;牛&#xff01; ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…

golang debug调试

1. 本地调试 1&#xff1a;Add Configurations 添加配置文件&#xff08;Run kind &#xff1a;Directory&#xff09; 2&#xff1a;进入run运行窗口 3&#xff1a;debug断点调试模式 1. Resume Program (继续运行) 图标: ▶️ 或 ► 快捷键: F9&#xff08;Windows/Linux&a…