STC89C52RC拓展串口(串口不够)的解决方法

发布者:TranquilSoul最新更新时间:2019-12-20 来源: 51hei关键字:STC89C52RC  拓展串口  串口 手机看文章 扫描二维码
随时随地手机看文章

现在很多人拿51单片机起步,其中用的最多的当属STC89C52RC,但随着学习的深入,越来越感觉到这款单片机功能的落后,再加上现在物联网技术的发展,通信成了重要的一环,而许多模块比如蓝牙模块,串口屏,无线模块,GSM模块,串口语言模块等等都用串口通信,而这款单片机的串口就只有一个,远远不能满足功能复杂的大型应用,所以有些人就转向12,15,AVR,STM32等等,但这些单片机的学习资源远不如STC89C52RC,编程复杂了很多,但实际作品并不一定需要这么高级的单片机怎么办,本文将介绍几种常见的方法帮你扩展51单片机的串口:

1:先发一个常用的传统串口程序,里面包含了各种收发程序。

#include

#define MAIN_Fosc     11059200UL                        /*使用11.0592M晶体,UL相当于无符号整型,也就是unsigned int*/

//函数声明

void ConfigUART(unsigned int baud);

void SendByte(unsigned char d);

void SendString(unsigned char * pd);

//定义一个全局变量a存储接受到的数据

unsigned int a;

void main()

{

    EA = 1;   //使能总中断

    ConfigUART(9600);  //配置波特率为9600

        SendByte(0x03);

        SendString("ok");

    while(1);

}

//串口初始化程序

void ConfigUART(unsigned int baud)

{

    SCON  = 0x50;  //配置串口为模式1

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x20;  //配置T1为模式2

    TH1 = 256 - (MAIN_Fosc/12/32)/baud;  //计算T1重载值

    TL1 = TH1;     //初值等于重载值

    ET1 = 0;       //禁止T1中断

    ES  = 1;       //使能串口中断

    TR1 = 1;       //启动T1

}

//发送一个字节的数据,形参d即为待发送数据。

void SendByte(unsigned char d)                  

{

        SBUF=d; //将数据写入到串口缓冲

        while(!TI); //等待发送完毕

        TI=0;

}

//发送一个字符串

void SendString(unsigned char * pd)

{

        while((*pd)!='') //发送字符串,直到遇到0才结束

        {

                SendByte(*pd); //发送一个字符

                pd++;  //移动到下一个字符

        }

}

//串口中断函数

void InterruptUART() interrupt 4

{

        if(RI)

        {

                RI = 0;

                a= SBUF;

        }

}

2:其实不用单片机自带的串口,用定时器可以让任意两个IO口模拟串口

#include

sbit PIN_RXD = P3^0;

sbit PIN_TXD = P3^1;

bit RxdEnd = 0;

bit RxdOrTxd = 0;

bit TxdEnd = 0;

unsigned char RxdBuf = 0;

unsigned char TxdBuf = 0;

void ConfigUART(unsigned int baud);

void StartRXD();

void StartTXD(unsigned char dat);

void main()

{

        EA = 1;

        ConfigUART(9600);

       

        while(1)

        {

                while(PIN_RXD);

                StartRXD();

                while(!RxdEnd);

                StartTXD(RxdBuf);

                while(!TxdEnd);

        }

       

}

void ConfigUART(unsigned int baud)

{

        TMOD &= 0xF0;

        TMOD |= 0x02;

        TH0 = 256 - (11059200/12)/baud;

}

void StartRXD()

{

        TL0 = 256 - ((256 - TH0)>>1)+4;//之所以加4是因为实地测试发送数据还行,但接收数据误差率太大,估计是51速度太慢,中断中语句太多,当波特率低于9600时可不加4,波特率等于9600则加3以上

        ET0 = 1;

        TR0 = 1;

        RxdEnd = 0;

        RxdOrTxd = 0;

}

void  StartTXD(unsigned char dat)

{

        TxdBuf = dat;

        TL0 = TH0;

        ET0 = 1;

        TR0 = 1;

        PIN_TXD = 0;

        TxdEnd = 0;

        RxdOrTxd = 1;

}

void InterruptTimer0() interrupt 1

{

        static unsigned char cnt = 0;

        if(RxdOrTxd)

        {

                cnt++;

                if(cnt <= 8)

                {

                        PIN_TXD = TxdBuf & 0x01;

                        TxdBuf >>= 1;

                }

                else if(cnt == 9)

                {

                         PIN_TXD = 1;

                }

                else

                {

                        cnt = 0;

                        TR0 = 0;

                        TxdEnd = 1;

                }

        }

        else

        {

                if(cnt == 0)

                {

                        if(!PIN_RXD)

                        {

                                RxdBuf = 0;

                                cnt++;

                        }

                        else

                        {

                                TR0 = 0;

                        }

                }

                else if(cnt <= 8)

                {

                        RxdBuf >>= 1;             

                        if(PIN_RXD)

                        {

                                RxdBuf |= 0x80;

                        }

                        cnt++;

                }

                else

                {

                        cnt = 0;

                        TR0 = 0;

                        if(PIN_RXD)

                        {

                                RxdEnd = 1;

                        }

                }

        }

}

3:有些模块只需要接收单片机发送的数据,那就只接单片机的Txd,同理有些模块只需要给单片机发送数据只接Rxd;

