找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于编写串口通信协议遇到的问题

[复制链接]
跳转到指定楼层
楼主
ID:94983 发表于 2015-11-7 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近在学习51单片机,主要功能是实现串口通信协议,并附带数码管显示等功能。现在遇到一个问题,我现在希望每隔500ms发送一串16字节的数据,这个500ms我使用定时器0来实现,在10ms定时器中Send_Wait_1++。主函数中,上电先发送一串数据,数据发送过程中,Send_Wait_1一直清零,当定时器0启动时,每次当Send_Wait_1>=50时,启动发送函数Uart2_SendString(),但是我用keil5软件仿真时,发现Send_Wait_1一直在增加,但是到了50后,并没有触发if语句从而发动Uart2_SendString(),程序烧到板子上后,用示波器测了一下,发送端只有上电后第一次发动的Uart2_SendString(),之后一直没有数据发送,纠结了好几天一直没有想明白为什么。
主函数
void main(void)
{
  Timer0Init();
        Uart2_Init();       
        Send_Wait_1=0;
        Uart2_SendString();       
        if(Send_Wait_1>=50)
        {
  Send_Wait_1=0;
        Uart2_SendString();
        }       
        DisP4(1234);
        Digi();
        Key4();

}

定时器0,100us
void tm0() interrupt 1 using 1
{         
        US100++;
  if(US100>= 10)
    {US100=0; Serve1MS();                // 1MS¼Æê±
      MS1++;
    if(MS1>=10)
       {MS1=0;  Serve10MS();             // 10MS¼Æê±
        MS10++;
      if(MS10>=10)
        { MS10=0;  Serve100MS();           // 100MS¼Æê±
        MS100++;  
                                 if(MS100>=10)
                                 {
                                         MS100=0;  Serve1S();                // 1S¼Æê±
                                         S1++;
                                         if(S1>250) S1=0;
                                 }
        }
       }
    }
}

工程文件见附件,求高手指导一下

V1.03.zip

92.77 KB, 下载次数: 3

keil5工程

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

使用道具 举报

沙发
ID:94983 发表于 2015-11-7 17:58 | 只看该作者
我在用定时器0实现的1s定时器里控制p55取反,效果是LED闪烁,我发现,如果把        DisP4(1234);         Digi();         Key4()三行屏蔽的话,灯闪效果莫名地消失了,但是串口二会不断地发数据而不是按照我期望的那样每隔500ms发数据
回复

使用道具 举报

板凳
ID:95029 发表于 2015-11-7 21:58 | 只看该作者
  if(Send_Wait_1>=50)         {   Send_Wait_1=0;         Uart2_SendString();         }                 DisP4(1234);         Digi();         Key4();
回复

使用道具 举报

地板
ID:95029 发表于 2015-11-7 21:59 | 只看该作者
将下面几句放在while(1){}中:  if(Send_Wait_1>=50)         {   Send_Wait_1=0;         Uart2_SendString();         }                 DisP4(1234);         Digi();         Key4();
回复

使用道具 举报

5#
ID:94983 发表于 2015-11-8 15:34 | 只看该作者
logos 发表于 2015-11-7 21:59
将下面几句放在while(1){}中:  if(Send_Wait_1>=50)         {   Send_Wait_1=0;         Uart2_SendStrin ...

发现问题了,是在digi函数里放了while(1)死循环了
回复

使用道具 举报

6#
ID:95113 发表于 2015-11-8 23:46 | 只看该作者
虽然不能全都看懂,还是顶
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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