找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2495|回复: 7
打印 上一主题 下一主题
收起左侧

大神帮忙看看单片机程序有没有错误,可以做优化一下吗

[复制链接]
跳转到指定楼层
楼主
ID:734017 发表于 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 ) 这个不好理解,谢谢

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:554500 发表于 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++);
}



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

使用道具 举报

板凳
ID:213173 发表于 2021-5-28 09:12 | 只看该作者
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

当串口中断函数收到一个字节 rp++,
if(rp^sp)判断rp、sp相同为假不执行{},rp、sp不同为真执行{}。
"^"是异或逻辑运算符,可以理解为不进位的2进制加法。
0000 0100
+0000 0101
-----------
0000 0001
回复

使用道具 举报

地板
ID:919834 发表于 2021-5-28 12:02 | 只看该作者
这么简洁的程序还优化啊。
回复

使用道具 举报

5#
ID:734017 发表于 2021-5-29 00:01 | 只看该作者
wulin 发表于 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

感谢,回头补一下知识
回复

使用道具 举报

6#
ID:734017 发表于 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_();
}   
回复

使用道具 举报

7#
ID:734017 发表于 2021-5-29 00:10 | 只看该作者
wulin 发表于 2021-5-28 09:12
这段示例程序写得比较好,没有什么需要优化
只是楼主对 if(rp^sp) 不好理解

发送一个组数,结尾是0x3c.
回复

使用道具 举报

8#
ID:213173 发表于 2021-5-29 06:49 | 只看该作者
happy2058 发表于 2021-5-29 00:09
可以帮我看看这个吗
/向串口发送一个字符  
void send_char_string( unsigned char *ch)  

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表