51单片机串口通信,我在电脑上向单片机发1,用uchar a 来接受,可是a收到的是0x31 而我发2,那是0x32,求解

来自:    更新日期:早些时候
单片机和电脑的串口通信的问题,发送和接受的数据不一直,我发11,收到的的是B1,有事可能是A1.小白求大神~

单片机和电脑的串口通信 的 波特率 设置 不完全 一致,
导致 数据 失真。
TMOD=0X20; //定时器T1方式2
TH1=0XFD; //定时器初值低位
TL1=0XFD; //定时器初值高位
TR1=1; //启动定时器1
为 晶振 频率 11.0592 MHz 波特率 为 9600

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

因为你电脑是按字符发送的,你设为16进制发送就可以了,字符'1'的ASSIC码值,即他的十进制值刚好是0x31,'2'的就是0x32.


51单片机串口通信,我在电脑上向单片机发1,用uchar a 来接受,可是a收到的是0x31 而我发2,那是0x32,求解视频

相关评论:
  • 15299025779PC机与单片机之间的串口通信的程序
    夏毅阎下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。所需的只是: ① 硬件。1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。 ② 串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是...

  • 1529902577951单片机中串口通信在哪个端口,有没有固定的。。
    夏毅阎51单片机中的串口通信是通过P3口的两个引脚(即P3.0和P3.1)实现的,其中P3.0口为串口接收引脚(RXD),P3.1口为串口发送引脚(TXD)。在51单片机中,串口通信的端口是固定的,即P3.0口和P3.1口。这两个引脚通过串口通信电路与串口通信芯片相连,实现串口通信功能。需要注意的是,在使用51...

  • 15299025779看了51单片机的串口通信,有一些疑问??
    夏毅阎所以在串口中断服务中,不能有太多的程序去处理,因为处理这数据时,串口被中断占用就不能接收数据。通常将需要处理的数据放到主程序中,因为前面说了,主程序和串口接收是可以同时运行的。如果在串口中断服务中,程序较多,占去太多时间,正如你说的,那就会丢帧而出错,这是不允许的。

  • 1529902577951单片机串口通信能干神马?想用它控制1602或者12864有没有可能,应该怎...
    夏毅阎单片机把接收到电脑PC串口发送的数据,送到LCD1602液晶显示,这个很简单,例如:你把单片机串口接收缓冲器SBUF数据放到数组里面,Data_rd[5] = SBUF;然后你再把数组写到液晶里面不就OK了吗很简单! 如果有疑问欢迎你继续追问,我会在第一时间内帮你解答,希望我的回答对你有帮助!

  • 15299025779我在做51单片机串口通信,可是总是连不起来 希望大神现身
    夏毅阎} if(k9==0 && y9==0) { y9=1; SBUF=0x90; led=0; } if(k9==1 ) { y9=0; } if(led==0) { while(!TI); TI=0; led=1; } } }include <reg51.h> \/\/ 接收 void main (void) { SCON = 0x50; \/\/ REN=1允许串行接受状态,串口工作模式1 ...

  • 1529902577951单片机串行口通信数据丢失问题
    夏毅阎中断服务程序占用时间太长,将网EEPROM写的程序放在外边,另外,需要开辟一个接收缓冲区,否则有可能丢失数据,用串口助手是没有握手的,所以PC没有多长时间的等待,你来不及接收就丢失了。

  • 15299025779多个下位单片机与上位机pc通过串口通信的实现
    夏毅阎用PC机与多个51单片机通过RS232进行通讯。在多机通讯中,要保证主机与所选择的从机实现可靠的通信,必须保证串口具有识别的功能。在串行口控制寄存器SCON中有一位叫做SM2,就是为了多机通讯而设置的控制位。多机通讯的过程可以如下:1 首先从机初始化,开中断,让其以方式2或3接收(9位异步通讯方式)...

  • 1529902577951单片机我使用串口通信可以控制模板,但直接用单片机控制模板的时候却不...
    夏毅阎利用串口通信控制!这类问题的解决方法是!首先先用串口助手发送数据去控制接收端!如果没问题!第二就是单片机程序运行起来之后!接到串口助手上!看发送的数据是不是你要的数据 看你的描述!第一步已经没有问题了!第二步,你可以把单片机的串口接到电脑上!看看发送的数据对不对!在这里!就是看...

  • 1529902577951单片机通信:串口、SPI、I2C三种常用的通信方式
    夏毅阎51单片机作为嵌入式系统领域的常用平台,支持多种通信方式以适应各类应用场景。本文主要讨论串口、SPI和I2C三种常见的通信方式。首先,串口通信是基础且易于操作,通过UART实现点对点通信,P3.0和P3.1引脚常用于此。它适合小型设备,但传输速率较低,不适用于高速或多设备场景。SPI通信则提供高速、全双工的...

  • 1529902577951单片机串口通信问题
    夏毅阎建议检查:单片机出来的是TTL的,跟PC连接需要max232;txd和rxd是否接反;串口连接线是否有问题(非下载线);串口速率等参数是否一致,单片机晶振决定频率;公共地是否连接正常;连续发送数据给单片机,测单片机rxd口有无波形;单片机程序中设置断点看有否收到数据;...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网