C51串口中断接收和发送程序

//这是一个单片机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);
          }     }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值