天天看点

STC15-STC15W4K56S4-STC15F2K60S2串口通信程序代码-提供源码下载

STC15-STC15W4K56S4-STC15F2K60S2串口通信程序代码-提供源码下载

源码下载地址:

/

#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

}

}

}

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)

// {

// }

}

继续阅读