51单片机从电脑串口接收10字节的数据,程序用c语言
51单片机串口接收多字节程序,具体将,发送端PC机(暂时用串口助手调试),接收端单片机,十个数分别用于数码管显示,已有显示程序display(a1,、、、、、a10),求...
51单片机串口接收多字节程序,具体将,发送端PC机(暂时用串口助手调试),接收端单片机,十个数分别用于数码管显示,已有显示程序display(a1,、、、、、a10),求可靠的单片机接收程序,电脑发送数据,单片机的数码管实时显示发送的数据。求接收程序,谢谢,先悬赏20分,调试成功补加30分,求高手!
展开
1个回答
展开全部
可靠的接受程序!!从LZ 的display(a1......a10)看出来这程序就不咋样,如果显示函数 还是 用 延时做的,可靠的接受程序给LZ 也是 白瞎……
以下是 UART 驱动程序
/***10位异步收发串口通讯驱动——火柴天堂作品-20130119***/
/***源程序硬件环境:52单片机,11.0592MHz晶振,定时器1作为波特率发生器,通讯波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52头文件
#include"UART.h" //包含串口头文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode
static uchar UART_DataR; //串口接收数据寄存器
static uchar bdata Flag=0; //标志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收标志位 0:无数据 1:新数据
sbit UART_SendFlag=Flag^1; //串口发送标志位 0:空闲中 1:发送中
void UART()interrupt 4 //串口中断函数
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //将串口收到的数据存进 UART_DataR
UART_ReFlag=TRUE; //串口接收标志位 置位(有新数据)
}
if(TI) //若串口发送完成
{
TI=0; //清 串口发送溢出位
UART_SendFlag=FALSE; //清串口发送标志位(空闲中)
}
}
void UART_Init() //串口初始化函数
{
SCON=0x50; //选择通讯方式:10位异步收发,串口中断使能
PCON=0x80; //波特率倍频
TMOD&=0x0f; //定时器1控制位清0
TMOD|=0x20; //定时器1工作模式2(8位自重装,做波特率发生器)
TH1=th1; //定时器初值
TL1=th1; //定时器初值
TR1=1; //开始计时
ES=1; //允许串口中断
EA=1; //允许系统中断
}
bit UART_SendByte(uchar send_data) //串口发送字节函数,发送内容send_data,返回值:0 操作失败,1操作成功
{
if(!UART_SendFlag) //若串口空闲中,则
{
SBUF=send_data; //将发送内容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口发送标志位(进入忙态)
return TRUE; //返回1,操作成功
}
return FALSE; //否则,返回0,操作失败
}
uchar ASCII_ToHex(uchar ascii_data) //ASCII 转 Hex 函数
{
uchar hex_data=0; //定义 Hex变量存储转换结果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 转换内容为 字符'0-9',则转成对应数字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 转换内容为 字符'a-f',则转成数字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 转换内容为 字符'A-F',则转成数字10-15
return hex_data; //返回转换结果,非以上字符,不在Hex(0-F)范围内,默认0
}
bit UART_ReadByte(uchar *p_data,bit data_mode) //串口读字节函数,返回值0 无数据,1 有数据,将data_mode模式(ASCII_Mode或HEX_Mode)转成Hex结果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若无新数据,则返回 0(无数据)
UART_ReFlag=FALSE; //否则,清 串口接收标志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,将串口接收结果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,将串口接收结果转成Hex后,存到p_data指向地址
return TRUE; //返回 1(有数据)
}
以下是 UART 驱动程序
/***10位异步收发串口通讯驱动——火柴天堂作品-20130119***/
/***源程序硬件环境:52单片机,11.0592MHz晶振,定时器1作为波特率发生器,通讯波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52头文件
#include"UART.h" //包含串口头文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode
static uchar UART_DataR; //串口接收数据寄存器
static uchar bdata Flag=0; //标志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收标志位 0:无数据 1:新数据
sbit UART_SendFlag=Flag^1; //串口发送标志位 0:空闲中 1:发送中
void UART()interrupt 4 //串口中断函数
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //将串口收到的数据存进 UART_DataR
UART_ReFlag=TRUE; //串口接收标志位 置位(有新数据)
}
if(TI) //若串口发送完成
{
TI=0; //清 串口发送溢出位
UART_SendFlag=FALSE; //清串口发送标志位(空闲中)
}
}
void UART_Init() //串口初始化函数
{
SCON=0x50; //选择通讯方式:10位异步收发,串口中断使能
PCON=0x80; //波特率倍频
TMOD&=0x0f; //定时器1控制位清0
TMOD|=0x20; //定时器1工作模式2(8位自重装,做波特率发生器)
TH1=th1; //定时器初值
TL1=th1; //定时器初值
TR1=1; //开始计时
ES=1; //允许串口中断
EA=1; //允许系统中断
}
bit UART_SendByte(uchar send_data) //串口发送字节函数,发送内容send_data,返回值:0 操作失败,1操作成功
{
if(!UART_SendFlag) //若串口空闲中,则
{
SBUF=send_data; //将发送内容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口发送标志位(进入忙态)
return TRUE; //返回1,操作成功
}
return FALSE; //否则,返回0,操作失败
}
uchar ASCII_ToHex(uchar ascii_data) //ASCII 转 Hex 函数
{
uchar hex_data=0; //定义 Hex变量存储转换结果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 转换内容为 字符'0-9',则转成对应数字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 转换内容为 字符'a-f',则转成数字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 转换内容为 字符'A-F',则转成数字10-15
return hex_data; //返回转换结果,非以上字符,不在Hex(0-F)范围内,默认0
}
bit UART_ReadByte(uchar *p_data,bit data_mode) //串口读字节函数,返回值0 无数据,1 有数据,将data_mode模式(ASCII_Mode或HEX_Mode)转成Hex结果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若无新数据,则返回 0(无数据)
UART_ReFlag=FALSE; //否则,清 串口接收标志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,将串口接收结果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,将串口接收结果转成Hex后,存到p_data指向地址
return TRUE; //返回 1(有数据)
}
追问
先谢谢了。我是新手,没办法,明天调调看看。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询