找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1526|回复: 3
收起左侧

单片机串口发送问题,为什么会会发送几十次?

[复制链接]
ID:390880 发表于 2018-10-21 10:45 | 显示全部楼层 |阅读模式
如题,单片机串口发送数据会连续发送几十条数据,求解!
  1. #include <AT89X52.h>
  2. sbit E=P2^3;               
  3. sbit RW=P2^4;              
  4. sbit RS=P2^5;
  5. sbit key1=P1^0;
  6. sbit key2=P1^1;
  7. sbit key3=P1^2;
  8. unsigned char disbuf,j,write,key,keyf;
  9. void ckzd (void) interrupt 4
  10. {
  11.         if(RI==1)
  12.         {
  13.                 disbuf=SBUF;
  14.                 RI=0;
  15.         }
  16.         if(TI==1) TI=0;
  17. }
  18. //**************************************液晶启动代码**********

  19. void Delay(unsigned int t) //延时
  20. {
  21.     unsigned int k;      
  22.     for(k=0;k<t;k++);   
  23. }

  24. void LCD1602_busy(void)//检测忙状态
  25. {
  26.     P0_7=1;              
  27.     RS=0;               
  28.     RW=1;               
  29.     E=1;                 
  30.     while(P0_7==1);      
  31.     E=0;                 
  32. }

  33. void Write_com(unsigned char combuf)
  34. {
  35.     RS=0;               
  36.     RW=0;               
  37.     P0=combuf;         
  38.     E=1;                 
  39.     E=0;                 
  40. }

  41. void Write_busycom(unsigned char combuf)//检测忙状态并写指令
  42. {
  43.     LCD1602_busy();            
  44.     Write_com(combuf);
  45. }

  46. void Write_busydata(unsigned char databuf)//检测忙状态并写数据
  47. {
  48.     LCD1602_busy();     
  49.     RS=1;               
  50.     RW=0;               
  51.     P0=databuf;         
  52.     E=1;                 
  53.     E=0;                 
  54. }

  55. void LCD1602_Write_address(unsigned char x,unsigned char y)//写地址
  56. {
  57.      x&=0x0f;            
  58.      y&=0x01;            
  59.      if(y==0)            
  60.          Write_busycom(x|0x80);        
  61.      else               
  62.          Write_busycom((x+0x40)|0x80);
  63. }


  64. void LCD1602_init(void)//液晶初始化
  65. {
  66.      Delay(1500);               //调用延时函数
  67.      Write_busycom(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  68.      Delay(500);                //调用延时函数
  69.      Write_busycom(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  70.      Delay(500);                //调用延时函数
  71.      Write_busycom(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  72.      Write_busycom(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  73.      Write_busycom(0x08);  //显示功能关,无光标
  74.      Write_busycom(0x01);  //清屏
  75.      Write_busycom(0x06);  //写入新的数据后,光标右移,显示屏不移动
  76.      Write_busycom(0x0C);  //显示功能开,无光标
  77. }


  78. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  79. {
  80.      LCD1602_Write_address(x,y);    //先将地址信息写入
  81.      Write_busydata(buf);  //再写入要显示的数据
  82. }
  83. //********************************液晶结束代码*************
  84. void main()
  85. {
  86.         LCD1602_init();
  87.         TMOD&=0x0F;
  88.         TMOD|=0x20;
  89.         SCON=0x50;
  90.         TH1=0xFA;
  91.         TL1=0xFA;
  92.         TR1=1;
  93.         EA=1;
  94.         ES=1;
  95.         while(1)
  96.         {
  97.                 //液晶显示读取到的串口接收数据
  98.                 LCD1602_Disp(0,0,'R');
  99.                 LCD1602_Disp(1,0,':');
  100.                 LCD1602_Disp(2,0,'0');
  101.                 LCD1602_Disp(3,0,'x');
  102.                 //高四位
  103.                 j=disbuf>>4;
  104.                 if(j<10)        j=j+'0';
  105.                 else j=j-10+'A';
  106.                 LCD1602_Disp(4,0,j);
  107.                 //低四位
  108.                 j=disbuf&0x0F;
  109.                 if(j<10) j=j+'0';
  110.                 else j=j-10+'A';
  111.                 LCD1602_Disp(5,0,j);
  112.                 //************************
  113.                 //液晶显示串口欲发送数据
  114.                 LCD1602_Disp(0,1,'W');
  115.                 LCD1602_Disp(1,1,':');
  116.                 LCD1602_Disp(2,1,'0');
  117.                 LCD1602_Disp(3,1,'x');
  118.                 //高四位
  119.                 j=write>>4;
  120.                 if(j<10)        j=j+'0';
  121.                 else j=j-10+'A';
  122.                 LCD1602_Disp(4,1,j);
  123.                 //低四位
  124.                 j=write&0x0F;
  125.                 if(j<10) j=j+'0';
  126.                 else j=j-10+'A';
  127.                 LCD1602_Disp(5,1,j);
  128.                 if(key1==0) key=1;
  129.                 else if(key2==0) key=2;
  130.                 else if(key3==0) key=3;
  131.                 switch(key)
  132.                 {
  133.                         case 1:write=write+1;key=0;break;
  134.                         case 2:write=write-1;key=0;break;
  135.                         case 3:SBUF=write;TI=0;key=0;break;//会发送几十次
  136.                 }
  137.                         
  138.         }
  139. }
复制代码


回复

使用道具 举报

ID:303383 发表于 2018-10-21 12:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:94031 发表于 2018-10-21 15:19 | 显示全部楼层
读完按键要延时一段时间再读,防止一次按下读到多次。
回复

使用道具 举报

ID:213173 发表于 2018-10-21 18:07 | 显示全部楼层
声明一个位变量用于按键3自锁
bit sign=0;
修改程序key3部份:

                if(key1==0)
                        key=1;
                else if(key2==0)
                        key=2;
//                else if(key3==0)
                if((key3==0)&&(sign==0))
                {
                        key=3;
                        sign=1;
                }
                else sign=0;

                switch(key)
                {
                        case 1:write=write+1;key=0;break;
                        case 2:write=write-1;key=0;break;
                        case 3:
                                SBUF=write;
                                while(!TI);        //等待发送中断请求标志位为1
                                TI=0;
                                key=0;
                                break;
                }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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