微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 模拟串口求助帮帮忙~~感激不尽

模拟串口求助帮帮忙~~感激不尽

时间:10-02 整理:3721RD 点击:

接收时就只有几个字节能接收到~~~如FF,FB,77等,而且不管发送什么十六进制的数,接收到的都是这类FF,FB,FD,固定的几个·····
帮助啊~~~
源程序
/**************************
***    模拟串口                 **
***************************/
#include<reg51.h>
#define uchar unsigned char
//#define timer0_en TL1=TH1;TR1=1;  //启动T1
#define timer0_dis TR1=0;         //关闭T1
volatile unsigned char F_TM;        //标志位
sbit SND=P1^0; //模拟发送端
sbit REC=P1^1;        //模拟接受端

/*ACC累加器作为发送的移位寄存器         */
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
//定时器T1中断
void Timer1() interrupt 3
{
   F_TM=1;                  
}

/*发送一个字符,数据格式为一个起始位(0),8个数据位,一个停止位(1)*/
void SENDCHAR(uchar GETCH)
{
    ACC=GETCH;
        F_TM=0;                //中断标志清零
        SND=0;
        //timer0_en;            //计数器T0启动
         TR1=1;
        while(!F_TM);
        SND=ACC0;             //送出低位
        F_TM=0;                             //软件对中断标志清零
    while(!F_TM);
        SND=ACC1;      
        F_TM=0;               
    while(!F_TM);
        SND=ACC2;      
        F_TM=0;        
        while(!F_TM);
        SND=ACC3;      
        F_TM=0;        
        while(!F_TM);
        SND=ACC4;      
        F_TM=0;        
    while(!F_TM);
        SND=ACC5;      
        F_TM=0;        
        while(!F_TM);
        SND=ACC6;      
        F_TM=0;        
        while(!F_TM);
        SND=ACC7;      
        F_TM=0;               //依次由低至高送出8位数据
        while(!F_TM);
        SND=1;                    //停止位
        F_TM=0;
        while(!F_TM);
        timer0_dis;              //关闭计时器
}
                   //接收一个字符
uchar  GETCHAR()
{
//timer0_en;
  TR1=1        ;
F_TM=0;
while(!F_TM);   //等待过起始位
ACC0=REC;
TL0=TH0;
F_TM=0;
while(!F_TM);
ACC1=REC;
F_TM=0;
while(!F_TM);
ACC2=REC;
F_TM=0;
while(!F_TM);
ACC3=REC;
F_TM=0;
while(!F_TM);
ACC4=REC;
F_TM=0;
while(!F_TM);
ACC5=REC;
F_TM=0;
while(!F_TM);
ACC6=REC;
F_TM=0;
while(!F_TM);
ACC7=REC;
F_TM=0;
while(!F_TM)
{
   if(REC)                        //判断停止位,并跳出
   {
      break;
   }
}
timer0_dis;   //停止计时器
return ACC;
   
}
void init()    // 初始化uart
{
TMOD=0x20;    // 定时器1定时器方式  工作模式2,可自动重载的8位计数器常把定时计数器0以模式2作为串行口波特率发生器
SCON=0x50;    // 选择工作模式1使能接收,允许发送,允许接收
EA=1;         // 开总中断
ET1=1;      // 打开定时器中断
TF1=0;
PCON=0x80;   // 8位自动重载,波特率加倍
TH1=0xf3;    // 用4800波特率
//TH1=0xfa;                //9600
TL1=TH1;   
TR1=0;      // 在发送或接收时打开
}
bit startbit()         //检查起始位
{
   return(REC==0);
}
void main()
{
    uchar gchar;
    init();
   while(1)
  {
         
     if(startbit())
         {
             gchar=GETCHAR();
                   SENDCHAR(gchar);
                 
         }        
  }
}

补充一点:
在串口调试助手发送分别:01, 02, 03, 04, 05,06,07,08,09,0a,0b,0c,0d,0e,0f
接收到的是:                   7B, DB, DB,  7B,   7B,B7,B7,7B,7B,DB,DB,7B,7B,6F,6F
然后如果发送,7B,B7,DB,6F,
则可以接收回来:7B,B7, DB,6F,
这是为什么呢?
求大神赐教

自己先顶一下

时序不对吧,直接用示波器看一下,如送AA、55等数据

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top