单片机C语言实例:23、串口通讯

2023-09-16 08:51:50

一、轮询发送

程序实例1:


#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        
#include"delay.h"
/*------------------------------------------------
                   函数声明
------------------------------------------------*/
void SendStr(unsigned char *s);
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    //ES    = 1;                  //打开串口中断
}                            
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{

	InitUART();

    while (1)                       
    {
		SendStr("UART test!");
		DelayMs(240);//延时循环发送
		DelayMs(240);
    }
}

/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
		TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
	while(*s!='\0')// \0 表示字符串结束标志,
                //通过检测是否字符串末尾
	{
		SendByte(*s);
		s++;
	}
}

二、中断收发

程序实例2:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        

/*------------------------------------------------
                   函数声明
------------------------------------------------*/
void SendStr(unsigned char *s);

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
   // ES    = 1;                  //打开串口中断
} 

                           
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{

	InitUART();

	SendStr("UART test!");

	ES    = 1;                  //打开串口中断
	while (1)                       
    {
    
    }
}

/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
		TI = 0;
}

/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
	while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
	{
		SendByte(*s);
		s++;
	}
}

/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量 
   
	if(RI)                        //判断是接收中断产生
    {
		RI=0;                      //标志位清零
		Temp=SBUF;                 //读入缓冲区的值
		P1=Temp;                   //把值输出到P1口,用于观察
		SBUF=Temp;                 //把接收到的值再发回电脑端
	}
	if(TI)                        //如果是发送标志位,清零
		TI=0;
} 

更多推荐

【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署

【Redis】Redis常见面试题(3)文章目录【Redis】Redis常见面试题(3)1.特性&应用场景1.1Redis能实现什么功能1.2Redis支持分布式的原理1.3为什么Redis这么快1.4Redis实现分布式锁1.5Redis作为缓存2.数据类型2.1Redis常用的数据类型有哪些2.2有序列表的底层是如

java 入门-使用eclipse、javaFX、SceneBuilder进行图形界面开发

个人是一直在开C#CS端开发,目前公司的软件基本都使用了java作开发。为了更好适应环境,我也只能再次学习这个陌生的开发工具。java的开发界面非常不友好,对于我这样的初学者只能是借助插件来进行界面与后台联动,上网度娘了好多资料,java的开发环境非常不易构建特别是需要辅助界面设计的。谨以我这么多天的摸索经历来作下小记

高通recovery流程分析(编译、界面、图片)

目录recovery界面菜单recovery界面操作recovery启动流程recovery编译makefilerecovery图片大小ramdisk、boot.img、recovery.img之间的关系authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主recovery界面菜单rec

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.2 完成整体布局

本章要实现的整体效果如下:在讲解实际的事件之前,本节先把整体布局搭建好。布局整体包括左侧的导航和右侧的主窗体1.新建工程新建一个窗口类MainWidget,继承自QWidget,并且取消“Generateform”复选框也就是不使用UI设计师界面拖拽控件,而是纯代码来实现界面。最终新建工程如下:此时,直接运行是一个空白

超越创意,从用户创造内容到AI生成内容的新时代

在这个信息爆炸的时代,内容创作正经历前所未有的变革,其频率和多样性令人瞠目结舌。曾经,我们主要依赖传统媒体,需要专业团队为人们打造内容,这被称为专业生成内容(PGC,Professional-generatedContent)。但随着互联网的广泛渗透,用户生成内容(UGC,User-generatedContent)逐

【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:新增查看历史记录窗口!语音播报功能!修复预览文件按钮等之前版本的bug!

文章目录前言一、实现思路二、关键代码查看历史记录按钮语音播报按钮三、完整代码总结前言老生常谈,先看效果:(订阅专栏可获取完整代码)初始状态下,我们为除了【设置】外的按钮添加弹窗,提示用户在使用工具之前要先【设置】。在设置界面,我们主要修改了【预览文件】按钮,从之前的只预览前5条变为预览文件全部内容,但是内容是只读的。同

SCRUM产品负责人(CSPO)认证培训课程

课程简介Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架。产品负责人是Scrum的三个角色之一,产品负责人在Scrum产品开发当中扮演舵手的角色,他决定产品的愿景、路线图以及投资回报,他需要回答为什么做,以及做什么的问题。在两天的ScrumProductOwner认证课程中,我们将和

盘点数字人源头厂商哪家公司OEM定制能力好!

在当今的科技盛世,我们与数字人的互动越来越频繁。无论是在工作中的智能助手,还是数字人播,数字员工,还是在生活中的个性化推荐,数字人都在为我们的生活增添色彩。然而,大家可能并未意识到,这些数字人背后的源头——数字人源头厂家,数字人源头厂商,数字人源头公司,正是在默默推动着人工智能(AI)的发展。数字人技术源头厂商主要负责

六、不root不magisk不xposed lsposed frida原生修改定位

系列文章目录第一章安卓aosp源码编译环境搭建第二章手机硬件参数介绍和校验算法第三章修改安卓aosp代码更改硬件参数第四章编译定制rom并刷机实现硬改(一)第五章编译定制rom并刷机实现硬改(二)第六章不root不magisk不xposedlsposedfrida原生修改定位第七章安卓手机环境检测软件分享第八章硬改之设

论文阅读《2022WWW:Rethinking Graph Convolutional Networks in Knowledge Graph Completion》

论文链接论文工作简介KCN在建模图结构方面很有效。基于GCN的KGC模型通常使用编码器-解码器框架,GCNs和KGE模型分别充当编码器和解码器。许多基于GCN的KGC模型虽然引入了额外的计算复杂度,但未能超越最先进的KGE模型?作者发现GCNs中的图结构并没有对KGC的性能有显著提升,相反实体表示的转换为性能带来提升。

Vue 组件的单元测试

1、基本的示例单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他开发者理解你的组件的作用。这是一个判断一些文本是否被渲染的简单的示例:<templ

热文推荐