标题: 大神帮忙看看单片机程序有没有错误,可以做优化一下吗 [打印本页]

作者: happy2058    时间: 2021-5-25 02:11
标题: 大神帮忙看看单片机程序有没有错误,可以做优化一下吗
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)                        //1T

unsigned char buf[0x10];
unsigned char str[];      //字符串数组
unsigned char rp = 0;
unsigned char sp = 0;


sfr AUXR = 0x8e;
sfr T2L = 0xD7;
sfr T2H = 0xD6;

void UartInit()
{
        SCON = 0x50;                         //可变波特率8位数据方式
        AUXR = 0x15;                        //不分频
        T2L = BRT;
        T2H = BRT >> 8;
                                 
        ES = 1;                                 //使能串口中断
        EA = 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  
{
        EA = 0;
    if (RI)  
        {  
                        RI = 0 ;

                        buf[ rp++ ] = SBUF;
                        rp &= 0x0f;      
        }
    EA = 1;

}

   main()  
{  
    UartInit(); //初始化串口  
    while ( 1 )  
        {
                if( rp ^ sp )
                {
                        send_char_com( buf[ sp++ ] );
                        sp &= 0x0f;
                }
        }
}

    if( rp ^ sp ) 这个不好理解,谢谢


作者: 18701931930    时间: 2021-5-27 21:18
//向串口发送一个字符串,strlen为该字符串长度  
void send_string_com( unsigned char *str, unsigned int strlen)        这里是不是要先定义字符串数组,这里能不能优化一下
{  
     unsigned int k;       for(k=0;k<strlen;k++)
        send_char_com(*str++);
}



^是异或运算符,具体怎么运算的自己查吧,一两句话算不清楚。百度上一查一大堆。

作者: wulin    时间: 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

当串口中断函数收到一个字节 rp++,
if(rp^sp)判断rp、sp相同为假不执行{},rp、sp不同为真执行{}。
"^"是异或逻辑运算符,可以理解为不进位的2进制加法。
0000 0100
+0000 0101
-----------
0000 0001
作者: zikanggong    时间: 2021-5-28 12:02
这么简洁的程序还优化啊。
作者: happy2058    时间: 2021-5-29 00:01
wulin 发表于 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

感谢,回头补一下知识
作者: happy2058    时间: 2021-5-29 00:09
wulin 发表于 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

可以帮我看看这个吗
/向串口发送一个字符  
void send_char_string( unsigned char *ch)  
{                 
                  while(*ch!=0x3c)          
            {
                         SBUF = *ch++;  
             while (TI==0);  
             TI= 0 ;  
                        }
                        SBUF = *ch;         //最后发送0x3c
                        while (TI==0);  
             TI= 0 ;
                        _nop_();
}   
作者: happy2058    时间: 2021-5-29 00:10
wulin 发表于 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

发送一个组数,结尾是0x3c.
作者: wulin    时间: 2021-5-29 06:49
happy2058 发表于 2021-5-29 00:09
可以帮我看看这个吗
/向串口发送一个字符  
void send_char_string( unsigned char *ch)  

这段代码根据标识符自动确定发送数据串长度,没啥毛病。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1