真的好奇怪,定時發(fā)送一組8個數(shù)據(jù),但串口助手結(jié)果是前兩個數(shù)據(jù)均為第一個數(shù)據(jù),后面數(shù)據(jù)都正常發(fā)送,這是怎么回事?要發(fā)送的是一組8個數(shù)據(jù)是:
uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//發(fā)送一組八個數(shù)據(jù)
然而接收到的卻是:0x01,0x01,0x00,0x00,0x00,0x01,0x84,0x0A,第一個數(shù)據(jù)發(fā)送了兩遍,然后開始發(fā)送第三,四位數(shù)據(jù)...
捕獲1.PNG (6.04 KB, 下載次數(shù): 60)
下載附件
2021-1-11 21:44 上傳
這是發(fā)送部分的程序:
for(i=0;i<8;i++)
{
SBUF=send[ i];//發(fā)送數(shù)據(jù)
while(!TI);
TI=0;//清除數(shù)據(jù)傳送標志
}
然后我改了一下
for(i=0;i<8;i++)
{
SBUF=send[ i];//發(fā)送數(shù)據(jù)
while(!TI);
TI=0;//清除數(shù)據(jù)傳送標志
}
它應(yīng)該顯示第二,三位數(shù)據(jù),也就是03 00 ,但結(jié)果卻是03 03 ,這是為啥?
捕獲3.PNG (2.44 KB, 下載次數(shù): 62)
下載附件
2021-1-11 21:48 上傳
以下為完整程序:我用了ds1302時鐘模塊,second就是秒,已經(jīng)設(shè)置好了
#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 send[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//發(fā)送一組8個數(shù)據(jù)
uchar num=0;
void init();// 初始化函數(shù)
void UART_1send();
void UART_1interrupt();
int flag2;//接收標志位
int i;
void delay(uint z)//延時函數(shù)1ms
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void init() //系統(tǒng)初始化
{
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()
{
flag2=0;
init();//初始化
while(1)
{
delay(1000);
UART_1send(); //串口發(fā)送
}
}
void UART_1send() //串口發(fā)送函數(shù)
{
uchar i;
delay(500);
if(flag2==0) //如果標志位flag2=0,則發(fā)送
{
for(i=0;i<8;i++)
{
SBUF=send[ i];//風向數(shù)據(jù)
while(!TI);
TI=0;//清除數(shù)據(jù)傳送標志
}
flag2=1;
}
} |