IO口模拟串口问题 合泰HT66F70A

2020-03-12 19:44发布

问下大家合泰的单片机怎么用IO口模拟串口通信?用的是HT66F70A,这个单片机不带UART,所以要模拟串口,但是我写的程序发送可以实现,但是接收部分总是不对,已经弄了好几个星期了,简直要崩溃。。。
代码稍后贴出
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
Mr_D
1楼-- · 2020-03-12 23:12

主程序部分

  1. #include "HT66F70A.h"

  2. #include "UART_Analog.h"

  3. #include "sys.h"

  4. #include "string.h"


  5. char x[]="Hello! ";

  6. void main()

  7. {


  8.         UART_Init();

  9.         uchar i;

  10.         while(1)

  11.         {

  12.                 if(RXD==0)

  13.                 //        for(i=0;i

  14.                 //                Send(x[i]);

  15.                         Send(Receive());

  16.         }


  17. }


Mr_D
2楼-- · 2020-03-12 23:16
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
3楼-- · 2020-03-12 23:18
啊,不好意思,已经解决了
coody
4楼-- · 2020-03-13 04:43
模拟串口其实很简单,就是按串口的位时间发送或接收就好了。
我从上世纪90年代就经常软件模拟多路全双工串口用于工控,很好的。
datouyuan
5楼-- · 2020-03-13 05:25
 精彩回答 2  元偷偷看……
Mr_D
6楼-- · 2020-03-13 10:47


模拟串口其实很简单,就是按串口的位时间发送或接收就好了。
我从上世纪90年代就经常软件模拟多路全双工串 ...


嗯嗯,有点东西没有搞明白,已经解决了

一周热门 更多>