搜索
bottom↓
回复: 15

软件模拟串口程序模块

[复制链接]

出0入4汤圆

发表于 2016-2-17 08:27:13 | 显示全部楼层 |阅读模式
我用过的感觉比较好的软件模拟串口程序.
使用方法见程序中详细说明.
多谢大家测试并指教.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入53汤圆

发表于 2016-2-17 08:44:13 | 显示全部楼层
我帮你贴出来
  1. /******************************************************
  2. 使用方法:
  3. 1.在"MR_macro.h"中正确填入MCU类型及MCU主频参数
  4. 2.正确设定TX及RX引脚配置宏定义
  5. 3.确定DELAY_TX参数:
  6.     a.改宏定义#define UART_DEBUG X  为 #define UART_DEBUG 1(准备调用TX_BD())
  7.     b.在main()中的端口init()后加入TX_BD());while();语句,编译并烧录
  8.     c.串行助手中若收到0x41 则其后数字即为可用的DELAY_TX值(尽量取中间值)。
  9. 4.确定DELAY_RX参数:
  10.     a.改宏定义#define UART_DEBUG X  为 #define UART_DEBUG 2(准备调用RX_BD())
  11.     b.在#define DELAY_TX 0x?? 宏定义中填入上步中获得的正确值
  12.     c.在main()中的端口init()后加入RX_BD());while();语句,编译并烧录
  13.     d.串行助手以10mS为间隔时间不停发'A'(0x41),
  14.       收到的非0数字即为可用的DELAY_RX值(尽量取中间值)。
  15. 5.从调试模式改回正常使用模式:
  16.     a.改宏定义#define UART_DEBUG X  为 #define UART_DEBUG 3(准备正常模式使用)
  17.     b.将上述正确的DELAY_TX及DELAY_RX值填入宏定义中
  18.     c.去掉main()中用于调试的TX_BD());while();或RX_BD());while();语句.
  19. ******************************************************/
  20. #include "MR_macro.h"
  21. #include "DataType.h"
  22. #include "UART_IO.h"
  23. //**************串口程序*********
  24. //TX及RX引脚配置:
  25. #define UARTPORT PORTD
  26. #define UARTDDR DDRD
  27. #define UARTPIN PIND
  28. #define RXPIN PD2
  29. #define TXPIN PD3

  30. uchar delay_tx;
  31. uchar delay_rx;
  32. #define UART_DEBUG 2//1:TX_DEBUG 2:RX_DEBUG 3:NORMAL

  33. #if UART_DEBUG==1
  34. #define DELAY_TX delay_tx
  35. #define DELAY_RX 0x14
  36. #elif UART_DEBUG==2
  37. #define DELAY_TX 0xcc//调用TX_DB()获得的正确值填入些
  38. #define DELAY_RX delay_rx
  39. #elif UART_DEBUG==3
  40. //常用TX,RX参数列表:
  41. // 1M 0x11 0x14
  42. // 2M
  43. // 4M 0x5d 0x68
  44. // 6M
  45. // 8M 0xcc 0xde
  46. //12M
  47. //16M
  48. //20M
  49. #define DELAY_TX 0xcc//调用TX_DB()获得的正确值填入些
  50. #define DELAY_RX 0xde//调用RX_DB()获得的正确值填入些
  51. #endif
  52. //******IO模拟串口子程序声明********
  53. static void wait(uchar time);//延时等待程序
  54. void v_putchar(uchar data);//发送单个字节
  55. uchar v_getchar(void);//接收单个字节
  56. void v_puts(uchar *str);//发送字符串
  57. void TX_DB(void);
  58. void RX_DB(void);
  59. //********子程序定义***********
  60. void TX_DB(void)
  61. {
  62.     //***************DELAY_TX确定程序**************
  63.    //串行助手中若收到0x41 则其后数字即为可用的DELAY_TX值。
  64.    //取尽量踞中间的值,有利于通信的稳定性
  65.    for(delay_tx=0;delay_tx<0xff;delay_tx++)
  66.    {  v_putchar('A');
  67.       wait(0xff);
  68.           v_putchar(delay_tx);
  69.           wait(0xff);
  70.    }
  71. }
  72. void RX_DB(void)
  73. {
  74.    /***************DELAY_RX确定程序**************/
  75.    //确定好DELAY_TX后才可确定DELAY_RX
  76.    //串行助手以10mS为间隔时间不停发'A'(0x41), 收到的非0数字即为可用的DELAY_RX值。
  77.    //取尽量踞中间的值,有利于通信的稳定性
  78.    for(delay_rx=1;delay_rx<0xff;delay_rx++)
  79.    {
  80.       if(v_getchar()==0x41) v_putchar(delay_rx);
  81.           else v_putchar(0);
  82.    }
  83. }
  84. void wait(uchar time)//延时等待程序
  85. {  uchar i;
  86.    for(i=0;i<time;i++);
  87. }

  88. //uchar delay_tx,delay_rx;//正常程序中要用DELAY_TX及DELAY_RX替换
  89. void v_putchar(uchar data)//发单字节程序
  90. {  uchar i;
  91.    for(i=0;i<10;i++)
  92.    {  if(i==0) UARTPORT&=~(1<<TXPIN);//第一次发起始位(发送脚拉低)
  93.       else if(i<9)
  94.       {  if(data&0x01) UARTPORT|=(1<<TXPIN);//待发位为高,置高发送脚
  95.              else UARTPORT&=~(1<<TXPIN);//待发位为低,置低发送脚
  96.                  data>>=1;//准备发下一位
  97.           }
  98.       else UARTPORT|=(1<<TXPIN);//最后发停止位
  99.           wait(DELAY_TX);//发送位延时(正常程序中要用DELAY_TX替换)
  100.    }
  101. }

  102. uchar v_getchar(void)//接收单字节程序
  103. {  uchar i;
  104.    uchar data;
  105.    while(UARTPIN&(1<<RXPIN));//等待起始位(若用中断方式则要删除此行)
  106.    for(i=0;i<9;i++)//接收8位数据和1位停止位
  107.    {  wait(DELAY_RX);//接收位延时(正常程序中要用DELAY_RX替换)
  108.       if(i==8) break;//停止位跳出(不放入数据中)
  109.       data>>=1;//准备接收下一位
  110.           if(UARTPIN&(1<<RXPIN)) data|=0x80;//接收位为高,置高数据位
  111.           else data&=0x7f;//接收位为低,置低数据位
  112.    }
  113.    return data;//返回接收到的数据
  114. }

  115. void v_puts(uchar *str)//发送字符串
  116. {
  117.     do
  118.         {
  119.             v_putchar(*str);//发送当前字符
  120.                 if(*str==0xff) break;//所有字符串最后一个数据必须为0xff,发完0xff数据则结束发送
  121.                 ++str;//准备发下一个字符
  122.         }while(1);
  123. }
  124. //****************************************/


  125. #ifndef _UART_IO_H
  126. #define _UART_IO_H

  127. extern unsigned char delay_tx;
  128. extern unsigned char delay_rx;

  129. //******IO模拟串口子程序********
  130. extern void v_putchar(uchar data);//发送单个字节
  131. extern uchar v_getchar(void);//接收单个字节
  132. extern void v_puts(uchar *str);//发送字符串
  133. extern void TX_DB(void);
  134. extern void RX_DB(void);
  135. //*************************************/

  136. #endif
