×
单片机 > 单片机程序设计 > 详情

51单片机串口发送和中断接收程序

发布时间:2020-06-02 发布时间:
|
#include

void leddisplay();                    // 数码管显示
void delayms(unsigned int k);         // 延时 n ms
void USART_SEND(unsigned char dat);   // 串口发送子程序
unsigned char data ledxs[8]={16,16,16,16,16,0,0,18}; // 数码管显示缓冲区
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0xff,0x76};
                          //共阴极代码 0-F,  全灭,全亮,H
void main()
{
   unsigned char dat=0,i;
   delayms(200);
   TMOD=0x20;    // 定时器1模式2,8位自动重装
   TL1=0xe6;
   TH1=0xe6;     // 波特率1200
   TR1=1;
   SCON=0x50;   // 串口方式1,接收允许,8位数据,无校验,1位起始位,1位结束位
   EA=1;        // 开串口中断
   ES=1;        // 开总中断
   while(1)
   {
     for(i=0;i<60;i++)
       leddisplay();     // 循环显示60次,延时480ms
     USART_SEND(dat);    // 串口发送数据(0-255)
     dat++;
     if(dat==256) dat=0;
     
   }
}
void USART_SEND(unsigned char dat)   // 串口发送子程序
{

   SBUF=dat;           // 发送数据
   while(TI==0);       // 等待发送完成
   TI=0;
}
void USART_RCV_INT(void) interrupt 4 using 1    // 串口接收中断服务程序
{
  unsigned char dat;
  if(RI==1)            // 判断是否是接收中断
  {
    RI=0;
    dat=SBUF;          // 接收数据
    ledxs[5]=dat/16;
    ledxs[6]=dat%16;   // 接收数据转换成16进制显示
    ledxs[7]=18;       
  }
}
void leddisplay()      // LED显示子程序
{
  P2=0xdf;
  P0=tab[ledxs[0]];
  delayms(1);
  P0=0x00;

  P2=0x5f;
  P0=tab[ledxs[1]];
  delayms(1);
  P0=0x00;

  P2=0x9f;
  P0=tab[ledxs[2]];
  delayms(1);
  P0=0x00;

  P2=0x1f;
  P0=tab[ledxs[3]];
  delayms(1);
  P0=0x00;

  P2=0xff;
  P0=tab[ledxs[4]];
  delayms(1);
  P0=0x00;

  P2=0x7f;
  P0=tab[ledxs[5]];
  delayms(1);
  P0=0x00;

  P2=0xbf;
  P0=tab[ledxs[6]];
  delayms(1);
  P0=0x00;

  P2=0x3f;
  P0=tab[ledxs[7]];
  delayms(1);
  P0=0x00;
}
void delayms(unsigned int k)  //延时 n ms
{
  while(k)
  {
    int i;
    i=110;
    while(i--);
    k=k-1;
  }
}

关键字:51单片机  串口发送  中断接收

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址