天天看點

單片機C51序列槽接收(中斷)和發送例程

//這是一個單片機C51序列槽接收(中斷)和發送例程,可以用來測試51單片機的中斷接收

//和查詢發送,另外我覺得發送沒有必要用中斷,因為程式的開銷是一樣的

//程式編寫: 龔建偉  [email protected]

//技術首頁:http://www.gjwtech.com

//您有這方面的問題可以和我讨論

#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);

          }

    }

}