单片机与PC机串口通讯

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-03
51单片机与PC机之间的硬件串口连接???? 具体的怎样连接????

单片机通过TXD和RXD两条线 连接MAX232芯片后,转换电平,连接PC串口,一般是2、3脚,5脚是地线。一共三根线。

单片机的TXD接电脑的RXD,单片机的RXD接电脑的TXD。地线接地线。

VB中要用MSCOMM控件,设置相同的波特率,起始、结束位、校验位,数据位等。

VB的MSCOMM控件设置好端口号,然后PORTOPEN= true
就可以接收单片机数据了。
简单的就是用查询的办法,用一个定时器,不断的查询mscomm控件的input属性和inbufferlen属性。

MSCOMM控件有个接收模式,文本或者二进制,如果简单的,建议用文本的,比较好处理。
二进制的,就用字节数组接收。也简单。

检测温度的,直接把温度转换成数字字符,传给电脑就OK了,单工的就OK了。


呵呵,女孩也学单片机?哈哈,时代不同了。

#include"reg51.h"
unsigned int rt=0,tt=0,dema,temp;
unsigned int re_buf[3]={0};初值
unsigned char send_buf[4]={'O','K','O','K'};//返回
unsigned char code leds_a[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9共阳极
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3; //数码管选位
bit L11;
void rs232_S(void);//串口初始化
void disp(void);//数码管显示

void main(void)
{
rs232_S();
while(1)
{
disp();
if(L11)
{
tt=0;
TI=1;//直接触发中断
L11=0;
}
}
}
void rs232_S(void)
{
TMOD=0X21;//T0用于定时作延时用 方式1
TH1=0XE6;
TL1=0XE6;//波特率2400
TH0=0Xf8;
TL0=0X30; //晶振12M初值2mS
TR0=1;
ET0=1;
SCON=0X50;
PCON=0X80;//smod加倍
TI=0;
RI=0;
L11=0;
ET1=1;
TR1=1;
ES=1;
EA=1;
}
void RS232(void) interrupt 4
{
if(RI)
{
RI=0;
rt++;
if(rt<5)
{
re_buf[rt-1]=SBUF;

if(rt>=4)
{
L11=1;
rt=0;
}
}
}

else if(TI)
{
TI=0;
if(tt<4)
{
SBUF=send_buf[tt];
tt++;
}
}
}
void timer0(void) interrupt 1 //中断进程
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //重装初值
TR0=1;
if(dema)
{
dema--; //2mS延时,延时采用定时中断初值2mS
}
}

void disp(void)
{
P23=0;
temp=re_buf[3];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3; //延时6mS
while(dema!=0);
P23=1;

P22=0;
temp=re_buf[2];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P22=1;

P21=0;
temp=re_buf[1];
temp=temp&0x0f;
P0=leds_a[temp]; //串口发送10进制数 通过转换二进制 保留低4位形成10进制数 选择0-9
dema=3;
while(dema!=0);
P21=1;

P20=0;
temp=re_buf[0];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P20=1;
}
用串口调试助手发送0000-9999四位数(十进制),单片机接收显示在4位数码管上并返回OKOK
这是我刚调试完成的,希望对你有帮助。

1,你的程序delay是如何实现的,是不是长时间占用CPU资源的?因为串行数据传送是连续的,第一个数据ff接收到之后在SHUMA1()函数中delay了这么久再查询串口,之后的数据早就发送完毕了,你可能接收不到之后的了。这样可以解释为什么你一位一位发送的话显示没有问题。因为你手动发送的延时肯定>SHUMA1()函数中delay的总时间。
2,你的程序中SHUMA1()函数是在大循环中循环的。每次运行到if(RI)这行的之间的时间间隔都很久了。不利于连续接收数据。
3,还有其他的可能,我发你一个串口监控软件,可以第三方监控串口通讯。便于你调试。
4,基本上所有的串口调试助手在十六进制发送的情况下,里面空格都是无意义,只是用来把两个字节间隔开。
6,查邮件peanot@163.com
7,有问题再补充

由于字数限制,我另外附上我的部分程序:

if ( RI ) //扫描判断是否接收到数据,
{
if(a==0)
{
temp1=SBUF; //接收数据SBUF赋与dat0
RI=0; //RI清零
if(temp1==0xff)
a++;
}

else if(a==1)
{
dat0 = SBUF;
RI=0;
a++;
}

else if(a==2)
{
dat1 = SBUF;
RI=0;
a++;
}

else if(a==3)
{
dat2 = SBUF;
RI=0;
a++;
}

else if(a==4)
{
temp=SBUF;
str0=temp;
RI=0;
}
a=0;
}

SHUMA1(); //显示接收到的数据

我的数码管显示子程序如下:

sbit gewei=P2^2; //个位选通定义
sbit shiwei=P2^3; //十位选通定义
sbit baiwei=P2^4; //百位选通定义
sbit qianwei=P2^5; //千位选通定义
sbit wanwei=P2^6; //万位选通定义
sbit shiwanwei=P2^7; //十万位选通定义

void SHUMA1() //数码管显示接收到的数据
{
shiwanwei=0;
P0=table[dat0/16]; //十万位
Delay(8);
shiwanwei=1;

wanwei=0;
P0=table[dat0%16];//万位
Delay(5);
wanwei=1;

qianwei=0;
P0=table[dat1/16]; //千位
Delay(5);
qianwei=1;

baiwei=0;
P0=table[dat1%16]; //百位
Delay(5);
baiwei=1;

shiwei=0;
P0=table[dat2/16]; //十位
Delay(5);
shiwei=1;

gewei=0;
P0=table[dat2%16]; //个位
Delay(5);
gewei=1;

}

