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  0xffb8

65536 - 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 tx

u8 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 mode
    auxr = auxr & 0xf0;
    auxr = auxr | 0x04;
    // enable timer1 interrupt
    ie2 = 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 EA
    
    TEND = 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的关系
    在这里插入图片描述

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

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

相关文章

Vue3拖拽功能【VueDraggablePlus】

一、介绍 由于 Sortablejs 的 vue3 组件一直没有更新&#xff0c;已经跟 vue3 严重脱节&#xff0c;所以诞生了这个项目&#xff0c;这个组件是基于 Sortablejs 的&#xff0c;所以如果你想了解更多关于 Sortablejs 的信息&#xff0c;可以查看Sortablejs 官网。VueDraggableP…

Markdown从入门到精通

Markdown从入门到精通 文章目录 Markdown从入门到精通前言一、Markdown是什么二、Markdown优点三、Markdown的基本语法3.1 标题3.2 字体3.3 换行3.4 引用3.5 链接3.6 图片3.7 列表3.8 分割线3.9 删除线3.10 下划线3.11 代码块3.12 表格3.13 脚注3.14 特殊符号 四、Markdown的高…

拼多多商品详情数据接口在数据分析行业的作用性

在数据分析行业中&#xff0c;拼多多商品详情数据的作用性主要体现在以下几个方面&#xff1a; 了解市场和用户需求&#xff1a;通过拼多多商品详情数据&#xff0c;企业可以了解到市场上什么产品受欢迎&#xff0c;用户对产品的反馈和评价如何&#xff0c;从而调整自己的销售…

js获取快递单号小练习

目录 1、css代码 2、html代码 3、js代码 完整代码 效果图 1、css代码 .box{width: 400px;height: 300px;margin: 100px auto;position: relative;}input{width: 250px;height: 40px;outline: none;}span{display: block;position: absolute;min-width: 270px;max-width: 40…

SpringBoot集成Spring Security+jwt+kaptcha验证(简单实现,可根据实际修改逻辑)

参考文章 【全网最细致】SpringBoot整合Spring Security JWT实现用户认证 需求 结合jwt实现登录功能&#xff0c;采用自带/login接口实现权限控制 熟悉下SpringSecurity SpringSecurity 采用的是责任链的设计模式&#xff0c;是一堆过滤器链的组合&#xff0c;它有一条很…

Centos7部署Graylog5.2日志系统

Graylog5.2部署 Graylog 5.2适配MongoDB 5.x~6.x&#xff0c;MongoDB5.0要求CPU支持AVX指令集。 主机说明localhost部署Graylog&#xff0c;需要安装mongodb-org-6.0、 Elasticsearch7.10.2 参考&#xff1a; https://blog.csdn.net/qixiaolinlin/article/details/129966703 …

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(一)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者的反馈中发现许多小伙伴对方言…

外贸辅助工具定制的价格范围,别被坑了哟!

随着全球化的不断发展&#xff0c;外贸已成为企业不可或缺的一部分。然而&#xff0c;在外贸过程中&#xff0c;企业往往会遇到各种问题&#xff0c;如语言障碍、文化差异、法规繁琐等&#xff0c;为了解决这些问题&#xff0c;许多企业选择定制外贸辅助工具。 但是&#xff0…

高德地图vue实现自定义标点热力图效果(缩放时展示不同数据)

高德地图插件引入省略。。。样式和vue基础组件省略。。。 如果每个标点没有数值&#xff0c;则可以用点聚合来实现功能下面例子&#xff0c;每个标点会有按市统计的数值&#xff0c;而且缩放一定程度时&#xff0c;需要展示按省统计的标点&#xff0c;因此需要自定义标点样式和…

多相Buck的工作原理

什么是多相Buck电源&#xff1f; 多相电源控制器是一种通过同时控制多个电源相位的设备&#xff0c;以提供稳定的电力供应。相位是指电源中的电流和电压波形。多相控制器的设计旨在最大程度地减小电力转换系统的纹波&#xff0c;并提高整体能效。它通常包含一系列的功率级联&a…

python六子棋ai对战(alpha-beta)剪枝算法

核心代码 def __init__(self): #初始化函数self.num0 #对yi次数self.rows 10 #初始化棋盘10行self.cols 10 # 初始化棋盘10列self.rank6 #阶数 代表六子棋self.empty_board() #清空棋盘self.V 10 #攻击程度self.E10 #防守程度self.depth2 #思考深度…

spring 的概述和入门

​ 我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; …

cmake生成表达式

不积小流&#xff0c;无以成江海 <CONFIG:RELEASE> config这个关键字&#xff0c;主要是看CMAKE_BUILD_TYPE这个变量的值是不是和冒号后的一样&#xff0c;一样的话就返回true, 否则就是false. cmake_minimum_required(VERSION 3.10) project(Test) set(CMAKE_CXX_STA…

JVM的内存结构详解「重点篇」

一、JVM虚拟机数据区 虚拟机栈 1、 线程私有 2、 每个方法被执行的时候都会创建一个栈帧用于存储局部变量表&#xff0c;操作栈&#xff0c;动态链接&#xff0c;方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。 3、栈帧: 是用来存储…

HarmonyOS应用开发工具DevEco Studio安装与使用

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 知识库内容逐步完善中… 工欲善其事必先利其器&#xff0c;要编写HarmonyOS应用就需要用到官方提供的IDE工具来编写相应的代码。 在鸿蒙开发者官网&#xff0c;其提供了官方的开…

关于什么是 JVM

关于什么是 JVM&#xff0c;看看普通⼈和⾼⼿的回答。 普通人 JVM 就是 Java 虚拟机&#xff0c;是⽤来运⾏我们平时所写的 Java 代码的。优点是它会 ⾃动进⾏内存管理和垃圾回收&#xff0c;缺点是⼀旦发⽣问题&#xff0c;要是不了解 JVM 的运⾏ 机制&#xff0c; 就很难…

企业能用ov多域名https证书

多域名https证书是https数字证书中灵活性较高的一款产品。各个正规CA认证机构旗下的多域名https证书都有同时保护多个域名站点的功能&#xff0c;但是和其它域名https证书不一样的是多域名https证书保护的域名类型比较广。多域名https证书可以保护多个主域名和子域名站点&#…

贪吃的猴子 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 一只贪吃的猴子&#xff0c;来到一个果园&#xff0c;发现许多串香蕉排成一行&#xff0c;每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香…

低多边形3D建模石头材质纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

HarmonyOS4.0从零开始的开发教程09页签切换

HarmonyOS&#xff08;七&#xff09;页签切换 List组件和Grid组件的使用 Tabs组件的使用 概述 在我们常用的应用中&#xff0c;经常会有视图内容切换的场景&#xff0c;来展示更加丰富的内容。比如下面这个页面&#xff0c;点击底部的页签的选项&#xff0c;可以实现“首页…