51单片机从电脑串口接收10字节的数据,程序用c语言

51单片机串口接收多字节程序,具体将,发送端PC机(暂时用串口助手调试),接收端单片机,十个数分别用于数码管显示,已有显示程序display(a1,、、、、、a10),求可靠的单片机接收程序,电脑发送数据,单片机的数码管实时显示发送的数据。求接收程序,谢谢,先悬赏20分,调试成功补加30分,求高手!

可靠的接受程序!!从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(有数据)
}追问

先谢谢了。我是新手,没办法,明天调调看看。

温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机从电脑串口接收10字节的数据,程序用c语言
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(dat...

51单片机串口通信c语言编程
\/\/串口发送程序 void send(uchar se){ SBUF=se; \/\/发送数据 while(TI == 0);TI = 0;} \/\/串口接收程序 uchar receive(void){ re=SBUF; \/\/接收数据 while(RI==0);RI=0;return re;} \/\/串口初始化 void sinti(void){ SCON = 0x50;TMOD |= 0x20;TH1 = 0xFD;TR1 ...

怎么通过串口读取51单片机某个地址的数据?请用C语言写出来。
C语言中对于内存的访问是基于指针的,这个毋庸置疑,具体操如下 unsigned int *p= (unsigned int*)0x22 ;\/\/定义指针,并且使指针指向了0x22这个 内存地址;那么*p就是最终你要读取的数据了。4.至于如何通过串口显示到电脑我就不多说了(这不是难点),数据你都知道了,写到串口 缓冲区,在...

C语言51单片机串口通信程序求教
串口通讯,首先设置波特率,再设置串口模式,之后就可以收发数据了。比如:init(){TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;SCON=0x50;}send(unsigned char dat){SBUF=dat;while(TI==0);TI==0;}unsigned char recive(){unsigned char dd;if(RI) { dd=SBUF; RI=0; } return(...

怎么用c语言编程51单片机读写程序?
编程代码如下:ORG 0000H MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值 MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值 MOV RO,#00H LOOP: MOVX A, @DPTR .MOVX @RO, A .INC DPTR INC RO CJNE RO,#64H, LOOP SJMP

51单片机 C语言 串口数组赋值问题
贴上来的程序部分,修改如下:include<reg52.h> include<stdio.h> \/\/打印到串口函数 define uchar unsigned char define uint unsigned int uchar date_zi[4][11];\/\/存放接收到的数据 uint i_index=0;\/\/接收到的字符个数 uint i=0;\/\/i字符用于循环 unsigned int xia = 0;\/\/用于保存到...

想用单片机接受从串口调试助手那里发送过来的数值数据,如何写代码(C...
\/\/ 单片机串行口发送\/接收程序,每接收到字节即发送出去 \/\/ 和微机相接后键入的字符回显示在屏幕上 \/\/ 可用此程序测试 \/\/ include <reg51.h> define XTAL 11059200 \/\/ CUP 晶振频率 define baudrate 9600 \/\/ 通信波特率 void main(void){ unsigned char c;TMOD = 0x20; \/\/ 定时...

51单片机把数据存入指定的地址或在读指定地址的数据用C语言怎么写?
rval=CBYTE[0x0002];指向程序存贮器的0002h地址 rval=XWORD[0x0002];指向外RAM的0002h地址 2. _at_关键字 直接在数据定义后加上_at_ const即可,但是注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。例如:idata struct link list _at_ 0x40;指定list结构从40h开始。xd...

51单片机 串口接收数据 十进制
要看你发的1234是什么形式的数据了,串口助手可以发十六进制或者是ascii字符(也许你用的有更多形式的)。可以设一个4个字节的接收缓冲区recebuf[4],每来一次串口中断就把一个值写进缓冲区。有以下两种情况:十六进制0x01,0x02,0x03,0x04发送:缓冲区接收到的四个字节即为0x01,0x02,0x03,0x04...

一道51单片机的C语言程序,关于串口通讯的,很简单...
if(flag==1) \/\/等待flag标志位置位,当接收到数据的时候在串口接收中断中置位 { ES=0; \/\/禁止串口中断,但是注意发送中断标志位的置位仍然正常 for(i=0;i<18;i++) \/\/for循环为了一个个把之前定义的字符串 { SBUF=table[i]; \/\/向串口收发缓冲器中写入回应的内容“I receive...

相似回答