51单片机串口通信
串口发送功能的实现一、配置SCON串行口控制寄存器1.REN:允许/禁止串口接收控制位2.SM00、SM11选择通讯方式一3.TI0、RI0发送接收中断标志位每次发送后必须手动清零二、配置PCON电源控制寄存器SMOD:波特率选择位SMOD1使方式一二三波特率加倍默认为0波特率越低 越稳定、越抗干扰、越不容易出错但速度越慢三、配置定时器串口发送时中断不需要配置只需要配置定时器1并选择波特率串口需要八位自动重装不再是十六位65535因为十六位要每次赋初值会占用时间导致误差串口通信要双八位更精准计数值变为0-255256次计数255后还要加一位才溢出1.在这里我们先对特殊功能寄存器TMOD高四位清零低四位置默认TMOD0x0F再设置高四位GATE0C/~T0M1、M010八位重装模式TMOD|0x202.然后再设置定时器初值和是否倍速波特率这里选倍速也就是PCON | 0x80然后我们这里是八位自动重装模式不需要每次溢出重新赋初值只需要把高低位都设置成我们的初值就好TL10xF4;TH10xF4;波特率计算我们这里初值为0xF4,换算为十进制就是244256-24412也就是每次溢出经过12次计数12个1.085us每次溢出时间12*1.08506944413.020833328溢出率1/每次溢出时间0.07680000003145728MHZ注意我们这里是波特率倍速所以不用除2直接除16就好波特率溢出率/164800.00000196608HZ≈4800HZ是不是几乎没有误差如果是12MHZ晶振就会算出是4807.69MHZ,而且波特率越高误差就会越大3.ET10;禁止定时器中断这里不需要4.TR11:启动定时器1void Uart1_Init(void) //4800bps11.0592MHz { PCON | 0x80; //使能波特率倍速位SMOD SCON 0x50; //8位数据,可变波特率 AUXR 0xBF; //定时器时钟12T模式 AUXR 0xFE; //串口1选择定时器1为波特率发生器 TMOD 0x0F; //设置定时器模式 TMOD | 0x20; //设置定时器模式 TL1 0xF4; //设置定时初始值 TH1 0xF4; //设置定时重载值 ET1 0; //禁止定时器中断 TR1 1; //定时器1开始计时 }当然也可以使用STC-ISP的波特率计算器自动生成初始化代码连配置都省了四、串口发送函数我们直接将数据写入SBUF即可在写入后加上whlie判断检测发送是否完成防止一直发送卡住在发送后手动将发送标志位TI清零//串口发送一个字节数据范围0-255 void UART_SendByte(unsigned char Byte) { SBUFByte; //写入SBUF实现数据发送 while(TI0); //发送结束检测防卡死 TI0; //发送检测位清零 }五、主函数调用当我们需要连续发送信息时在while循环中调用的时候要每次发送后延时否则会由于发送过快发送错误信息比如从66变为99要想控制信息发送速度也可以通过延时函数粗略控制void main() { Uartl Init (); //初始化 while(1) { UART_SendByte (0x66); //串口发送函数 Delay100; //延时防止连续发送过快产生发送乱码 } }程序编译烧录后打开串口选择HEX模式可以看到如果我们选择文本模式那么显示的就会是数字编码后也就是字符原本的样子六、串口发送模块化串口发送可以模块化为.c.h文件方便以后调用记得养成注释的好习惯但是接下来讲的接收中断依赖于串口中断和主函数耦合性较强就没法模块化了串口接收功能的实现一、串口初始化其他都和发送一样只需要改动几个点1.确保串口接收使能位为打开状态SCON的第四位置1也就是让SCON0x50其实我们在发送时也是打开的这里就不用改了2.打开串口中断EA1(启动中断总开关),ES1(打开串口中断)void Uart1_Init(void) //4800bps11.0592MHz { PCON | 0x80; //使能波特率倍速位SMOD SCON 0x50; //8位数据,可变波特率 AUXR 0xBF; //定时器时钟12T模式 AUXR 0xFE; //串口1选择定时器1为波特率发生器 TMOD 0x0F; //设置定时器模式 TMOD | 0x20; //设置定时器模式 TL1 0xF4; //设置定时初始值 TH1 0xF4; //设置定时重载值 ET1 0; //禁止定时器中断 TR1 1; //定时器1开始计时 EA1; ES1; //接收数据需要开启中断 }二、中断函数我们在技术手册查询到中断号小尾巴为interrupt 4那中断函数我们命名为void UART_Routine()interrupt 4函数名可以随便起只要带上空格中断号小尾巴就是中断函数啦主函数空循环即可这样我们就实现了电脑命令控制LED了void UART_Routine() interrupt 4 //中断函数头 { if(RI1) //发送完成进入后续 { P2SBUF; //使用串口写入SBUF的数据控制LED发送需要手动写入SBUF,接收时电脑会直接写入不需要我们操作 UART_SendByte(SBUF); //在中断里将串口收到的数据发出 RI0; //将接收检测位手动置零发送位我们在函数中置零就好啦 } }

相关新闻

一、点亮8个LED流水灯(数组、位移)

一、点亮8个LED流水灯(数组、位移)

