找回密码
 立即注册

QQ登录

只需一步,快速开始

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

想让单片机串口定时发送一组数据 但结果是定时发送一次,一次发送几十遍,怎么改?

[复制链接]
跳转到指定楼层
楼主
ID:796670 发表于 2021-1-8 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 明日香 于 2021-1-11 19:40 编辑

想实现的结果是每隔10s发送一次,用的是ds1302,已经设置好了second为1s,但运行结果是每隔10s发送一次,一次发送了几十遍,请问应该怎么改程序呢?
我尝试在各个地方加标志位,结果都是每隔10s发送一次,一次发送几十遍数据,而不是每隔10s发送一组数据.....

以下为源程序:

  1. #include <stc12c5a.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <intrins.h>
  7. #include"ds1302.h"
  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10.         
  11. uchar rec[9];//接收
  12. uchar wind_speed[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//要发送的问询帧
  13. void init();// 初始化函数
  14. void UART_1send();

  15. int flag2;/传感器接收标志位
  16. int flags;
  17. int i;

  18. void delay(uint z)//延时函数1ms
  19. {
  20.         uint x,y;
  21.         for(x=z;x>0;x--);
  22.                 for(y=110;y>0;y--);
  23. }


  24. void init()  //系统初始化
  25. {
  26. TMOD |=0X20;//定时器T1,方式2,波特率由PCON寄存器的SMOD决定
  27. SCON=0x50; //REN RI TI,RI为0,TI为0
  28. //串行口1方式1 SCON是串行口1的串行控制寄存器,REN为1,允许接收
  29. PCON=0x00;//各工作方式波特率加倍
  30. TH1=0xfD;//9600bps@11.0592
  31. TL1=0xfD;
  32. TR1=1; //定时器1中断打开
  33. EA=1;//cpu总中断允许位,1为开放中断
  34. ES=1;// 1允许串行口中断
  35. }

  36. void main()
  37. {
  38.                 uchar second;/ds1302秒
  39.                 flags=1;
  40.                 flag2=1;
  41.                 init();//初始化
  42.            while(1)
  43.         {               
  44.                 delay(1000);
  45.                 if(second%8==0)  //每隔8s让flag2=0,flags=0
  46.                 {
  47.                         flag2=0;
  48.                         flags=0;
  49.                 }
  50.           if(second%10==0&&flag2==0) //每隔10秒,且flag2=0
  51.                 {
  52.                          flag2=1;
  53.                         delay(1000);
  54.                         UART_1send();        //串口发送
  55.                          delay(1000);
  56.                          flags=1;     //发送完让flags=1
  57.                 }
  58.                
  59.         }
  60. }

  61. void UART_1send()  //串口发送函数
  62. {
  63.           uchar i;
  64.           delay(500);
  65.         if(flags==0)        //如果风速标志位flags=0,则发送风速问询帧
  66.   {
  67.                         for(i=0;i<8;i++)
  68.                   {

  69.                                 SBUF=wind_speed[i];//风向数据
  70.                                 while(TI==0);
  71.                                 {
  72.                                                  }                        //数据发送结束时TI自动置1
  73.                                 TI=0;//清除数据传送标志
  74.                         }
  75.   }
  76. }
复制代码

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

使用道具 举报

沙发
ID:390416 发表于 2021-1-8 11:12 | 只看该作者
STC单片机串口发送 不需要while死等 串口接收执行软件复位
http://www.51hei.com/bbs/dpj-200927-1.html
我这个贴子就是串口,赶紧去瞧瞧
回复

使用道具 举报

板凳
ID:876745 发表于 2021-1-12 13:45 | 只看该作者
随便看了一眼,主函数定义的局部变量second未赋值,也没用指针,second的值哪来?如果second是全局变量,不该在main里面定义。
回复

使用道具 举报

地板
ID:796670 发表于 2021-1-12 20:00 | 只看该作者
zyztoto 发表于 2021-1-12 13:45
随便看了一眼,主函数定义的局部变量second未赋值,也没用指针,second的值哪来?如果second是全局变量,不 ...

我用了ds1302模块,second已经设置成秒了,在另一个文件里,没往这里放
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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