进来学习串口通讯,求指点!

2019-07-15 21:39发布

这个例程是开发板自带的,功能是PC向单片机发数据,单片机再反馈。里面P0口是我为了直观显示单片机向PC机返回数据加上去的,但我发现发字符串时返回没问题,但如果返回单个字符或数字则返回出问题,有时甚至只接受没返回(用的是串口调试助手)

#include "reg51.h"      

#define uchar unsigned char
#define uint  unsigned int

uchar ch;               //用于存放串口接收到的数据
bit read_flag= 0 ;      //取数标志位

//初始化串口
void init_com( void )

{
  SCON = 0x50;   // 设定通信方式为方式1,允许接收,相当于REN = 1; SM1 = 1;   
  PCON = 0x00;   //SMOD=0,该语句可去掉
  IE |= 0x90 ;   //打开串口中断, 相当于 EA = 1;ES = 1;  

  //以下4句设置T1
  TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率
  TH1=0xE6;      //定时器0赋初值,TH1=(256 - (12000000 / (32 * 12 * 1200)))=230;
  TL1=0xE6;      //TL1=(256 - (12000000 / (32 * 12 * 1200)))=230;
  TR1 = 1;       //启动T1

}
//串口中断函数
void serial () interrupt 4 using 3

{
    if (RI)

       {  
        RI = 0 ;       //此步必不可少,因为硬件不能将其置0   
        ch=SBUF;       //从SBUF中取出数据      
        read_flag= 1 ; //就置位取数标志
        }

}
//串口发送函数
void send_char( unsigned char ch1)

         {
            SBUF=ch1+1;       //将待发数据放到SBUF
            while (ti== 0); //等待TI=1(表示帧发送结束)发送
            TI= 0 ;         //此步必不可少,因为硬件不能将其置0  

          }
//主函数
void main(void)
{

  P0=0x0f;//  ------------------       
init_com( ) ;
       

while(1)
{
if (read_flag)      //如果取数标志已置位,就将读到的数从串口发出
    {
      read_flag= 0 ;  //取数标志清0
      P0=~P0;  // ----------       
      send_char(ch);  //将读到的数从串口发出        
    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。