标题:
想让单片机串口定时发送一组数据 但结果是定时发送一次,一次发送几十遍,怎么改?
[打印本页]
作者:
明日香
时间:
2021-1-8 09:33
标题:
想让单片机串口定时发送一组数据 但结果是定时发送一次,一次发送几十遍,怎么改?
本帖最后由 明日香 于 2021-1-11 19:40 编辑
想实现的结果是每隔10s发送一次,用的是ds1302,已经设置好了second为1s,但运行结果是每隔10s发送一次,一次发送了几十遍,请问应该怎么改程序呢?
我尝试在各个地方加标志位,结果都是每隔10s发送一次,一次发送几十遍数据,而不是每隔10s发送一组数据.....
以下为源程序:
#include <stc12c5a.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <intrins.h>
#include"ds1302.h"
#define uchar unsigned char
#define uint unsigned int
uchar rec[9];//接收
uchar wind_speed[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//要发送的问询帧
void init();// 初始化函数
void UART_1send();
int flag2;/传感器接收标志位
int flags;
int i;
void delay(uint z)//延时函数1ms
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void init() //系统初始化
{
TMOD |=0X20;//定时器T1,方式2,波特率由PCON寄存器的SMOD决定
SCON=0x50; //REN RI TI,RI为0,TI为0
//串行口1方式1 SCON是串行口1的串行控制寄存器,REN为1,允许接收
PCON=0x00;//各工作方式波特率加倍
TH1=0xfD;//9600bps@11.0592
TL1=0xfD;
TR1=1; //定时器1中断打开
EA=1;//cpu总中断允许位,1为开放中断
ES=1;// 1允许串行口中断
}
void main()
{
uchar second;/ds1302秒
flags=1;
flag2=1;
init();//初始化
while(1)
{
delay(1000);
if(second%8==0) //每隔8s让flag2=0,flags=0
{
flag2=0;
flags=0;
}
if(second%10==0&&flag2==0) //每隔10秒,且flag2=0
{
flag2=1;
delay(1000);
UART_1send(); //串口发送
delay(1000);
flags=1; //发送完让flags=1
}
}
}
void UART_1send() //串口发送函数
{
uchar i;
delay(500);
if(flags==0) //如果风速标志位flags=0,则发送风速问询帧
{
for(i=0;i<8;i++)
{
SBUF=wind_speed[i];//风向数据
while(TI==0);
{
} //数据发送结束时TI自动置1
TI=0;//清除数据传送标志
}
}
}
复制代码
作者:
人人学会单片机
时间:
2021-1-8 11:12
STC单片机串口发送 不需要while死等 串口接收执行软件复位
http://www.51hei.com/bbs/dpj-200927-1.html
我这个贴子就是串口,赶紧去瞧瞧
作者:
zyztoto
时间:
2021-1-12 13:45
随便看了一眼,主函数定义的局部变量second未赋值,也没用指针,second的值哪来?如果second是全局变量,不该在main里面定义。
作者:
明日香
时间:
2021-1-12 20:00
zyztoto 发表于 2021-1-12 13:45
随便看了一眼,主函数定义的局部变量second未赋值,也没用指针,second的值哪来?如果second是全局变量,不 ...
我用了ds1302模块,second已经设置成秒了,在另一个文件里,没往这里放
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1