百度空间 | 百度首页 
 
查看文章
 
51串口通信
2009-11-11 12:28

作业参考该程序的结构

可以在程序中设置缓冲区,中断程序只是把收到的数据放入缓冲区,而在主程序里处理这些数据.这样做的目的是减少中断程序执行时间, 允许的中断频率就增大了,即数据传输速度变大.

#include "reg51.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="0";
if(RI)
{
RI="0";     //
Rcv="SBUF";
Uart_SendData(Rcv); //返回接收数据,可以改为其他函数
}

}

另一个程序

甲机发送:

#include <reg51.h>

#define uchar unsigned char

uchar idata buf[16];

void main()

{

   TMOD=0x20;

   TH1=0xE6;TL1=0xE6;

   PCON=0x00;

   TR1=1;

   SCON=0x50;

   EA=1;ES=1;

   while(1);

}

  

void send_int() interrupt 4

{ uchar i,sum=0;

     

      if((SBUF^0xBB)!=0)

      {if(TI==1)

           TI=0;

           else(RI==1)

                 RI=0;

      }

     if (SBUF!=0)

      {for(i=0;i<16;i++)

           {SBUF=buf[i];

           sum+=buf[i];

              if(TI)

                 TI=0;}

       SBUF=sum;

        if(TI==1)

           TI=0;

           else(RI==1)

                 RI=0;}

           }

乙机接收:

#include <reg51.h>

   #define uchar unsigned char

     uchar idata buf[16];

      uchar sum;

      char HasData=0;   /* 0表示数据还未接受完,1表示数据已接收完*/

      void main()

      {   char i;

      TMOD=0x20;

       TH1=0xE6;TL1=0xE6;

        PCON=0x00;

        TR1=1;

       SCON=0x50;

        EA=1;ES=1;

        while(1)

         { if (HasData)

              for(i=0;i<16;i++)

              buf[i]=SBUF;

         }

   }

   void rcv_int() interrupt 4

   {    sum=0;

          if(SBUF^0xAA!=0)

          {if(RI=1)

               RI=0;

          }

          SBUF=0xBB;

          if(TI) TI=0;

          while(1)

          {   sum=0;

               char j;

               for(j=0;j<16;j++)

               {

                     if(RI) RI=0;

                     buf[i]=SBUF;

                     sum+=buf[i];

               }

               if(RI==1)

                     RI=0;

               if((SBUF^sum)==0)

               {

                     SBUF=0x00;

                     HasData=1;

                     break;

               }

               else

               {

                     SBUF=0xff;

                     if(TI==1)

                          TI=0;

               }

          }

    }

                 

  

      

         


类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu