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

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

 

                  


http://www.kler.cn/a/415101.html

相关文章:

  • 【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验
  • 挂载本地目录到k8s的pod实现持久化存储
  • 【人工智能】从零构建一个文本分类器:用Python和TF-IDF实现
  • Ubuntu问题 -- 使用scp将本机文件传输至ubuntu服务器中
  • 网络原理->DNS协议和NAT协议解
  • 路面交通工具和个数识别,支持YOLO,COCO,VOC三种格式,带标注可识别自行车,摩的,公共汽车,装载机,面包车,卡车,轿车等
  • AI+云环境开发上线项目全流程(sealos)
  • 111PHP 循环 - For 循环
  • [论文阅读-综述]Supervised Speech Separation Based on Deep Learning: An Overview
  • 【智能制造-43】机器人导出的轴配置问题
  • 数据库操作、锁特性
  • Java核心技术详解:Stream实例化全攻略
  • ThinkPHP Nginx 重写配置
  • 从0开始深度学习(31)——循环神经网络
  • 103.【C语言】数据结构之建堆的时间复杂度分析
  • Redis 字符串(String)
  • 前端开发项目中实现极佳的过渡动画效果
  • uniapp input只输入一个字符就自动失去焦点
  • Vue 3 学习文档(一)
  • ais_server 学习笔记
  • 列表上移下移功能实现
  • Qt Graphics View 绘图实例
  • C0034.在Ubuntu中安装的Qt路径
  • 构建现代Web应用:FastAPI、SQLModel、Vue 3与Axios的结合使用
  • linux系统中常用文件日常使用命令记录
  • 架构第十四章:zabbix-4