27,375
社区成员
发帖
与我相关
我的任务
分享
标签:51串口
发送程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<112;j++);
}
void init()
{
TMOD= 0X20; //T1 方式2 ,8位 自动重装
TH1=0Xfd;
TL1=0Xfd; //9600
TR1=1; // 定时器1启动
//SCON= 0X40; // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1; //方式1
REN=0; // 不允许串口接收数据
//ES=1; // 串口中断应许
//EA=1; // 开启中断
}
void uart_sendB(uchar d)
{
SBUF=d;
while(!TI);
TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
uart_sendB(*str) ;
str++;
delay(1);
}
}
void main()
{
init();
//uart_sendB('S');
uart_sendS("XXXXXXXXXXXaaa@@@@@@@@@@ ");
//uart_sendB(0x0d); //换行
//uart_sendB(0x0a);
while(1);
}
========================================================================
========================================================================
========================================================================
接收程序
#include <reg52.h>
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar BUF[30],i=0;
void delay(uint ms)
{
uint e,j;
for(e=0;e<ms;e++)
for(j=0;j<112;j++);
}
void init_uart()
{
TMOD= 0X20; //T1 方式2 ,8位 自动重装
TH1=0Xfd;
TL1=0Xfd; //9600
TR1=1; // 定时器1启动
//SCON= 0X40; // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1; //方式1
//SM2 = 1; //;收到有效的停止位时才将RI置1yh
REN=1; // 允许串口接收数据
ES=1; // 串口中断应许
//RI=0;
EA=1; // 开启中断
}
void uart_sendB(uchar d)
{
SBUF=d;
while(!TI);
TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
uart_sendB(*str) ;
str++;
delay(1);
}
}
void main()
{
init_uart();
init_1602();
LCD_write_string(0,0,"LYQ"); //列x=0-15,行y=0,1
BUF[0]='\0';
RI=0;
while(1)
{
LCD_write_string(0,1,BUF);
}
}
void uart_rx(void) interrupt 4 //using 3
{
EA=0;
if(RI)
{
//RI=0;
BUF[i++]=SBUF;
//uart_sendB(BUF[i]);
//LCD_write_char(12,1,'i');
}
EA=1;
}
这个例程比你上面贴的好一点。
注意初始化时给BUF写了个\0进去,接收中断中收到新数据时却没有写这个字符串结束标志。这样LCD_write可能会跑飞出去。
可以在BUF[i++]=SBUF;后面加一句BUF[i]=0;
这样当缓冲区写满时也还是有问题,可以再加个边界检查 if(i>=28) i=0;