文章目录1、点亮8个蓝色LED灯1.1效果图1.2代码块2、实现8个蓝色LED流水灯数组方式2.1效果图2.2代码块3、实现8个蓝色LED流水灯位移方式3.1效果图3.2代码块4、小灯闪烁4.1效果图4.2代码块1、点亮8个蓝色LED灯 1.1效果图 1.2代码块 #include <reg51.h> // 包含头文件 s…

2026/7/21 22:47:39 阅读更多 →
为什么你的AI产品突然被下架?——开源模型商用许可失效的7个隐蔽信号(含GitHub官方政策更新预警)

为什么你的AI产品突然被下架?——开源模型商用许可失效的7个隐蔽信号(含GitHub官方政策更新预警)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;开源模型商用许可解析 开源大语言模型的商用许可并非“开箱即用”的自由通行证&#xff0c;其法律约束力直接决定企业能否合法部署、微调、分发或嵌入模型至商业产品中。当前主流许可协议存在显著差异&#x…

2026/7/21 22:46:35 阅读更多 →
【数据结构与算法 | 第五篇】力扣303,304前缀和数组

【数据结构与算法 | 第五篇】力扣303,304前缀和数组

力扣 303. 区域和检索 - 数组不可变。 用法本质: 就是新创建一个数组,大小多1.然后数组的值是原数组与前面的和.这样用新数组-前面数组就行了. class NumArray {// 前缀和数组private int[] preSum;// 输入一个数组&#xff0c;构造前缀和public NumArray(int[] nums) {// p…

2026/7/21 22:46:35 阅读更多 →

最新新闻

关于十年后就业的随想

关于十年后就业的随想

在 AI 技术指数级演进的大背景下&#xff0c;未来十年 IT 产业或将迎来大规模就业结构调整&#xff0c;众多中初级程序员会被行业淘汰。全新的研发生产模式将应运而生&#xff1a;依托具备深厚实战项目积淀的高级技术人才&#xff0c;辅以多智能体协同完成全流程开发工作。届时…

2026/7/22 0:50:48 阅读更多 →
蓝速 AI 双屏翻译机:双模续航打破跨境沟通壁垒

蓝速 AI 双屏翻译机:双模续航打破跨境沟通壁垒

摘要&#xff1a; 本文深度评测蓝速 AI 双屏翻译机如何通过创新的双模供电架构与一体双面屏设计&#xff0c;系统性解决外贸业务中移动巡厂、桌面谈判等全场景沟通痛点。文章结合真实场景实测&#xff0c;展示了该设备在续航、交互、稳定性及工艺上的突破&#xff0c;剖析其如何…

2026/7/22 0:49:47 阅读更多 →
5分钟快速上手:JDspyder京东抢购脚本终极实战指南

5分钟快速上手:JDspyder京东抢购脚本终极实战指南

5分钟快速上手&#xff1a;JDspyder京东抢购脚本终极实战指南 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 还在为京东秒杀抢不到心仪商品而烦恼吗&#xff1f;JDspyder京东抢…

2026/7/22 0:48:47 阅读更多 →
金融 Function Calling:风控规则引擎 + LLM 的联合判决设计

金融 Function Calling:风控规则引擎 + LLM 的联合判决设计

金融 Function Calling&#xff1a;风控规则引擎 LLM 的联合判决设计 一、单靠 LLM 做风控&#xff0c;漏掉的是真金白银 金融风控场景中&#xff0c;决策的正确性直接影响资金安全。一个典型的例子&#xff1a;用户提交一笔"跨境转账"申请。传统风控系统通过规则引…

2026/7/22 0:48:47 阅读更多 →
新店GEO优化快速起量

新店GEO优化快速起量

随着AI搜索技术的不断进步&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;已经成为新店获取同城精准流量的重要手段。对于新开业的店铺来说&#xff0c;如何在竞争激烈的市场中迅速脱颖而出&#xff0c;吸引到目标客户群体是至关重要的。本文将深入探讨新店如何通过GEO…

2026/7/22 0:48:47 阅读更多 →
Go 高频交易模拟:纳秒级定时的实现与精度限制分析

Go 高频交易模拟:纳秒级定时的实现与精度限制分析

Go 高频交易模拟&#xff1a;纳秒级定时的实现与精度限制分析 一、time.Sleep(time.Microsecond) 实际上睡了多久&#xff1f; 写一个简单的 Go 程序测试&#xff1a; start : time.Now() time.Sleep(1 * time.Microsecond) elapsed : time.Since(start) fmt.Println(elapsed) …

2026/7/22 0:48:47 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统&#xff0c;尤其是像TI C6000系列这样的高性能DSP开发中&#xff0c;我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动&#xff0c;但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案&#xff1f; 在数字化协作环境中&#xff0c;消息通知系统的重要性不言而喻明。但现实情况是&#xff0c;企业级通知方案往往需要复杂的API对接&#xff08;如企业微信、钉钉、飞书&#xff09;&#xff0c;个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点"&#xff0c;乙方听到的是"少做几页"。甲方说"不要太复杂"&#xff0c;乙方理解成"别放图表了"。结果交过去&#xff0c;甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里&#xff0c;是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