蓝桥杯准备中---------------UART串行通信----------------人机交互系统(擅长)

来源:互联网 发布:有tm商标能上淘宝吗 编辑:程序博客网 时间:2024/05/17 20:27

#include<reg52.h>
#include<intrins.h>
sfr AUXR= 0x8e;
unsigned char TXtemp[10];
unsigned char RXtemp[10];
unsigned char readflag;
unsigned char ch_i;
bit overflag;
void delay()
{
 unsigned char i, j, k;

 _nop_();
 _nop_();
 i = 43;
 j = 6;
 k = 203;
 do
 {
  do
  {
   while (--k);
  } while (--j);
 } while (--i);
}
//////////////////////////////定时器初始化/////////////////////
void timer0_init()
{
 TMOD|=0X01;
 TH0=(65535-2000)/256;
 TL0=(65535-2000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}

///////////////////////////////串口初始化///////////////////////
void UartInit(void)  //9600bps@11.0592MHz
{
 PCON &= 0x7F;  //波特率不倍速
 SCON = 0x50;  //8位数据,可变波特率
 AUXR &= 0xBF;  //定时器1时钟为Fosc/12,即12T
 AUXR &= 0xFE;  //串口1选择定时器1为波特率发生器
 TMOD &= 0x0F;  //清除定时器1模式位
 TMOD |= 0x20;  //设定定时器1为8位自动重装方式
 TL1 = 0xFD;  //设定定时初值
 TH1 = 0xFD;  //设定定时器重装值
 ET1 = 0;  //禁止定时器1中断
 TR1 = 1;  //启动定时器1
 ES=1;
}
//通过串口发送字符串
void uart_sendstring(unsigned char *str)
{
    unsigned char *p;
   
    p = str;
    while(*p != '\0')
    {
        SBUF = *p;
  while(TI == 0);  //等待发送标志位置位
  TI = 0;
        p++;
    }
}

void main()
{
  P2=(P2&0X1F)|0XA0;
  P0=0X00;
  P2=P2&0X1F;

  UartInit();
  timer0_init();

  while(1)
  {  
    if(overflag)
   {
    overflag=0;
   ch_i=0;
   uart_sendstring(RXtemp);
   }
  }

}

void timer0() interrupt 1
{
 static unsigned char num;
 TH0=(65535-2000)/256;
 TL0=(65535-2000)%256;
   num++;
   if(num==100)
   {
    num=0;
  readflag=1;
   }
}
void uart() interrupt 4
{
  if(RI)
   {
   RI=0;
   RXtemp[ch_i]=SBUF;
   ch_i++;   
   if(RXtemp[ch_i-1]=='G')overflag=1; 
  }
}

 

这是最基本中断接受字符串写法。  根据此可延伸各种上位机指令需改参数,发送命令等操作。。。。。

0 0
原创粉丝点击