[通用PIC核OTP系列]

芯圣SQ013单片机IO口模拟串口 延时法

[复制链接]
507|3
手机看帖
扫描二维码
随时随地手机跟帖
王小琪|  楼主 | 2020-11-10 22:54 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:14 编辑

今天我们介绍用芯圣SQ013模拟串口。
串口通讯概述

我们常用的串口通讯协议 为1个起始位+8个数据位+1位结束位。起始位为低电平,结束位高电平。一般我们常用的串口通讯协议是三线制 TXD RXD GND 。我们设置波特率9600bps ,即1秒钟发送9600个码元 ,传输一位时间为1s/9600 = 104us.

单片机概述

我使用的是芯圣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时间到
     }
   }

}
实现现象

首先我们需要一个USB转串口模块,CH340,CP2102都行。
本例程序我们只验证串口发送。
程序执行现象为上电1s后 上位机接收3句Hello,World! 睡眠。
此处为了展示1s发送一次,我将睡眠语句注释了。


283465faaa9a0a41de.png
结束语

以上数据都为实际芯片测试,仿真器测试时发现设置值为25时,时间为102us,但图片没有保存下来。有机会再测试一下。


816485faaa99409833.png

使用特权

评论回复
HuangHongLun| | 2020-11-25 14:42 | 显示全部楼层
支持下,在某些场合,换芯片不必要,模拟串口就很必要了,但是这样模拟串口可以用来下载程序吗?

使用特权

评论回复
jcky001| | 2020-11-26 08:50 | 显示全部楼层
换芯片不必要,模拟串口就很必要了

使用特权

评论回复
cr315| | 2020-11-26 08:56 | 显示全部楼层
进来支持一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

227

主题

578

帖子

6

粉丝