STC15F100E单片机模拟串口

这篇具有很好参考价值的文章主要介绍了STC15F100E单片机模拟串口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、芯片简介

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

二、开发环境

在Keil中添加STC芯片

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

  2. 打开STC-ISP软件,选择右侧"Keil仿真设置"栏
    stc15f104e 模拟串口,嵌入式,单片机,嵌入式硬件

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

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

  5. Keil新建工程选择芯片型号时就会有新添加的STC芯片
    stc15f104e 模拟串口,嵌入式,单片机,嵌入式硬件

三、软件模拟串口

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

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

原理说明

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

程序文章来源地址https://www.toymoban.com/news/detail-829682.html

  • 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的关系
    stc15f104e 模拟串口,嵌入式,单片机,嵌入式硬件

到了这里,关于STC15F100E单片机模拟串口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STC15单片机】简单的矩阵键盘代码

    单片机型号说明:IAP15F2K61S2 新建工程时单片机型号选择 STC15F2K60S2 51单片机矩阵键盘代码 本程序烧写到51单片机应该是正常使用的,手头没有51开发板了,暂时没测试 这个程序烧写到15单片机,前两列按键不能正常使用 只需要在判断第一列按键那部分程序,前面加上P42 = 0;

    2024年02月05日
    浏览(79)
  • STC15系列单片机学习4:串口通讯

    在使用单片机的串口前,得先知道所使用的单片机有几个串口,再结合你的硬件电路图来使用哪个串口。 以下是STC15各系列单片机的串口数量,STC15W4K32S4系列有4个串口 工作模式0:同步移位寄存器(官方建议初学者不学) 工作模式1:8位串口,波特率可变 工作模式2:9位串口

    2024年04月13日
    浏览(44)
  • STC15系列单片机学习6:外部中断

    外部中断,就是通过单片机IO引脚电平的变化触发的中断。 STC15系列单片机的外部中断源一共有5个,分别是外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)、外部中断4(INT4);当然不是所有的STC15系列单片机都有着5个外部中断。 中断源 触发行为

    2024年03月12日
    浏览(174)
  • STC15W104 8脚单片机串口下载程序

    单片机串口下载是一种常见的单片机程序下载方式,它通过串口线连接单片机的串口引脚和电脑的串口接口实现。下面是单片机串口下载的基本原理和操作方法: 确定下载模式:大多数单片机芯片都支持串口下载模式,需要在程序中设置下载模式。 连接串口:使用串口线连

    2024年02月13日
    浏览(45)
  • 基于STC15单片机的智能密码锁(矩阵按键输入)设计

    目录 一、项目背景 二、功能需求  三、功能组成 四、总结         智能门锁是一种基于现代智能化技术,与传统门锁进行比较的创新型的电子门锁产品。传统门锁通常采用钥匙旋转来开启门锁,但传统门锁存在钥匙遗失、易被复制等问题,特别是具有主动性质的人员如

    2024年02月03日
    浏览(51)
  • 微机课设 | 基于STC15单片机的简易数字密码锁设计

    在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的

    2024年02月04日
    浏览(56)
  • STC15系列单片机:定时器/计数器16位自动重装载模式

    STC15系列单片机内部有5个16位定时器/计数器,分别是T0、T1、T2、T3、T4。 定时器与计数器,东西还是同一个东西,只是用法和功效不一样,就好比黄瓜,既可以内服也可以外敷,黄瓜还是那个黄瓜,作用就不一样了。 就拿T0来说,T0用于定时,那T0就是定时器,如果T0用于计数

    2024年01月25日
    浏览(54)
  • 53、基于STC15W单片机的温度计(DS18B20)(Proteus仿真+程序)

          本设计由STC15W4K32S4单片机+DS18B20温度传感器+1602液晶显示模块+串口模块组成。 1、主控制器是STC15W4K32S4单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、1602液晶显示温度。 4、测温范围-55~110摄氏度,误差±0.1℃ 5、温度值发送至串口助手显示。 Proteus软件: Proteus

    2024年02月03日
    浏览(67)
  • 51单片机STC15W4K56S4控制步进电机28BYJ-48正反转

    步进电机28BYJ-48(12V)介绍:       首先,我们看下步进电机28BYJ-48(12V)外观图,如下:         28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示带减速箱,48表示四相八拍。       下面解释下“4 相永磁式”的概念,28BYJ-48 的构造如下图所示

    2023年04月17日
    浏览(46)
  • 为STC32单片机搭建开发环境

            自去年起,STC推出了51内核的32位单片机,但是单纯的51内核已经驾驭不了32位总线了。因此STC32单片机才用的是251内核,多了一个2,使得底层指令从111条扩充到了268条,这或许意味着以后的STC单片机会有更广大的想象空间?         也因此,STC32的开发环境与传统

    2024年02月08日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包