averyleigh 发表于 2024-9-25 09:05

IO口模拟串口

芯圣SQ013单片机 ,是一颗8位精简指令集单片机,支持C语言,汇编编程,但由于没有硬件UART,所以我们采用IO口进行模拟。

程序代码
#include "holychip_define.h"

#define TXD PORTB1   
//#define RXD PORTB4
unsigned int Count=0;
unsigned int Time_1s;
unsigned int i ;
void Delay(unsigned char i)
{
   while(i--);
}

/*------------------------------------------------
mS延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号字符变量,其值的范围是
0~1024 精确延时请使用汇编
-------------------------------------------------*/
void DelayMS(unsigned int t)
{
        unsigned char count = 195;          
        while(t--)
        {
                while(count--);
        }
}
void Init(void)
{
   PORTB = 0B00110010;//PB1上电高电平
   TRISB = 0X00;
   PHCON = 0XFF;
   PDCON = 0xff;
   ODCON = 0X00;
}

void Time0_Init(void)
{
    OPTION = 0x16;   
    T0 = 178;    //定时50ms
    T0IE = 1;
    T0IF = 0;
    GIE = 1;
}
void WriteByte(unsigned char Byte)
{
    unsigned char i = 8;

    TXD = 0;          //发送起始位

    Delay(25);
    //发送8位数据位
    while(i--)
    {
       TXD = (Byte&0x01);   //先传最低位
       Byte = Byte>>1;
       Delay(25);

    }
    //发送校验位
    TXD = 1;
    Delay(25);

}

void UART_SendString(unsigned char *buf)
{
   while(*buf!='\0')
   {
      WriteByte(*buf);
      buf++;
   }
}
void main(void)
{
   unsigned int i ;
   Init();
   Time0_Init();
   while(1)
   {
               if(Time_1s==1)
                {
               Time_1s=0;
                for(i=0;i<3;i++)
                {
                   UART_SendString("Hello,World!");
                   DelayMS(1);
                }
                asm(sleep);asm(nop);asm(nop);asm(nop);
                }
   }


}

//*****************************中断服务程序*****************************
//进中断时间=1/(时钟源/xT/分频比)*(256-T0初值)
void Intr(void) __interrupt 0
{
   if(T0IF)
   {
   T0IF =0;
   T0 = 178;
   Count++;
   if(Count>=200)
   {
      Count=0;
      Time_1s=1; //1s时间到
   }
   }

}
https://i-blog.csdnimg.cn/blog_migrate/8ed4fc1e71653075a665b397fed046ed.png#pic_center                  
原文链接:https://blog.csdn.net/impressively/article/details/106694236

呐咯密密 发表于 2024-9-25 11:17

可以做到多少的波特率

yangxiaor520 发表于 2024-10-23 08:07

不得吧,对8位机来讲串口是最基本的外设啊。

地瓜patch 发表于 2024-10-29 17:35

这个功能实用收藏了

suncat0504 发表于 2024-10-30 17:46

软件延时的准确度,容易被干扰吧?用定时器中断控制时间,是不是能更准确?

claretttt 发表于 2024-11-7 22:39

波特率的选择应考虑到单片机的性能和IO口的速度限制,通常不建议设置得太高,以免出现数据丢失或错误。

geraldbetty 发表于 2024-11-8 08:57

使用中断或轮询方式来读取接收引脚的状态

janewood 发表于 2024-11-8 09:47

软件模拟的串口可能不如硬件串口稳定可靠,尤其是在面对复杂的通信环境和噪声干扰时

uytyu 发表于 2024-11-8 11:10

波特率的计算需要精确的定时器或延时函数,以确保数据的正确传输和接收。

eefas 发表于 2024-11-8 12:52

如果使用中断方式接收数据,确保中断向量表和中断服务例程(ISR)配置正确。

robertesth 发表于 2024-11-8 14:40

在某些情况下,可能需要使用电平转换电路来匹配不同设备的电平标准。

tabmone 发表于 2024-11-8 16:24

模拟串口可能会占用较多的CPU资源,尤其是在处理大量数据或高波特率时。

updownq 发表于 2024-11-8 19:50

串口通信的速率由波特率决定,因此模拟串口时需要精确控制信号的定时。通常使用定时器或延时函数来实现位与位之间的精确间隔。

minzisc 发表于 2024-11-8 20:02

如果使用多个I/O口模拟多个串口,需要处理好它们之间的同步问题,避免数据混乱。

sdCAD 发表于 2024-11-8 20:14

实现错误检测和处理机制,例如检测到帧错误、奇偶校验错误等。

usysm 发表于 2024-11-8 20:40

串口通信对时序要求严格,确保在正确的时间点发送和接收数据。

jtracy3 发表于 2024-11-8 20:50

使用中断来处理串口通信事件,提高系统的响应速度。

hilahope 发表于 2024-11-8 21:02

应选择具有较快响应速度和较低输入输出延迟的引脚,同时要避免使用与其他关键功能冲突的引脚。

backlugin 发表于 2024-11-8 21:13

适当使用上拉或下拉电阻,以确保在没有数据传输时IO口处于稳定状态。

burgessmaggie 发表于 2024-11-8 21:23

在发送和接收数据时,必须严格遵守这个时间间隔
页: [1] 2
查看完整版本: IO口模拟串口