找回密码
 立即注册

QQ登录

只需一步,快速开始

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

各位大佬帮我看看,为啥单片机首发一次就不能接收数据了

[复制链接]
跳转到指定楼层
楼主
ID:477828 发表于 2020-3-28 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口助手。发送一次字符 能收到数据。但是显示一直发送中。不知道什么原因TI没有置为1  导致一直发送中。。。再给单片机发送数据就收不到数据了。
  1. #include <reg52.h>
  2.        
  3. #define uchar  unsigned char
  4. #define uint   unsigned int

  5. uchar buf;
  6. //volatile unsigned char sending;
  7. sbit led=P1^0;
  8. sbit sending = P1^1;

  9. //申明函数
  10. void delay(unsigned char i);
  11. void send(uchar d);
  12. void initUart(void);

  13. void main(void)
  14. {
  15.                 //初始化串口
  16.           initUart();
  17.     while(1);        
  18. }

  19. //初始化串口 9600
  20. void initUart(void){
  21.           SCON=0x50;      
  22.     PCON=0x00;         
  23.                        
  24.     TMOD=0x20;         
  25.     EA=1;
  26.     ES = 1;            
  27.     TL1=0xfd;
  28.     TH1=0xfd;           
  29.     TR1=1;
  30.           led = 0;
  31.           sending = 0;
  32. }

  33. //发送一个字节的数据,形参d即为待发送数据。
  34. void send(uchar d)                  
  35. {
  36.           sending=1;         //设置发送标志
  37.                 SBUF=d; //将数据写入到串口缓冲
  38.     while(sending); //等待发送完毕
  39. }


  40. /**
  41. * 延时函数
  42. **/
  43. void delay(unsigned char i)
  44. {
  45.         uchar j,k;
  46.         for(j=i;j>0;j--)
  47.                 for(k=125;k>0;k--);
  48. }

  49. /*********************************************************

  50. 串口接收

  51. *********************************************************/
  52. void  serial() interrupt 4
  53. {
  54.          //收到数据
  55.    if(RI){
  56.                   RI=0;   //清中断请求
  57.                         buf = SBUF;
  58.                         send(buf);
  59.          }
  60.          
  61.          if(TI){
  62.                   TI=0;
  63.                         sending=0;  //清正在发送标志
  64.          }
  65. }
复制代码



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

使用道具 举报

沙发
ID:235200 发表于 2020-3-28 15:51 | 只看该作者
void send(uchar d)                  
{
          sending=1;         //设置发送标志
                SBUF=d; //将数据写入到串口缓冲
    while(sending); //等待发送完毕
}
此程序写错了
应该为
void send(uchar d)                  
{
          SBUF=d; //将数据写入到串口缓冲
    while(!TI); //等待发送完毕
    TI=0;
}
回复

使用道具 举报

板凳
ID:477828 发表于 2020-3-28 16:19 | 只看该作者
csmyldl 发表于 2020-3-28 15:51
void send(uchar d)                  
{
          sending=1;         //设置发送标志

非常感谢!用你这个代码成功了
回复

使用道具 举报

地板
ID:213173 发表于 2020-3-28 17:47 | 只看该作者
你试试

  1. #include <reg52.h>
  2.         
  3. #define uchar  unsigned char
  4. #define uint   unsigned int

  5. uchar buf;
  6. //volatile unsigned char sending;
  7. sbit led=P1^0;
  8. //sbit sending = P1^1;

  9. //申明函数
  10. void delay(unsigned char i);
  11. void send(uchar d);
  12. void initUart(void);

  13. void main(void)
  14. {
  15.         //初始化串口
  16.         initUart();
  17.         while(1);        
  18. }

  19. //初始化串口 9600
  20. void initUart(void)
  21. {
  22.         SCON=0x50;      
  23.         PCON=0x00;         
  24.         TMOD=0x20;         
  25.         EA=1;
  26.         ES = 1;            
  27.         TL1=0xfd;
  28.         TH1=0xfd;           
  29.         TR1=1;
  30.         led = 0;
  31. //        sending = 0;
  32. }

  33. //发送一个字节的数据,形参d即为待发送数据。
  34. void send(uchar d)                  
  35. {
  36. //        sending=1;         //设置发送标志
  37.         SBUF=d; //将数据写入到串口缓冲
  38.         while(!TI);        //等待发送中断请求标志位为1
  39.         TI=0;                //发送中断请求标志位清0
  40. }


  41. /**
  42. * 延时函数
  43. **/
  44. /*
  45. void delay(unsigned char i)
  46. {
  47.         uchar j,k;
  48.         for(j=i;j>0;j--)
  49.                 for(k=125;k>0;k--);
  50. }
  51. */
  52. /*********************************************************

  53. 串口接收

  54. *********************************************************/
  55. void  serial() interrupt 4
  56. {
  57.         //收到数据
  58. //        if(RI){
  59.         RI=0;   //清中断请求
  60.         buf = SBUF;
  61.         led = ~led;
  62.         send(buf);

  63. //        }
  64.        
  65. //        if(TI){
  66. //        TI=0;
  67. //        sending=0;  //清正在发送标志
  68. //        }
  69. }
复制代码

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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