复制代码

出0入0汤圆

发表于 2016-2-17 08:44:21 | 显示全部楼层
  下来看看

出0入0汤圆

发表于 2016-2-17 08:44:24 | 显示全部楼层
感谢楼主分享,收藏备用了

出0入0汤圆

发表于 2016-2-17 08:45:51 | 显示全部楼层
STC有现成的软件包,随你移植到任何MCU,我曾经移植到STM8,很好用

出0入0汤圆

发表于 2016-2-17 08:59:07 | 显示全部楼层
谢谢楼主分享,先学习下

出0入0汤圆

发表于 2016-2-17 09:19:49 | 显示全部楼层
谢谢楼主分享,先学习下

出0入8汤圆

发表于 2016-2-17 09:21:22 | 显示全部楼层
软件延时的?
不好吧

出0入4汤圆

发表于 2016-2-17 09:21:53 | 显示全部楼层
感谢分享,琢磨研究

出0入0汤圆

发表于 2016-2-17 09:23:40 | 显示全部楼层
IO口模拟串口接收代码弄不好,刚好是需要的,谢谢楼主分享

出0入0汤圆

发表于 2016-2-17 13:19:00 | 显示全部楼层
谢谢楼主,收藏备用。

出0入0汤圆

发表于 2016-2-17 13:28:25 | 显示全部楼层

出0入0汤圆

发表于 2016-2-17 13:49:41 | 显示全部楼层
xyz2008 发表于 2016-2-17 08:45
STC有现成的软件包,随你移植到任何MCU,我曾经移植到STM8,很好用

多谢提醒!

出0入4汤圆

 楼主| 发表于 2016-2-17 16:28:35 | 显示全部楼层
xyz2008 发表于 2016-2-17 08:45
STC有现成的软件包,随你移植到任何MCU,我曾经移植到STM8,很好用

STC的模拟串口要用到硬件定时器吗?

出0入59汤圆

发表于 2016-2-17 16:49:41 | 显示全部楼层
这个代码实用性较差,  

软件延时;
接收函数一直等待,占资源

出140入158汤圆

发表于 2016-2-17 17:11:49 | 显示全部楼层
本帖最后由 amigenius 于 2016-2-17 17:17 编辑

用软件延时,惨不忍睹,如果你的系统没有中断且只发送几个字节,还凑合,有中断的话,误码率不知会有多高,而且还是阻塞发送和接收,CPU就在等待中度过。兄弟起码用个定时中断来处理一下吧。我另外开个贴发个用定时中断的模拟串口吧,用起来除了占一点点cpu,其余和硬件串口一样,不过当然没有硬件DMA,呵呵。

软件UART:http://www.amobbs.com/thread-5643873-1-1.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 00:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表