4:多用几块单片机,我们的原则是能用低级的单品机解决的绝不用高级单片机解决。单片机与单片机之间可以用IIC通信或者原始的检测IO口电平。

5:把所有需要用到串口通信的模块都接到单片机的串口上,然后用三极管控制什么时间段什么模块供电工作。

6:通过SPI串口拓展芯片,比如VK3224芯片,CH432T芯片,GM8142芯片,8251芯片等等。

关键字:STC89C52RC  拓展串口  串口 引用地址:STC89C52RC拓展串口(串口不够)的解决方法

上一篇:基于51单片机的停车场车位管理系统
下一篇:单片机DES加解密源程序,参数带入密钥就能加密解密了

推荐阅读最新更新时间:2024-11-13 22:02

stm32f103串口BootLoader
因为在论坛和官网都没搜到完全合适的BootLoader,所以自己移植完成了一个BootLoader工程。另外附APP文件工程,可做实验。用良心保证,看完后可以做一个成功的实验。 上位机选用SecureCrt,单片机用的stm32f103vet6。 首先搞清楚BootLoader过程步骤,代码可以再根据自己需要修改: 步骤一:初始化IO口,初始化uart串口,初始化定时器等等 步骤二:进入BootLoader选择界面,如果选择1是烧写程序,然后用上位机发送ymodem格式的bin文件。(bin文件就是应用程序的编译后的二进制代码),发送完成后,单片机已经把它存进flash中一块区域,并跳转运行此区域。 步骤二:进入BootLoad
[单片机]
stm32f103<font color='red'>串口</font>BootLoader
一种串口服务器的指纹网络考勤系统
本文讨论了一种将指纹识别技术用于考勤的系统,结合串口服务器ATOP TigerLink GW21S一256协议转换的功能,将只能提供RS232/485串口的考勤终端接入以太网,实现网络考勤。介绍了系统的设计思路、总体构成及软、硬件实现,对于企业人事管理现代化具有一定的实用价值。   1.引言   目前指纹识别技术已应用到各种综合信息管理系统中,可以设计将指纹识别技术用于考勤。代替传统的打卡制度,避免代打卡的现象发生。但是指纹考勤终端是单片机控制系统,通常只提供RS232/485串口通讯,对于考勤地点比较分散、距离较远、需要多台考勤终端的单位来说,RS232/485则不能完成远距离的网络数据传输。目前,基于TCP/IP协议的网络架
[嵌入式]
【STM32】串口通信出现乱码(使用官方标准库)
开发板:stm32f407VET6 开发环境:keil5 MDK 为了使文章的内容完整,增加了一下原因的叙述,没有兴趣的话可以直接跳转到 问题解决 问题产生 最近学习了一下32的串口通信,串口配置还是很简单的,不过后面串口调试助手上面出现的乱码。很让人头疼。 当然第一时间去百度寻求解决办法。 百度搜索总结: 在程序不出现问题的情况下,一定是外部晶振设置的问题。但是也要排查下面
[单片机]
【STM32】<font color='red'>串口</font>通信出现乱码(使用官方标准库)
STM32串口通信(usart)
在开始学写STM32串口通信的代码实现前,首先先了解一下两块芯片之间通信的分类,按照数据传输方式可以分为 并行通信:数据各个位同时传输,速度快,占用引脚资源多 串行通信:数据按位传输,速度较慢,占用引脚资源少 按照数据传送的方向,可以分为 单工:只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。 全双工:允许数据同时在两个方向上传输,因此全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 串口通信就是一种串行全双工通信方式,而串行通信又可分为 同步通信:带时钟同步信号传输(如SPI , II
[单片机]
STM8S003F3使用总结——串口
STM8作为低成本芯片一直受到广大用户青睐,最近一个项目使用了STM8S003F3P6这款芯片,主要实现的功能就是串口接收指令控制PWM输出。这里对这款芯片使用过程中遇到的问题进行总结。 编译环境:IAR for STM8 3.10.2 库版本:V2.2.0 1.STM8S003F3与STM8S103F3差异 除了以上差异,两款芯片可pin-to-pin兼容,片内外设资源一致。 2.串口通信 STM8S003F不支持DMA,因此使用中断方式接收。中断向量表如下: typedef enum { UART1_IT_TXE = (uint16_t)0x0277, /*! Transmit interrupt *
[单片机]
STM8S003F3使用总结——<font color='red'>串口</font>
【STM32】STM32串口配置的步骤(库函数)
第一部分: 第二部分:串口中断4种接收数据实现方式
[单片机]
【STM32】STM32<font color='red'>串口</font>配置的步骤(库函数)
单片机串口中断发送的实现与特点
假设要发送一组数据 Send 一般采用查询发送(循环发送)方式: unsigned char Send ; //发送量 unsigned char i; //循环量 for(i=0;i 10;i++) { SBUF= Send ; //发送 while(TI==0); //等待发送完成 TI=0; //清标志 } 采用中断发送方式:
[单片机]
基于C8051F410的串口通信实验
这段程序功能很简单,就是按一个按键就发送特定命令,收到命令就控制灯的亮灭,但却很有调试价值,曾帮科协的一个同学调通了C8051F410和avr的通信,还有自己的一些项目用到它。故上传上来给大家参考下。 #include c8051f410.h // SFR declarations #include stdio.h #define SYSCLK 24500000 // Internal oscillator frequency in Hz #define BAUDRATE 2400 // Baud rate of UART in bps sbit led1 = P2^1;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved