/************* 本地常量声明 **************/
#define MAIN_Fosc 11059200L //定义主时钟
#define RX1_Lenth 32 //串口接收缓冲长度
#define BaudRate1 9600UL //选择波特率
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重装值, 对应300KHZ
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 2 重装值, 对应300KHZ
#include "STC15Fxxxx.H"
/************* 本地变量声明 **************/
u8 idata RX1_Buffer[RX1_Lenth]; //接收缓冲
u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
/************* 本地函数声明 **************/
/**********************************************/
void main(void)
{
B_TX1_Busy = 0;
RX1_Cnt = 0;
TX1_Cnt = 0;
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认
//S1_USE_P36P37(); //UART1 使用P36 P37口
// S1_USE_P16P17(); //UART1 使用P16 P17口
/*
TR1 = 0; //波特率使用Timer1产生
AUXR &= ~0x01; //S1 BRT Use Timer1;
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1 = 1;
*/
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
REN = 1; //允许接收
ES = 1; //允许中断
EA = 1; //允许全局中断
while (1)
{
if(TX1_Cnt != RX1_Cnt) //收到过数据
{
if(!B_TX1_Busy) //发送空闲
{
B_TX1_Busy = 1; //标志发送忙
SBUF = 0X55; //发一个字节
if(++TX1_Cnt >= RX1_Lenth) TX1_Cnt = 0; //避免溢出处理
}
}
}
}
/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
RX1_Buffer[RX1_Cnt] = SBUF; //保存一个字节
if(++RX1_Cnt >= RX1_Lenth) RX1_Cnt = 0; //避免溢出处理
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0; //清除发送忙标志
}
}
这个程序用P3.0和P3.1正常,使用P3.6和p3.7不能通讯 |