微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 进来学习串口通讯,求指点!

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

时间:10-02 整理:3721RD 点击:
这个例程是开发板自带的,功能是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);  //将读到的数从串口发出        
    }
}

不错的资料,值得分享

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

网站地图

Top