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)
//	{
//	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值