[通用PIC核OTP系列] 芯圣SQ013单片机IO口模拟串口 延时法

[复制链接]
1530|0
 楼主| LinkMe 发表于 2022-9-13 15:22 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-20 09:48 编辑

因为懒,许久未来更新,不过学习还是没有停止。今天我们介绍用芯圣SQ013模拟串口。

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

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

程序代码
  1. #include "holychip_define.h"

  2. #define TXD PORTB1   
  3. //#define RXD PORTB4
  4. unsigned int Count=0;
  5. unsigned int Time_1s;
  6. unsigned int i ;
  7. void Delay(unsigned char i)
  8. {
  9.    while(i--);
  10. }

  11. /*------------------------------------------------
  12. mS延时函数,含有输入参数 unsigned int t,无返回值
  13. unsigned int 是定义无符号字符变量,其值的范围是
  14. 0~1024 精确延时请使用汇编
  15. -------------------------------------------------*/
  16. void DelayMS(unsigned int t)
  17. {
  18.         unsigned char count = 195;           
  19.         while(t--)
  20.         {
  21.                 while(count--);
  22.         }
  23. }
  24. void Init(void)
  25. {
  26.    PORTB = 0B00110010;  //PB1上电高电平
  27.    TRISB = 0X00;
  28.    PHCON = 0XFF;
  29.    PDCON = 0xff;
  30.    ODCON = 0X00;
  31. }

  32. void Time0_Init(void)
  33. {
  34.     OPTION = 0x16;   
  35.     T0 = 178;    //定时50ms
  36.     T0IE = 1;
  37.     T0IF = 0;
  38.     GIE = 1;
  39. }
  40. void WriteByte(unsigned char Byte)
  41. {  
  42.     unsigned char i = 8;
  43.    
  44.     TXD = 0;          //发送起始位
  45.    
  46.     Delay(25);
  47.     //发送8位数据位
  48.     while(i--)
  49.     {
  50.        TXD = (Byte&0x01);     //先传最低位
  51.        Byte = Byte>>1;
  52.        Delay(25);
  53.       
  54.     }
  55.     //发送校验位
  56.     TXD = 1;
  57.     Delay(25);
  58.         
  59. }

  60. void UART_SendString(unsigned char *buf)
  61. {
  62.    while(*buf!='\0')
  63.    {
  64.       WriteByte(*buf);
  65.       buf++;
  66.    }
  67. }
  68. void main(void)
  69. {
  70.    unsigned int i ;
  71.    Init();
  72.    Time0_Init();
  73.    while(1)
  74.    {  
  75.                  if(Time_1s==1)
  76.                 {
  77.                  Time_1s=0;
  78.                 for(i=0;i<3;i++)
  79.                 {
  80.                    UART_SendString("Hello,World!");
  81.                    DelayMS(1);
  82.                 }
  83.                 asm(sleep);asm(nop);asm(nop);asm(nop);
  84.                 }
  85.    }
  86.    

  87. }

  88. //*****************************中断服务程序*****************************
  89. //进中断时间=1/(时钟源/xT/分频比)*(256-T0初值)
  90. void Intr(void) __interrupt 0
  91. {
  92.    if(T0IF)
  93.    {
  94.      T0IF =0;
  95.      T0 = 178;
  96.      Count++;
  97.      if(Count>=200)
  98.      {
  99.         Count=0;
  100.         Time_1s=1; //1s时间到
  101.      }
  102.    }

  103. }
实现现象

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcHJlc3NpdmVseQ==,size_16,color_FFFFFF,t_70#pic_center.jpg

延时法

最初我设置的值为27,用逻辑分析仪发现时间为111.1us

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcHJlc3NpdmVseQ==,size_16,color_FFFFFF,t_70.jpg

此处设置值为26 ,时间为107.4us

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcHJlc3NpdmVseQ==,size_16,color_FFFFFF,t_70.jpg

此处设置值为25,时间为104.3us

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltcHJlc3NpdmVseQ==,size_16,color_FFFFFF,t_70.jpg

结束语

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


您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

1786

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部