用stc15w4k48s4单片机,在调试过程中,串口一和串口2都接收不到正确的答案,想知道怎么办?
2019-07-14 15:36发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
这是我写程序,只要是想,用stc15w4k48s4单片机实现,串口1以1s的时间周期连续发送0 1 2 3 4 5 6 7 8 9(加上以为校验和),用串口2接收遗传协议规定的数据并判断是否正确,若正确,串口2发送oxAA。
可是在调试过程中,串口一和串口2都接收不到正确的答案,想知道怎么办。
#include<firstone.h>
#include <reg52.h>
#include<intrins.h>
#include <STC15F2K60S2.H>
#include<uart0.h>
#define second 1000
#define uchar unsigned char
#define uint unsigned int
//#define FOSC 22118400L
//#define BAUD 115200
// #define TM (65536-(FOSC/4/BAUD))
//uchar xdata Data1_BUF[32],Data2_BUF[32];
uchar DATA_Send[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uchar xdata UART1_DATA_Receive[10],UART2_DATA_Receive[10];
uchar UART1_Rec_flag=0,UART2_Rec_flag=0;
uchar i,pf,count,check1,check2,d[10];
//函数声明//
void UART1_Send(uchar str1[]); //串口1发送数据
void UART2_Receive(uchar UART1_DATA_Receive[10]); //串口2接受数据
void UART2_Send(uchar str2[]); //串口2发送数据
void timer0_config(); //定时器0
void UART_init(void); //初始化串口波特率,使用定时器2
//void PC_Send(); //PC机发送数据
//主函数//
void main()
{
timer0_config();
UART_init();
while(1)
{
//if(0){
SCON = 0x50;
if(UART1_Rec_flag==1)
UART1_Rec_flag=0;
S2CON=0x50;
while(count==second)
{
count=0;
UART1_Send(UART1_DATA_Receive);
if(UART2_Rec_flag==1)
{
UART2_Rec_flag=0;
S2CON &=0x04;//关闭串口2接收控制
// if((check1^check2)==0)
//{
UART2_Send(UART1_DATA_Receive);
// }
//ES2=1;
}
//ES1=1;
}
}
}
// //串口1发送数据 //
//void UART1_Send(uchar d[])
// {
// uchar i;
// for(i=0;i<10;i++)
// SBUF=d;
// while(!TI)
// TI=0;
// }
//串口2发送数据//
void UART2_Send(uchar d[])
{
uchar i;
for(i=0;i<10;i++)
S2BUF=d ;
while(!(S2CON&0x02));
S2CON&=~0x02;
}
//串口1中断处理函数
void UART1_Routine() interrupt 4
{
uchar d[10];
uchar length=10;
while(1) {
while(RI==0) {} RI=0;
pf=0;
for(i=0;i<length;i++)
{
d=SBUF;
//P1=d;
pf+=d;
check1=pf;
SBUF=pf;
// while(RI==0) {} RI=0;
}
//P1=pf;
while(RI==0) {} RI=0;
//P1=SBUF;
//check1=pf;
if((SBUF^pf)==0)
{
//P1=0;//time(500)
SBUF=0xaa;
}
UART1_Rec_flag=1;
//while(TI==0) {} TI=0;
}
}
//串口2中断处理函数//
void UART2_Routine() interrupt 8
{
while(1) {
while(RI==0) {} RI=0;
pf=0;
//uchar check2
for(i=0;i<10;i++) {
d=S2BUF;
//P3=d;
check2+=d;
pf=check2;
}
//P3=check2;
if((S2BUF^pf)==0)
{
//time(500)
SBUF=0xAA;
}
UART2_Rec_flag=1;
//while(TI==0) {} TI=0;
}
}
//定时器0的初始化//
void timer0_config()
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
//定时器T0中断服务函数//
void timer0_Routine () interrupt 1
{
uchar count;
TF0=0;
TR0=1;
while(count==second)
{
count=0;
TF0=0;
}
}
//串口初始化函数
void UART_init(void) //115200bps@22.1184MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xD0; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xD0; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA=1;
ES=1; //开启串口中断
//PS=1;
//PS2=0;
}
一周热门 更多>