源碼下載地址:https://www.90pan.com/b1917193
//**********************************************
//STC15F2K60S2串口通信程序,將串口接受到的數據從串口發出去
//採用22.1184M晶振,波特率115200
//爲方便大家調試,特附該程序的項目工程文件下載地址,下載打開即可調試下載到單片機
//-
//*********************************************
源碼下載地址:https://www.90pan.com/b1917193
#include <stc15fxxxx.h> //調用stc15f系列頭文件,下載地址: http://pan.baidu.com/s/1eRUbjLS
/*************常量定義****************/
#define MAIN_Fosc 22118400L //主時鐘,晶振頻率不同的直接在這裏修改頻率
#define serial_one_read_max 32 //定義緩存區的長度
#define serial_one_baud_rate 115200L //波特率,只需在這裏修改波特率就可以了
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / serial_one_baud_rate)) //用定時器1做波特率發生器,計算定時器1的重裝值
/*************變量定義****************/
u8 serial_one_read_data[serial_one_read_max]; //定義串口接受數據緩存區
u8 serial_one_read_count=0; //接受數據的個數
//初始化串口1
void serial_one_init()
{
SCON |= 0x40; //8位數據
P_SW1 &= ~0xc0; //UART1 使用P30 P31口 默認
TR1 = 0; //關閉定時器
AUXR &= ~0x01; //S1 BRT Use Timer1;
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;2
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1 = 1; //打開定時器
PS = 1; //高優先級中斷
REN = 1; //允許接收
ES = 1; //允許中斷
EA = 1; //允許全局中斷
}
//延時10毫秒
void Delay10ms() //@22.1184MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//串口1發送一個字節
void serial_one_send_byte(u8 dat)
{
SBUF = dat;//發送數據
while(!TI);//等待發送完畢
TI=0; //清除發送標誌
}
//串口1發送字符串
void serial_one_send_string(u8 *dat)
{
while(*dat)
serial_one_send_byte(*dat++);
}
//串口1發送指定指定長度數據
void serial_one_send_length_string(u8 *dat,u8 length)
{
u8 i=0;
for(;i < length;i++)
serial_one_send_byte(dat[i]);
}
void main()
{
Delay10ms();//延時10毫秒
Delay10ms();//延時10毫秒
serial_one_init();//串口初始化
while(1)
{
if(serial_one_read_count > 0)//如果接受到數據
{
Delay10ms();//延時10毫秒,等待數據全部讀入
serial_one_send_length_string(serial_one_read_data,serial_one_read_count);//發送接收到的數據
serial_one_read_count = 0;//接收計數清0
}
}
}
/********************* 串口1中斷函數************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;//清除接受標誌
serial_one_read_data[serial_one_read_count] = SBUF;//將數據存入數組
if(++serial_one_read_count > serial_one_read_max) //避免溢出
serial_one_read_count = 0;
}
// if(TI)
// {
// }
}