STC15F2K60S2串口通信程序-提供源碼下載

源碼下載地址: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)
//	{
//	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章