当前位置: 首页 > 技术资料 > 51单片机串口检测程序

51单片机串口检测程序

QooIC.com 新闻出处:电子市场 | 发布时间:2011/5/13 15:07:16

  #i nclude "reg51_STC.H"

  #define uchar unsigned char

  #define uint unsigned int

  //--------------------------------------------------------------------------

  //函数名称:      UART_Init()

  //函数功能:      串口初始化函数,在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s

  //其他说明:      串口接收中断允许,发送中断禁止

  //--------------------------------------------------------------------------

  void UART_Init(void)

  {

  SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr

  TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload

  PCON |= 0x80 ; //SMOD=1;

  TH1 = 0xFA ; //Baud:9600 fosc="11".0592MHz

  ES=1;

  TR1 = 1 ;    // timer 1 run

  EA=1;

  }

  //--------------------------------------------------------------------------

  //函数名称:      main(void)

  //函数功能:      主函数

  //其他说明:      无

  //--------------------------------------------------------------------------

  void main(void)

  {

  UART_Init();

  while(1);

  }

  //--------------------------------------------------------------------------

  //函数名称:      Uart_SendData()

  //函数功能:      串口发送一个字节的数据

  //其他说明:      此程序供中断调用

  //--------------------------------------------------------------------------

  void Uart_SendData(uchar dat)

  {

  SBUF=dat; //写SBUF,开始发送

  while(TI==0); //等待发送

  TI="0";   //清发送标志位

  }

  //--------------------------------------------------------------------------

  //函数名称:      INT_UartRcv()

  //函数功能:      串口接收中断函数

  //其他说明:      无

  //--------------------------------------------------------------------------

  void INT_UartRcv(void) interrupt 4

  {

  uchar Rcv;

  if(RI)

  {

  RI=0;     //

  Rcv=SBUF;

  Uart_SendData(Rcv); //返回接收数据,可以改为其他函数

  }

  }

  NO。2

  #i nclude<reg52.h>

  #i nclude <string.h>

  #define INBUF_LEN 4 //数据长度

  unsigned char inbuf1[INBUF_LEN];

  unsigned char checksum,count3;

  bit read_flag= 0 ;

  void init_serialcomm( void )

  {

  SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr

  TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload

  PCON |= 0x80 ; //SMOD=1;

  TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz

  IE |= 0x90 ; //Enable Serial Interrupt

  TR1 = 1 ; // timer 1 run

  EA=1;

  }

  //向串口发送一个字符

  void send_char_com( unsigned char ch)

  {

  SBUF=ch;

  while (TI== 0 );

  TI= 0 ;

  }

  //向串口发送一个字符串,strlen为该字符串长度

  void send_string_com( unsigned char *str, unsigned int strlen)

  {

  unsigned int k= 0 ;

  do

  {

  send_char_com(*(str + k));

  k++;

  } while (k < strlen);

  }

  //串口接收中断函数

  void serial () interrupt 4 using 3

  {

  if (RI)

  {

  unsigned char ch;

  RI = 0 ;

  ch=SBUF;

  if (ch> 127 )

  {

  count3= 0 ;

  inbuf1[count3]=ch;

  checksum= ch- 128 ;

  }

  else

  {

  count3++;

  inbuf1[count3]=ch;

  checksum ^= ch;

  if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )

  {

  read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,

  //就置位取数标志

  }

  }

  }

  }

  main()

  {

  init_serialcomm(); //初始化串口

  while ( 1 )

  {

  if (read_flag) //如果取数标志已置位,就将读到的数从串口发出

  {

  read_flag= 0 ; //取数标志清0

  send_string_com(inbuf1,INBUF_LEN);

  }

  }

  }