pc机与单片机98c52 串口通信 用串口通信助手,发送一个数,单片机接收后返回串口通信助手显示出来。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pc机与单片机98c52 串口通信 用串口通信助手,发送一个数,单片机接收后返回串口通信助手显示出来。相关的知识,希望对你有一定的参考价值。

我的程序如下,请大侠帮忙看一下错在哪里。
#include<reg51.h>
#include<string.h>
unsingned char a;
void init_serialcomm(void)

SCON=0x50;//SCON:serail mode 1,8-bit uart,enable ucvr
TMOD=0x20;//TMOD:timer 1, mode 2,8-bit reload
PCON=0X00;//SMOD =1;
TL1=0xFD;
TH1=0xFD;//Baud:4800 fosc=11.0592MHz
IE=0x90;//enable serial interrupt
TR1=1;//timer 1 run
ET1=0;
a=0x45;
SBUF=a;

void serial()interrupt 4 using 3


if(TI)

TI=0;


if(RI)

RI=0;
a=SBUF;
P1=a;
SBUF=a;

main()

init_serialcomm();//初始化串口
while(1)


unsingned char a;
改成unsigned char a;
串口中断程序少括号:
修改如下
#include<reg51.h>
#include<string.h>

unsigned char a;

void init_serialcomm(void)

SCON=0x50;//SCON:serail mode 1,8-bit uart,enable ucvr
TMOD=0x20;//TMOD:timer 1, mode 2,8-bit reload
PCON=0X00;//SMOD =1;
TL1=0xFD;
TH1=0xFD;//Baud:4800 fosc=11.0592MHz
IE=0x90;//enable serial interrupt
TR1=1;//timer 1 run
ET1=0;
a=0x45;
SBUF=a;

void serial(void) interrupt 4 using 3

if(TI)

TI=0;

if(RI)

RI=0;
a=SBUF;
P1=a;
SBUF=a;


void main(void)

init_serialcomm();//初始化串口
while(1);
参考技术A main()

init_serialcomm();//初始化串口
while(1)


好像一直在空循环的追问

我去掉了while循环,也一样不行的,想求一个正确程序,并指出真正的错误。

追答

//*****************************//
//用串口控制单片机实现 步进电机的
//开始,停止,反转,正转,减速,加速
//串口发1~6,单片机响应,并返回“OK”
//*****************************//

#include
#define uchar unsigned char
#define uint unsigned int
sbit opt=P1^0; //定义管脚
sbit sp =P1^1;
sbit dir=P1^2;
sbit ena=P1^3;
bit flag_serial;
uint speed_wide=1000;
unsigned char SBUF_temp;
void SendOneByte(unsigned char ch);
//---------------------------------------------
void InitUART(void) //串口初始化

TMOD |= 0x20;
SCON = 0x50;
TH1 = 0xF3; //波特率4800
TL1 = TH1; //对于12M 的晶振9600波特率误差较大,
//通信有时无效
PCON = 0x80; //波特率加倍
EA = 1;
ES = 1;
TR1 = 1;
PS = 1; //第一优先级


void InitTimer0(void) //定时T0

TMOD|= 0x01;
TH0 = (65535-speed_wide)/256;
TL0 = (65535-speed_wide)%256;
EA = 1;
ET0 = 1;
TR0 = 0;


void serial_pro()

switch (SBUF_temp)

case '1':ena=0;TR0 = 0;break;
case '2':ena=1;TR0 = 1;break;
case '3':dir=0;break;
case '4':dir=1;break;
case '5':speed_wide=speed_wide+100;break;
case '6':speed_wide=speed_wide-100;break;



void speed_wide_com()

if(speed_wide>=50000)speed_wide=40900;
if(speed_wide<=500)speed_wide=600;


void main(void)

InitUART();
InitTimer0();
opt=1;
dir=0;
ena=0;
while(1)

if(flag_serial==1)

flag_serial=0;
serial_pro();
speed_wide_com();




void UARTInterrupt(void) interrupt 4

if(RI)

RI = 0;
flag_serial=1;
SBUF_temp=SBUF;
SendOneByte('o');SendOneByte('k');

else
TI = 0;

//-定时器
void Timer0Interrupt(void) interrupt 1

TH0 = (65535-speed_wide)/256;
TL0 = (65535-speed_wide)%256;
sp=~sp;

//-返回给串口的数据
void SendOneByte(unsigned char ch)

SBUF = ch;
while(!TI);
TI = 0;

参考技术B 首先确定硬件是否连接正确。。 参考技术C 参考   14、人不是因为遇到一个人而改变自己,而是你内在很想改变,你会注意到那个可以改变你的人,只有在那一刻,你的耳朵才能够听到远方的呼唤。无法从焚心般的欲望解脱出来,便无法得到内心的喜悦和平静。

PC机与stm32串口通信的问题

使用stm32自带AD,利用DMA把数据传输到指定变量(unsigned short),经过软件滤波(取平均值)后再通过串口把变量数据分高低位送入PC,使用串口调试助手接收,函数信号发生器提供6K的方波信号,大致是这个样子,但是我收到的数据有问题,应该是每行两个16进制数,但有时会多一个尾巴(FF FC之类的):
27 07
1F 7F
03 08
37 04
00 9C FC
37 07
00 8B FC
37 1F
00 84 FC
37 03
30 67
00 9F FC
37 00
00 9C FC
37 08
00 83 FC
27 FB FF
00 9C FC
37 03
00 83 FC
37 00
0F F8
00 84 FC
27 FC FF
00 84 FC
27 FF FF
00 88 FC
24 3B
07 24
我把信号输入换成正弦波也是这样子, 但如果接地(这时输出00 00)或接电源(这时输出3F C4)的话尾巴就没有了
这是怎么回事?坐等高手解答

你是否用USB转串口,如果是就换个串口调试工具再看看.
又或者你的工具能够改帖间隔的话,就改下.
参考技术A 这是无线还是有线啊?

以上是关于pc机与单片机98c52 串口通信 用串口通信助手,发送一个数,单片机接收后返回串口通信助手显示出来。的主要内容,如果未能解决你的问题,请参考以下文章

借助虚拟串口驱动软件模拟Proteus中51单片机与PC端串口调试助手软件相互通信

PC机与stm32串口通信的问题

单片机串口通信控制led灯的点亮

CC2530开发模块与51单片机如何实现串口通信

LabVIEW上位机与串口通信

stm8用串口通信,数据发不出去