STC15F100E单片机模拟串口

文章目录

  • 一、芯片简介
  • 二、开发环境
  • 三、软件模拟串口
  • 参考

一、芯片简介

STC15F100系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,新一代8051单片机,指令代码完全兼容传统8051,但是速度快6-12倍。
内部集成R/C时钟,5MHz~35MHz宽范围可设置,可以省掉外部晶振。
内部集成复位电路,可省掉外部复位电路。
6个通用I/O口,支持四种模式:准双向口/弱上拉、强推挽/强上拉、输入/高阻、开漏
芯片管脚图
[图片]

二、开发环境

在Keil中添加STC芯片

  1. 下载STC-ISP软件
    https://www.stcmcudata.com/

  2. 打开STC-ISP软件,选择右侧"Keil仿真设置"栏
    [图片]

  3. 选择"添加型号和头文件到Keil中,添加STC仿真器驱动到Keil中", 选择Keil C51的安装目录
    例如:D:/software/keil4

  4. 系统会自动添加"STC"文件夹( C51/INC/ )

  5. Keil新建工程选择芯片型号时就会有新添加的STC芯片
    [图片]

三、软件模拟串口

STC15F100E芯片内部是不直接支持串口通信的,但是可以用I/O口+定时器来实现串口功能。
这里实现的是半双工通信
系统工作时钟为5.5296Mhz,波特率为9600bps。
引脚说明

  • P3.0为Uart的RX引脚
  • P3.1为Uart的TX引脚

原理说明

  • 发送原理
    [图片]
    设置定时器的定时时间为一个bit的的发送时间,在定时器中断服务函数中,设置Uart_TX引脚的值。
  • 接收原理
    [图片]
    将Uart_RX引脚设置为外部中断(下降沿触发)模式,捕获Uart接收的开始信号。
    设置第一次定时时间为 3 2 \frac{3}{2} 23个bit持续的时间,其余的定时时间为一个bit的持续时间,在定时器中断服务函数中对Uart_RX引脚进行采样。

程序

  • uart.c
