本帖最后由 明日香 于 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;//清除數據傳送標志
- }
- }
- }
復制代碼
|