串口通信的问题

2019-07-16 02:59发布

我的程序目的是51单片机的按键1按下时单片机就往外发送56 0036 01 00这几个十六进制数,按键不按就不发送。问题在于按键按下,在串口助手接收区接的是00 56 00 36 01 00,不知道这是为什么? 串口助手的HEX显示打钩了。哪位高手帮忙看看程序哪里的问题.谢谢
#include<reg51.h>
#include<string.h>
#include<intrins.h>
unsigned char ch;
bit flag=0;
sbit K1=P3^1;
sbit K2=P3^2;
sbit LED=P1^0;
unsigned char start_photo_cmd[]={0x56,0x00,0x36,0x01,0x00};
void delay(unsigned char xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}
void init()
{
SCON=0x50;
TMOD=0x20;
PCON=0x80;//
TH1=0xfd; //晶振11.0592MHZ,SMOD=1,波特率19200bps     如果晶振为22.1184NHZ时,波特率为38400
IE|=0x90;
TR1=1;
//
}
void uart_sendbuf(unsigned char  *buf,unsigned char n)
{
  unsigned char i;
  ES=0;
  for(i=0;i<n;i++)
  {
   SBUF=buf[i];
   while(ti==0);
   TI=0;
  }
  ES=1;
}
void ser() interrupt 4 using 3
{
   RI=0;
  ch=SBUF;
  flag=1;
}
main()
{
init();
while(1)
{
   if(K1==0)
  {
    delay(10);
if(K1==0)
{
  while(K1==0);
   uart_sendbuf(start_photo_cmd,5);
}
  }
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
爱及时来了
1楼-- · 2019-07-16 05:40
我用protues仿真过了,原因在于你把K1接到了51的P3.1,P3.1是单片机的串口发送端口,每一次你按下后P3.1先是接收到按键的低电平,然后再发送00 56 00 36 01 00,那么就会在发送的数组前就会多个0x00了,你可以把K1接到别的端口,比如P3.6,把程序改成sbit K1=P3^6;就没有问题了,亲,还有问题的话再联系
WAITXHURT
2楼-- · 2019-07-16 07:13
不是按键的问题。。。按键接在通信口上也可以,只要不在按键按下去的时候通信就是了,但如果IO口富裕的话最好还是别接在通信上。。。
把uart_sendbuf(start_photo_cmd,5);改为uart_sendbuf(start_photo_cmd,4);试试
爱及时来了
3楼-- · 2019-07-16 12:19
 精彩回答 2  元偷偷看……
Maggic
4楼-- · 2019-07-16 13:13
{:16:}
3htech
5楼-- · 2019-07-16 15:59
TXD,RXD无数据时是高电平。注意到书上说的起始位了吗?是不是一个低电平的脉冲?

当你按下按键后,TXD引脚变低,于是相当于发送了一个起始位,于是就有了最开始的数据0。至于为何是0x00而不是其他值,我希望你自己找找原因。

那么为什么又只有一个数据0x00呢,而不是多个呢?停止位在这里起了作用。

你做个实验:
把发送程序去掉,每当你按一次按键,你的串口调试助手就会接收到一个数。试试吧。

1908657045
6楼-- · 2019-07-16 16:54
顶、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

一周热门 更多>