/*
module name :  uart
author      :  wkk
create time :  2023/12/5
*/#include "uart.h"
/*
BaudRate -> timer
SysClk   : 5.5296Mhz
Baudrate : 115200
5_529_600 / 115200 = 48           ( x -> error )
5_529_600 / 9600   = 576
65536 - 48    = 65488  0xffd0
65536 - 48-24 = 65464  0xffb865536 - 576     = 64960  0xfdc0
65536 - 576-288 = 64672  0xfca0
*/// define type u8
typedef unsigned char  u8;
// ext 2 3 4 register
// 7  6     5    4  3 2   1      0
// - ext4 ext3 ext2 - - tlclkO t0clkO
sfr int_clkO = 0x8f;// 1T mode or /12
//   7     6   5  4    3     2   1 0
// t0x12 t1x12 - T2R T2_C/T T2x12 - -
sfr auxr = 0x8e;// IE2
//  7  6   5   4   3   2   1    9
//  - ET4 ET3 ES4 ES3 ET2 ESP1 ES2
sfr ie2 = 0xaf;// timer 
sfr TH2 = 0xd6;
sfr TL2 = 0xd7;//define uart tx/rx port
sbit uart_rx = P3^0;       // P3.0 rx
sbit uart_tx = P3^1;       // P3.1 txu8 TEND,TING,tcnt,tbuf;
u8 REND,RING,rcnt,rbuf;void Enable_Ext4(){int_clkO = int_clkO | 0x40;
}void Disable_Ext4(){int_clkO = int_clkO & 0xbf;
}void Timer2_config(){// 1T modeauxr = auxr & 0xf0;auxr = auxr | 0x04;// enable timer1 interruptie2 = ie2 | 0x04;// need to enable EA
}void Timer2_Disable(){auxr = auxr & 0xef;
}void Timer2_Enable(u8 th1,u8 tl1){TH2 = th1;TL2 = tl1;auxr = auxr | 0x10;
}void Uart_Init(){//P3.0 work in interrupt mode ( int4 falling )Enable_Ext4();  // timer2 config Timer2_config();Timer2_Disable();// need to enable EATEND = 1;REND = 0;TING = 0;RING = 0;uart_tx = 1;
}void Ext4_Interrupt() interrupt 16 {RING = 1;REND = 0;rcnt = 0;rbuf = 0;Timer2_Enable(0xfc,0xa0);Disable_Ext4();
}void Uart_SendByte( u8 tx_data ) {tbuf = tx_data;tcnt = 0;TEND = 0;TING = 1;uart_tx = 0;Timer2_Enable(0xfd,0xc0);while( TEND != 1); // wait for tx complete!!
}void Uart_LoopTest( ){if( TEND && REND == 1 ) {Uart_SendByte(rbuf);REND = 0;        }
}void Timer2_Interrupt() interrupt 12  {if( RING ) {if( rcnt == 0 ) {Timer2_Disable();rbuf = rbuf >> 1;if( uart_rx ) rbuf = rbuf | 0x80;  Timer2_Enable(0xfd,0xc0);           }else if( rcnt == 8 ){Timer2_Disable();Enable_Ext4();RING = 0;REND = 1;// recv done !!!        }else {rbuf = rbuf >> 1;if( uart_rx ) rbuf = rbuf | 0x80;  } rcnt ++;}else if( TING ) {if( tcnt == 8) {uart_tx = 1;}else if( tcnt == 9) {Timer2_Disable();TING = 0;TEND = 1;// tx done !!!   }else{uart_tx = tbuf & 0x01;tbuf = tbuf >> 1;}tcnt ++;}else{// other things}
}
  • uart.h
#ifndef _UART_H_
#define _UART_H_
#include <reg51.h>void Uart_Init(void);
void Uart_SendByte( unsigned char tx_data );
void Uart_LoopTest( void );
#endif
  • main.c
#include <reg51.h>
#include "uart.h"void Sys_Init(){Uart_Init();EA = 1;
}void main(){Sys_Init();while(1) {//Uart_LoopTest();}
}

参考

  • 定时器相关
    https://blog.csdn.net/weixin_52853526/article/details/125180813
  • 模拟串口程序
    https://www.cnblogs.com/zjutlitao/archive/2018/03/31/8681049.html
  • 右移/左移和标志位CY的关系
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25、pytest的测试报告插件allure

allure简介 在这里&#xff0c;你将找到使用allure创建、定制和理解测试报告所需的一切。开始让你的测试沟通更清晰&#xff0c;更有影响力。 Allure Report是一个实用程序&#xff0c;它处理由兼容的测试框架收集的测试结果并生成HTML报告。 安装allure 1、确保安装了Java…

【SSM源码】基于JAVA的高校竞赛和考级查询系统

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍&#xff1a; 二、文档学习资料&#xff1a; 三、模块截图&#xff1a; 四、开发技术与运行环境&#xff1a; 五、代码展示&#xff1a; 六、数据库表截图&#xff1a…

MISRA C 2012 标准浅析

MISRA(The Motor Industry Software Reliability Association)&#xff0c;汽车工业软件可靠性联会&#xff1b; 1994年&#xff0c;英国成立。致力于协助汽车厂商开发安全可靠的软件的跨国协会&#xff0c;其成员包括&#xff1a;AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷…

js实现动态添加删除表格数据的两种方式

目录 1、通过创建节点实现 css代码 html代码 js代码 完整代码 2、通过渲染表格&#xff0c;事件委托实现 css代码 html代码 js代码 完整代码 效果图 1、通过创建节点实现 思路&#xff1a;先把整体的html结构写出来&#xff0c;table表格分为3部分&#xff0c;其中t…

HNU-电路与电子学-2021期末A卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 本份卷子的参考性很高&#xff0c;这是2020级的期末考卷。题目都是很典型的&#xff0c;每一道题都值得仔细研究透。 特别注意&#xff1a;看得懂答案跟写得…

逆水行舟!浅谈24届双非本科秋招

逆水行舟&#xff01;浅谈24届双非本科的秋招 逆水行舟&#xff01;浅谈24届双非本科的秋招0、背景 -- 写下本文的初衷1、实习 -- 秋招的预备战役1.1 科大讯飞1.2 三七互娱 2、秋招 -- 一场没有硝烟的战争3、总结 -- 做好自己想做的事情 0、背景 – 写下本文的初衷 如题&#…

常用汇编指令集

寄存器 如上是OD展示的寄存器&#xff0c;逐条说明常用的寄存器和标志位含义&#xff1a; EIP&#xff1a;寄存器指向即将要执行的指令的地址&#xff08;EIP中的地址&#xff0c;就是下一步要执行指令的地址&#xff09; ESP&#xff1a;里面的内容永远指向堆栈的最顶端 EAX&…

一文详解集合竞价,建议收藏!

集合竞价是指对在规定的一段时间内接受买卖申报一次性集中撮合的竞价方式。沪深市场9:15-9:25及14:57-15:00为集合竞价的时间段。集合竞价的所有交易以同一个价格成交。集合竞价的成交价确定原则是&#xff1a; 1、可实现最大成交量的价格&#xff1b; 2、高于该价格的买入申…

mac苹果笔记本电脑如何强力删除卸载app软件?

苹果电脑怎样删除app&#xff1f;不是把app移到废纸篓就行了吗&#xff0c;十分简单呢&#xff01; 其实不然&#xff0c;因为在Mac电脑上&#xff0c;删除应用程序只是删除了应用程序的主要组件。大多数时候&#xff0c;系统会有一个相当长的目录&#xff0c;包含所有与应用程…

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式&#xff1a;静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…

C语言之多重循环

目录 二重循环 用break语句强制结束循环 显示图形 绘制等腰直角三角形 多重循环 continue语句 将循环语句的循环体作为循环语句&#xff0c;就可以进行二重、三重循环。这样的循环称为多重循环。 我们先来了解二重循环 二重循环 在之前我们学习到的循环中的程序都比较简…

Java---异常

文章目录 1. 异常概述2. try...catch3. Throwable成员方法4. 编译时异常和运行时异常区别5. 异常处理之throws6. 自定义异常7. throws和throw的区别 1. 异常概述 1. 异常&#xff1a;就是程序中出现了不正常的情况。 2. Error&#xff1a;严重问题&#xff0c;不需要处理。Exce…

【带头学C++】----- 九、类和对象 ---- 9.4 拷贝构造函数、赋值

目录 9.4 拷贝构造函数、赋值 9.4.1 定义拷贝构造函数 9.4.2 拷贝构造和无参构造、有参构造的关系 9.4.3 拷贝构造的几种调用形式 1、旧对象给新对象初始化&#xff0c;调用拷贝构造 2、给对象取别名不会调用拷贝构造 3、普通对象作为函数参数&#xff0c;调用函数时会发…

STM32-GPIO编程

一、GPIO 1.1 基本概念 GPIO&#xff08;General-purpose input/output&#xff09;通用输入输出接口 --GP 通用 --I input输入 --o output输出 通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口&#xff0c;用户可以通过编程灵活的对接口进行控制&#xff0c;…

ArcGIS提取DEM中的山脉范围

已知数据&#xff1a;DEM文件ASTGTM_N00E118E.img 使用软件&#xff1a;ArcMap 要求&#xff1a;对数据进行操作&#xff0c;提取数据文件中的山脉范围 下面开始操作&#xff1a; 1、 打开ArcMap将DEM文件ASTGTM_N00E118E.img添加到数据框。 2、 接下来我们打开spatial ana…

虚幻学习笔记8—蓝图操作其他虚幻模块

一、前言 蓝图不仅可以相互之间操作和通信&#xff0c;其他的资源、模块也有操作和通信的方法。文本主要针对蓝图和材质、Niagara、编辑器的通信进行讲解。 二、实现 2.1、蓝图和材质 1&#xff09;首先&#xff0c;在材质蓝图中按住“4鼠标左键”创建一个参数为四维向量的参…

Kafka中的auto-offset-reset配置

Kafka这个服务在启动时会依赖于Zookeeper&#xff0c;Kafka相关的部分数据也会存储在Zookeeper中。如果kafka或者Zookeeper中存在脏数据的话&#xff08;即错误数据&#xff09;&#xff0c;这个时候虽然生产者可以正常生产消息&#xff0c;但是消费者会出现无法正常消费消息的…

【小工具分享】分享一个小工具---可视化数据结构 (初学者建议收藏)

工具链接&#xff1a; 可视化数据结构 这里支持大量数据结构地演示&#xff0c;相当全面&#xff0c;对于初学数据结构或者想更直观感受某个数据结构地实现有很大帮助&#xff0c;能直观的看到该数据结构的增删改查&#xff0c;帮助我们理解某一数据结构的性能~ 下面我演示一下…

揭秘MQTT:为何它是物联网的首选协议?

文章目录 MQTT 协议简介概览MQTT 与其他协议对比MQTT vs HTTPMQTT vs XMPP 为什么 MQTT 是适用于物联网的最佳协议&#xff1f;轻量高效&#xff0c;节省带宽可靠的消息传递海量连接支持安全的双向通信在线状态感知 MQTT 5.0 与 3.1.1MQTT 服务器MQTT 客户端 MQTT 协议简介 概…

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式&#xff0c;它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下&#xff0c;增加一些额外的功能&#xff0c;例如权限…