⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51串口通信程序.txt

📁 串口
💻 TXT
字号:
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,
其余类推……,最后一个字节为前几个字节后7位的异或校验和。 

  测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收
框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 


#include <reg51.h>
 #include <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 
// TI=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); 
      } 
   }  
 } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -