51单片机串口通信
时间:10-02
整理:3721RD
点击:
51单片机串口通信大家好,新手,单片机AT89S52,实现与上位机的通信,现在测试程序主要功能是用上位机向单片机发送数据,单片机再将数据返回,用的串口猎人。
程序如下
#include <AT89X51.h>
#include <target.h>
void delay_us(unsigned int us);
void main()
{
uchar buffer;
usart0_initial();
while(1)
{
delay_us(10);
buffer=get_char(); //读取上位机数据
delay_us(10);
send_char(buffer); //发送数据至上位机
}
}
/*****************************************************************************************************
*函数名称:delay_us(unsigned int us)
*函数功能:微秒级延时函数
*函数入口:us
*函数出口:无
******************************************************************************************************/
void delay_us(unsigned int us)
{
uchar delayi;
while(--us)
{
for(delayi=0;delayi<10;delayi++);
}
}
#define TARGET_GLOBAL 1
#include <target.h>
/*****************************************************************************************************
*函数名称:usart0_Inital(void)
*函数功能:初始化串口
*入口函数:无
*出口函数:无
******************************************************************************************************/
void usart0_Initial(void)
{/*************************************TH1=256-(K*oscFreq)/384*BaudRate*********/
SCON=0x50;//SM0=0;SM1=1;REN=1,工作于方式1,允许接受数据,因为SCON存在位地址,可以进行位操作
TI=0;//发送中断标志位清零,准备数据发送
RI=0;//接受中断标志位清零,准备数据接收
PCON=0; //波特率不加倍
TH1=0xf3;//bode=2400
TL1=0xf3;
TMOD=0x20; //设定定时器1工作于方式2,即自动重载8位定时器
ET1=0; //关闭定时器1中断
TR1=1; //启动定时器1,因为TCON寄存器存在位地址,可以进行位操作
ES=0; //关闭串行口中断,因为IE寄存器存在位地址,可以进行位操作
}
/*****************************************************************************************
*函数名称: send_char(uchar txd)
*函数功能: 串口发送一个字符
*入口函数: 要发送的一个字符 txd
*出口函数: 无
*******************************************************************************************/
void send_char(uchar txd)
{
TI=0;
SBUF=txd;
while(!TI); //等待数据传送
TI=0; //清除数据传送标志
}
/*******************************************************************************************
*函数名称:send_str(uchar *str, uchar len)
*函数功能:串口发送一行字符串
*函数入口:字符串指针*str,字符串长度len
*函数出口:无
********************************************************************************************/
void send_str(uchar*str, uchar len)
{
uchar i;
for(i=0;i<len;i++)
send_char(str);
}
/**********************************************************************************************
*函数名称:get_char(void)
*函数功能:串口接收一个字符
*函数入口:串口接收的字符?rxd?
*函数出口:无
*************************************************************************************************/
uchar get_char(void)
{
uchar temp;
RI=0;//接受中断标志位清零,准备数据接收
while(!RI); //等待上位机传送数据
temp=SBUF; //从缓冲寄存器中读取数据,接受到8位数据时,RI会自动置1
RI=0; //接受中断标志位清零,准备下一次的数据接收
return temp;
发现在收发的过程中会出现错误,上位机对单片机发01,单片机返回的数值有时变成81 而且没有规律可循!
另外我现在想用串口实现单片机对上位机的数据传送
功能就是,当串口连上上位机后,就自动向上位机传送数据,希望能尽量避免数据错误或丢失。希望有校验功能 我的用的是MAX232D
哪位高人有类似的参考程序,谢谢了
程序如下
#include <AT89X51.h>
#include <target.h>
void delay_us(unsigned int us);
void main()
{
uchar buffer;
usart0_initial();
while(1)
{
delay_us(10);
buffer=get_char(); //读取上位机数据
delay_us(10);
send_char(buffer); //发送数据至上位机
}
}
/*****************************************************************************************************
*函数名称:delay_us(unsigned int us)
*函数功能:微秒级延时函数
*函数入口:us
*函数出口:无
******************************************************************************************************/
void delay_us(unsigned int us)
{
uchar delayi;
while(--us)
{
for(delayi=0;delayi<10;delayi++);
}
}
#define TARGET_GLOBAL 1
#include <target.h>
/*****************************************************************************************************
*函数名称:usart0_Inital(void)
*函数功能:初始化串口
*入口函数:无
*出口函数:无
******************************************************************************************************/
void usart0_Initial(void)
{/*************************************TH1=256-(K*oscFreq)/384*BaudRate*********/
SCON=0x50;//SM0=0;SM1=1;REN=1,工作于方式1,允许接受数据,因为SCON存在位地址,可以进行位操作
TI=0;//发送中断标志位清零,准备数据发送
RI=0;//接受中断标志位清零,准备数据接收
PCON=0; //波特率不加倍
TH1=0xf3;//bode=2400
TL1=0xf3;
TMOD=0x20; //设定定时器1工作于方式2,即自动重载8位定时器
ET1=0; //关闭定时器1中断
TR1=1; //启动定时器1,因为TCON寄存器存在位地址,可以进行位操作
ES=0; //关闭串行口中断,因为IE寄存器存在位地址,可以进行位操作
}
/*****************************************************************************************
*函数名称: send_char(uchar txd)
*函数功能: 串口发送一个字符
*入口函数: 要发送的一个字符 txd
*出口函数: 无
*******************************************************************************************/
void send_char(uchar txd)
{
TI=0;
SBUF=txd;
while(!TI); //等待数据传送
TI=0; //清除数据传送标志
}
/*******************************************************************************************
*函数名称:send_str(uchar *str, uchar len)
*函数功能:串口发送一行字符串
*函数入口:字符串指针*str,字符串长度len
*函数出口:无
********************************************************************************************/
void send_str(uchar*str, uchar len)
{
uchar i;
for(i=0;i<len;i++)
send_char(str);
}
/**********************************************************************************************
*函数名称:get_char(void)
*函数功能:串口接收一个字符
*函数入口:串口接收的字符?rxd?
*函数出口:无
*************************************************************************************************/
uchar get_char(void)
{
uchar temp;
RI=0;//接受中断标志位清零,准备数据接收
while(!RI); //等待上位机传送数据
temp=SBUF; //从缓冲寄存器中读取数据,接受到8位数据时,RI会自动置1
RI=0; //接受中断标志位清零,准备下一次的数据接收
return temp;
发现在收发的过程中会出现错误,上位机对单片机发01,单片机返回的数值有时变成81 而且没有规律可循!
另外我现在想用串口实现单片机对上位机的数据传送
功能就是,当串口连上上位机后,就自动向上位机传送数据,希望能尽量避免数据错误或丢失。希望有校验功能 我的用的是MAX232D
哪位高人有类似的参考程序,谢谢了
在线等啊
在线等啊
你的程序里没有串口中断处理程序吗?再就是串口助手发送的时候选择十六进制发送。
这个程序把串口中断关了哦 还不知道怎么用中断了
你这样不是用串口中断的方法,还是用函数的方法来控制串口。找一本单片机的书看看吧,看看里面是怎么用串口中断的。加油!
非常感谢已经解决了