现在我还不清楚串口调试助手里面空格的意义,以及它是如何发送数据包的。我用的是串口调试助手V2.1。
另外补充一下,板子的功能就是快速的接收电脑发送过来的一个又一个的大量的数据包,并快速的在数码管上显示出来,数码管不断的快速刷新一个又一个的数据,直到显示出最后一个数据。大体作用就是这样。

我的邮箱是:peanot@163.com

最好附上程序来看看。你是用中断来做吧?中断一次接受一个8位数据,比如12,然后存储在一个单元,再中断一次再存储在下一个单元(34),依次类推。。最后判断接受完所有数据了,再进行数据的处理,你这样就可以一次性发送123456这串数据了。
在串口调试助手里,在发送选项里如果没选以16进制发送,那空格就代表ASCII码的20,选中以16进制发送好像空格没影响,这点待验证

RS232的波特率也要设置的!

  • pc机与单片机串口通信问题
    答:这个完全可以。利用串口助手,发送16进制数据,单片机接收到后进行译码,然后送到io口上显示出来就行了。但是不能直接发送汉字,因为汉字的编码不在ascii中,所以要想显示汉字,需要先取模,然后发送字模,这样就可以显示了。如果你的程序已见雏形,我可以帮你调试!
  • 单片机跟PC机通信 PC机发送数据,单片机收到后将数据在数码管显示,同时...
    答:单片机与PC机串口通信,单片机的串口收发程序很简单,网上也非常多,对串口初始后,设置好波特率,开串口中断,就可以等待接收PC的数据了,如果PC发单字节数据,收到后原样发送即可。
  • PC机如何实现与单片机间串行通信
    答:有两种方法与PC通信:1,加接一个USB转串口的硬件设备(网上很容易买到),这样既解决了数据线的连接又解决了单片机供电问题,但PC端可能需要安装USB驱动,而且要碰运气,往往因USB驱动问题无法一次成功;2,通过RS232接口与PC通信,当然也少不了硬件支持,自己做或到网上买一RS232模块,步骤1:将模块9...
  • PC与单片机串行通信控制背景和意义
    答:还可以通过PC机串口发送数据给单片机,用来控制单片机的工作状态等等。和PC机通信应该是应用最广泛的。二、和其他串口设备通信:单片机一般充当控制器的角色,通过串口发送一定格式的数据来控制与之相连设备的动作,同时设备也会反馈回来一些自己的状态信息给单片机,供单片机进行判断,做出相应的控制。
  • 如何实现PC机与单片机AT89C51的串行通信
    答:首先要看PC机有没有串口,即是电脑上的COM口,这是RS232口,有的话,就很方便。单片机的RXD,TXD两个脚就是串行通信的引脚,用一片MAX232,或MAX202,把RXD,TXD两脚接到MAX232上,组成一个RS232接口电路,MAX232的RXD,TXD接到DB9头上,再用一条串口线,连接单片机的DB9头和电脑上的串口,也是一个...
  • PC机与单片机之间的串口通信的程序
    答:利用汇编语言编写PC机与单片机之间的串口通信的程序,以PC机作为上位机,单片机作为下位机。单片机为51系列,PC机具有RS-232-C接口,利用芯片MAX232实现电平转换。利用串口通信调试小... 利用汇编语言编写PC机与单片机之间的串口通信的程序,以PC机作为上位机,单片机作为下位机。单片机为51系列,PC机具有RS-232-C接口,利用...
  • 在调试rs232串口通信时,单片机往PC机上发数据,串口调试助手可以接收...
    答:--- > RX RX <---> TX GND --- GND 按照题意,你的连接方式一定是 PC 串口助手 TX < --- > TX RX <---> RX GND --- GND 这样是肯定收不到数据的 解决办法: 把串口助手的收和发两跟线位置换一下 注意: 观察单片机串口数据时 又要换回来 ...
  • pc机与单片机通信
    答:1、不知道你用什么单片机,无论什么单片机,串口通信都是标准的RS232,你在单片机中开串口通信,设置好数据位数和波特率,发送数据即可。2、串口调试只是一个简单的上位机小软件,你网上随便搜索一下,一大堆。这种类似的软件可以接收外部传输给电脑的串口数据,当然,电脑也可以通过此软件将数据传输给外部...
  • 单片机与PC通信得先开单片机,否则PC机的串口调试助手收不到数据,这是...
    答:1、很有可能是在发送最后一个字节时,将数据送入了SBUF后就不再处理了,其实单片机将该字节发送后,会将TI置1,软件必须对TI再做清零操作,才能保证一次通讯发送真正完成,接口恢复到初始状态。采用在中断程序里发送数据的模式尤其容易在这里出错。2、如果通讯是由PC机触发的,可能还要查一下是否有清零...
  • 单片机与PC机串口通信要不要通信协议?
    答:当然要了 不过 这个协议是单片机内部 给你做好的 你只需要配置下 波特率 停止位几个 有无校验就可以了 pc机 如果用串口助手 也是要配置的 两者一样就OK 不明白 请追问。。。