[MCU] IO口模拟串口问题 合泰HT66F70A

[复制链接]
12530|45
 楼主| Mr_D 发表于 2016-4-17 13:02 | 显示全部楼层 |阅读模式
问下大家合泰的单片机怎么用IO口模拟串口通信?用的是HT66F70A,这个单片机不带UART,所以要模拟串口,但是我写的程序发送可以实现,但是接收部分总是不对,已经弄了好几个星期了,简直要崩溃。。。
代码稍后贴出

评论

楼主,HT66F70A的模拟串口在吗可以发给我吗?邮箱1076406367@qq.com,我也是卡了很久,向您寻求一下帮助  发表于 2019-12-15 15:26
1014983343@qq.com可以分享一下程序吗?  发表于 2019-10-27 15:36
2955831751@qq.com 可以给我程序吗  发表于 2019-2-17 19:36
 楼主| Mr_D 发表于 2016-4-17 13:05 | 显示全部楼层
主程序部分
  1. #include "HT66F70A.h"
  2. #include "UART_Analog.h"
  3. #include "sys.h"
  4. #include "string.h"

  5. char x[]="Hello!\t";
  6. void main()
  7. {

  8.         UART_Init();
  9.         uchar i;
  10.         while(1)
  11.         {
  12.                 if(RXD==0)
  13.                 //        for(i=0;i<strlen(x);i++)
  14.                 //                Send(x[i]);
  15.                         Send(Receive());
  16.         }

  17. }
 楼主| Mr_D 发表于 2016-4-17 13:10 | 显示全部楼层
io口配置及模拟串口部分
注:RXD为_pc2口,TXD为_pc3口
  1. #include "HT66F70A.h"
  2. #include "sys.h"


  3. void Sys_Init()
  4. {
  5.         _wdtc=0xaf;        //关闭看门狗
  6.        
  7.         /*        PF2 PF5上拉输出使能        做指示灯,暂不使用        */
  8.         _pfc2=0;
  9.         _pfpu2=1;
  10.         _pfc5=0;
  11.         _pfpu5=1;
  12.        
  13.         /*        RX:PC2   TX:PC3        */
  14.         _pcc2=1;
  15.         _pcc3=0;
  16.        
  17.                        
  18. }

  19. void delay()
  20. {
  21.         volatile int i=50000;
  22.         while(i--);
  23. }
  24. [code]#include "HT66F70A.h"
  25. #include "UART_Analog.h"
  26. #include "sys.h"


  27. void UART_Init()
  28. {
  29.         Sys_Init();
  30.         /*        定时器装初值        */
  31.         _tm0al=0x41;//设置波特率为9600
  32.         _tm0ah=0x03;
  33.            /*        工作寄存器的设定        */
  34.         _tm0c0=0x98;//计数器暂停运行控制,时钟选择,TM总开关TnPAU=1 暂停
  35.         _tm0c1=0xc1;//工作模式,清零条件位       
  36.        
  37.        
  38.         _tm3al=0x41;//设置波特率为9600
  39.         _tm3ah=0x03;
  40.            /*        工作寄存器的设定        */
  41.         _tm3c0=0x98;//计数器暂停运行控制,时钟选择,TM总开关TnPAU=1 暂停
  42.         _tm3c1=0xc1;//工作模式,清零条件位       
  43.        
  44. }

  45. void Waitting0()        //等待计时器0溢出
  46. {
  47.         while(!_t0af);
  48.         _t0af=0;       
  49. }

  50. void Waitting3()        //等待计时器3溢出
  51. {
  52.         while(!_t3af);
  53.         _t3af=0;       
  54. }

  55. int judge(char input,int j)
  56. {
  57.         if(input&j)
  58.                 return 1;
  59.         else
  60.                 return 0;       
  61. }

  62. void Send(char input)
  63. {

  64.         uchar i=8;
  65.         int j=0x01;
  66.         _t0pau=0;        //开始计时       
  67.         TXD=0;
  68.         Waitting0();
  69.         while(i--)
  70.         {
  71.                 TXD=judge(input,j);
  72.                 Waitting0();
  73.                 j<<=1;
  74.         }
  75.         TXD=1;
  76.         Waitting0();
  77.         _t0pau=1;
  78.        
  79.         _pf5=~_pf5;        //指示灯               
  80. }

  81. char Receive()
  82. {

  83.         uchar i=8;
  84.         char receive=0;
  85.         _t3pau=0;        //开始计时

  86.         if(RXD==0)
  87.         {
  88.                
  89.                 Waitting3();
  90.                 while(i--)
  91.                 {
  92.                         if(RXD)
  93.                                 receive|=0x80;
  94.                         Waitting3();
  95.                         receive>>=1;               
  96.                 }
  97.        
  98.                 Waitting3();
  99.                 if(RXD)
  100.                         _t3pau=1;        //停止计时               
  101.         }
  102.         return receive;
  103. }
