STC12C5A60S2单片机的串行口2数据发发送问题
时间:10-02
整理:3721RD
点击:
想实现的功能呢就是:使用串口调试助手的文本格式发送字符1,单片机通过串口2接收后验证通过,发送一次数组Str1[5]内5个的字符数据,通过串口调试助手接收查看发送出来的数据。
目前的状态就是:每次复位后发送字符1,接收到一个大写打字母L,别的都没有了,而且每次复位后才能发送出来一个L,否则不管发多少次字符1,都不发出数据。
一下是本人改写的程序:
/*************** 用户定义参数 *****************************/
#define MAIN_Fosc 22118400L //define main clock
#define Baudrate1 9600 //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
#define Baudrate2 9600 //define the baudrate2,
//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
#define BUF_LENTH 128 //定义串口接收缓冲长度
/**********************************************************/
#include <reg51.h>
sfr AUXR1 = 0xA2;
sfr AUXR = 0x8E;
sfr S2CON = 0x9A; //12C5A60S2双串口系列
sfr S2BUF = 0x9B; //12C5A60S2双串口系列
sfr IE2 = 0xAF; //STC12C5A60S2系列
sfr BRT = 0x9C;
unsigned char uart2_wr; //写指针
unsigned char uart2_rd; //读指针
unsigned char xdata RX2_Buffer[BUF_LENTH];
bit B_TI2;
/****************** 编译器自动生成,用户请勿修改 ************************************/
#define T1_TimerReload (256 - MAIN_Fosc / 192 / Baudrate1) //Calculate the timer1 reload value at 12T mode
#define BRT_Reload (256 - MAIN_Fosc / 12 / 16 / Baudrate2) //Calculate BRT reload value
#define TimeOut1 (28800 / (unsigned long)Baudrate1 + 2)
#define TimeOut2 (28800 / (unsigned long)Baudrate2 + 2)
#define TI2 (S2CON & 0x02) != 0
#define RI2 (S2CON & 0x01) != 0
#define CLR_TI2() S2CON &= ~0x02
#define CLR_RI2() S2CON &= ~0x01
/**********************************************************/
unsigned char addr;
unsigned char Str1[5]={"LFA01"};
/******************** 本地函数声明 ***************/
void uart2_init(void);
void UART2_TxByte(unsigned char dat);
void PrintString2(unsigned char code *puts);
/****************延时函数****************/
void Delay_Ms(unsigned int ms)
{
unsigned int i;
while(ms--)
for(i=0;i<550;i++);
}
/*********从机编号判断和数据发送********/
//如果串口1接收到主机发来的寻址从机编号,才将本从机的数据发送给主机,否则等待
//void Send_Data(void)
//{
// int i;
//// uchar b;
//if(addr=='1') //不同的从机,这里必须修改
// {
// for(i=0;i<5;i++)
// {
// UART2_TxByte(Str1);
// Delay_Ms(10);
// }
// }
//
//}
void main(void)
{
int i;
uart2_rd = 0;
uart2_wr = 0;
AUXR1 |= (1<<4); //将UART2从P1口切换到 RXD2--P1.2切换到P4.2 TXD2---P1.3切换到P4.3
uart2_init();
while(1)
{
// if(addr=='1')
// {
// for(i=0;i<5;i++)
// {
// UART2_TxByte(str);
// Delay_Ms(5);
// }
// }
}
}
void UART2_TxByte(unsigned char dat)
{
B_TI2 = 0;
S2BUF = dat;
while(!B_TI2);
B_TI2 = 0;
}
void PrintString2(unsigned char code *puts) //发送一串字符串
{
for (; *puts != 0; puts++) UART2_TxByte(*puts); //遇到停止符0结束
}
/**********************************************/
void uart2_init(void)
{
AUXR |= (1 << 3); //串口2波特率加倍
S2CON = (S2CON & 0x3f) | (1<<6); //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率
S2CON |= 1 << 4; //允许串2接收
AUXR |= 1 << 4; //baudrate use BRT
BRT = BRT_Reload;
IE2 |= 1; //允许串口2中断
//本来在uart1_init(void)中有定义,只是用串口2时必须有以下两条才行
ES = 1;
EA = 1;
}
/**********************************************/
void UART2_RCV (void) interrupt 8
{ int a;
int i;
if(RI2)
{
CLR_RI2();
a=S2BUF;
addr=a;
}
if(addr=='1') //不同的从机,这里必须修改
{
for(i=0;i<5;i++)
{
UART2_TxByte(Str1);
Delay_Ms(10);
}
}
if(TI2)
{
CLR_TI2();
B_TI2 = 1;
}
}
把这以下语在主函数的while(1)中接触屏蔽,发送一次1后就一直能收到单片机发出的数据,没有任何问题,换一个字符发送给单片机后才停止,再发1,单片机仍然能持续发送数据,但是只要是放到串口中断或是写到子函数中,在中断中调用,就每次复位只能发送一次,且只发一个L
if(addr=='1')
{ for(i=0;i<5;i++)
{
UART2_TxByte(str);
Delay_Ms(5);
}
}
UART2_TxByte();这个函数不行吧,试试print那个函数
tainanle 啊 啊 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
因为放在中断里,发送了L之后,写标志位没有清零哦!
这句CLR_TI2();就是写标志位清零吧,我这样写
for(i=0;i<5;i++)
{
UART2_TxByte(str);
CLR_TI2();
Delay_Ms(5);
}
还是一样的效果,请问有什么好的办法能详细给我讲讲做么做吗?