[/code]
 楼主| Mr_D 发表于 2016-4-17 21:27 | 显示全部楼层
啊,不好意思,已经解决了
coody 发表于 2016-4-17 22:36 | 显示全部楼层
模拟串口其实很简单,就是按串口的位时间发送或接收就好了。
我从上世纪90年代就经常软件模拟多路全双工串口用于工控,很好的。

评分

参与人数 1威望 +1 收起 理由
Mr_D + 1 赞一个!

查看全部评分

 楼主| Mr_D 发表于 2016-4-18 18:06 | 显示全部楼层
coody 发表于 2016-4-17 22:36
模拟串口其实很简单,就是按串口的位时间发送或接收就好了。
我从上世纪90年代就经常软件模拟多路全双工串 ...

嗯嗯,有点东西没有搞明白,已经解决了
 楼主| Mr_D 发表于 2016-4-18 18:07 | 显示全部楼层
datouyuan 发表于 2016-4-18 16:26
给你一个用状态机做的模拟串口供参考,占用一个定时器中断,但效率很高.虽然是51MCU,但移植到其它mcu是很简单 ...

谢谢,有点东西没有弄明白,已经解决了
zhlcm 发表于 2016-4-26 09:20 | 显示全部楼层
什么原因啊?
hebutwangyun 发表于 2016-4-27 16:21 | 显示全部楼层

为什么没有  UART_Analog.h
 楼主| Mr_D 发表于 2016-4-27 22:02 | 显示全部楼层

时序不对,语句顺序改一下就可以了
 楼主| Mr_D 发表于 2016-4-27 22:03 | 显示全部楼层
hebutwangyun 发表于 2016-4-27 16:21
为什么没有  UART_Analog.h

因为这个头文件里面我只进行了函数声明,所以就没贴出来
韩小阳 发表于 2016-4-29 21:06 | 显示全部楼层
具体是哪里时许不对呢?请教一下
韩小阳 发表于 2016-4-29 21:09 | 显示全部楼层
能把具体程序发一下么,谢谢
韩小阳 发表于 2016-5-2 14:08 | 显示全部楼层
您好我很着急我想要看一下您改那个程序的完整版可以发给我么
Blue-Blue 发表于 2016-5-4 23:46 | 显示全部楼层
Mr_D 发表于 2016-4-17 21:27
啊,不好意思,已经解决了

求分享如何解决,因为上面的程序好像接收时间短的话,会乱码
Blue-Blue 发表于 2016-5-4 23:50 | 显示全部楼层
Mr_D 发表于 2016-4-27 22:02
时序不对,语句顺序改一下就可以了

语句顺序怎么改?求指导
 楼主| Mr_D 发表于 2016-5-5 17:33 | 显示全部楼层
韩小阳 发表于 2016-5-2 14:08
您好我很着急我想要看一下您改那个程序的完整版可以发给我么

留个邮箱,我把程序发给你
 楼主| Mr_D 发表于 2016-5-5 17:33 | 显示全部楼层
Blue-Blue 发表于 2016-5-4 23:50
语句顺序怎么改?求指导

留个邮箱,我把程序发给你
rock24 发表于 2016-5-7 16:32 | 显示全部楼层
Mr_D 发表于 2016-5-5 17:33
留个邮箱,我把程序发给你

楼主可以把程序发我看一下吗?1093735015@qq.com谢谢。
Fearon 发表于 2016-5-25 19:42 | 显示全部楼层
楼主你好,可以看一看你的串口模拟程序的完整版嘛??我才开始学单片机,,,,491674105@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

2

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