PC 机与单片机通信(RS232 协议)

PC 机与单片机通信(RS232 协议)

目录:

1、单片机串口通信的应用

2、PC控制单片机IO口输出

3、单片机控制实训指导及综合应用实例

4、单片机给计算机发送数据:

[实验任务]
单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。
个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机
系统接收后,用LED显示接收到的数据和向上位机发回原样数据。
[硬件电路图]

[实验原理]
RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串
行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。
RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为
20kBps。RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。 我们是
用MAX232芯片将RS232电平转换为TTL电平的。 一个完整的RS-232接口有22
根线,采用标准的25芯插头座。我们在 这里使用的是简化的9芯插头座。
注意我们在这里使用的晶振是11.0592M的,而不是12M。因为波特率的设置
需要11.0592M的。
“串口调试助手V2.1.exe” 软件的使用很简单,只要将串口选择‘CMO1’波
特率设置为‘9600’ 数据位为 8 位。打开串口(如果关闭)。然后在发送区里
输入要发送的数据,单击手动发送就将数据发送出去了。注意,如果选中‘十六
进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中,
则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。
在这里插入图片描述

在这里插入图片描述
[C语言源程序]
#include “reg52.h” //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^4; //个位选通定义
sbit shiwei=P2^5; //十位选通定义
sbit baiwei=P2^6; //百位选通定义
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //1~10
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc–;}
}
void LED() //LED显示接收到的数据(十进制)
{
gewei=0; P0=table[dat%10]; Delay(10); gewei=1;
shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1;
baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1;
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI 清零。
SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
}
LED(); //显示接收到的数据
}
}
///这一个例子是以扫描的方式编写的,还可以以中断的方式编写,请大家思考//
[实验任务]PC控制单片机IO口输出

#include “reg52.h” //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc–;}
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
if(dat0x00) //如果PC发送十六进制00,单片机P1口全亮。
P1=0x00;
else if(dat
0x01)
P1=0x01;
else if(dat0x02)
P1=0x02;
else if(dat
0x03)
P1=0x03;
else if(dat0x04)
P1=0x04;
RI=0; //RI 清零。
SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
}
}
}
[实验任务]单片机控制实训指导及综合应用实例
#include “reg52.h” //包函AT89S52 内部资源的定义(注视参看书160页)
#define uchar unsigned char //宏定义
uchar led [10]={0xbf,0x06,0xdb,0xcf,0x66,0xed,0xfd,0x87,0xff,0xef}; //数字1~10,字符串
uchar led1[64]; //存储接收数据
unsigned int i,j,t,k;
sbit P32=P3^2;
void scjs(void)interrupt 4 //定义中断
{
ES=0;// 使能串行口的中断
k=1;
while(1)
{
RI=0;
led1[k-1]=SBUF; //将接收数据送段码表
k++;
TH0=0x3c; //t0定时50sm内接收不到数据跳过接收
TL0=0xb0;
TR0=1;
while(!RI)
{
if(!TF0) goto FH;
}
}
FH:TF0=0;//TF0不清零不能重新接收
TR0=0;
P32=1;
for(j=1;j<k;j++)
{
SBUF=led[j-1];//数据送回给pc
while(!TI);
TI=0;
}
P32=0;
}
delay(t)
{
ES=1;
SCON=0x50;
for(i=0;i<t;i++);
ES=0;
SCON=0x00;
}
void main (void)
{
int a,c;
TMOD=0x21;
TH1=0Xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
IE=0x90;
TR1=1;
k=1;
P32=0;
while(1)
{
ES=0;
SCON=0x00;
for(a=0;a<=k+1/k8;a++)
{
for(c=5;c>=0;c–)
{
if(a+c<k+1/k
8+1)
{
if(k
1)SBUF=led[a+c];
else SBUF=led1[a+c];
}
else SBUF=0x00;
while(!TI);
TI=0;
}
delay(39000);
}
}
}

#include “reg52.h” //包函8051 内部资源的定义
#define uchar unsigned char
sbit P3_2=P3^2;
uchar zdzt=0x0c;
uchar zsgw=0x02;
uchar zsdw=0x00;
uchar bs=0;
uchar zqsbw=0;
uchar zqssw=0;
uchar zqsgw=0;
uchar yxsj=0x11;
uchar zs=20;
int zqs=0;
uchar zqsgzj=0x00;
uchar zqsdzj=0x00;
uchar zsscgw=0x1f;
uchar zsscdw=0x00;
uchar bzsj;
uchar ztsj;
void key (void);
void keyprc();
void binbcd();
void disp();
void delay();
code uchar tab[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x39};
code uchar zssc[160]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,
0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,
0x77,0x7c,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,0x3f,0x06,
0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f,0x77,0x7c,};
void key(void)
{
TR0=0;
if(!(P2&0X01))
{
delay();
while(!(P2&0X01));
zdzt=0x0a;
disp();
}
else if(!(P3&0X08))
{
delay();
while(!(P3&0X08));
zdzt=0x0b;
disp();
}
else if(!(P3&0X10))
{
delay();
while(!(P3&0X10));
zs=zs+1;
keyprc();
disp();
}
else if(!(P2&0X02))
{
delay();
while(!(P2&0X02));
zs=zs-1;
keyprc();
disp();
}
}
void keyprc()
{
if(zs<20)
zs=20;
if(zs>99)
zs=99;
zsgw=zs/10;
zsdw=zs%10;
}
void djzd(void) interrupt 1
{
TH0=zssc[(zs-20)*2];
TL0=zssc[(zs-20)*2+1];
if(zdzt0x0a)
yxsj=yxsj<<1|yxsj>>7;
else if (zdzt
0x0b)
yxsj=yxsj<<7|yxsj>>1;
else if(zdzt0x0c)
{
P1=0xff;
goto LP;
}
P1=yxsj;
bs++;
if(bs
48)
{
bs=0;
zqs++;
}
LP:binbcd();
disp();
}
void binbcd()
{
zqsbw=zqs/100;
zqssw=zqs%100/10;
zqsgw=zqs%10;
}
void disp()
{
TR1=0;
ES=0;
SCON=0x00;
TMOD=0x01;
SBUF=tab[zqsgw];
while(!TI);TI=0;
SBUF=tab[zqssw];
while(!TI);TI=0;
SBUF=tab[zqsbw];
while(!TI);TI=0;
SBUF=tab[zsdw];
while(!TI);TI=0;
SBUF=tab[zsgw];
while(!TI);TI=0;
SBUF=tab[zdzt];
while(!TI);TI=0;
TMOD=0x02;
TH1=0Xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
}
void delay()
{
int k;
for(k=0;k<1200;k++);
}
void sin()interrupt 4
{
P1=0xff;
ES=0;
bzsj=SBUF;
RI=0;
while(!RI);
RI=0;
ztsj=SBUF;
if(bzsj0x30)
zdzt=ztsj-0x37;
if(bzsj
0x31)
{
if(ztsj0x49)
zs++;
else zs–;
}
ES=1;
P3_2=0;
keyprc();
zqs=0;
disp();
}
main()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
IE=0X92;
PS=1;
TR1=1;
P3_2=0;
TH0=0x1f;
TL0=0x00;
SP=0x60;
disp();
while(1)
{
key();
if(zdzt
0x0c)
{
TR0=0;
P1=0xff;
}
else TR0=1;
}
}
单片机给计算机发送数据:
#include “reg52.h” //包函8051 内部资源的定义
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
unsigned char fan;
int i,j;
void Delay() //延时程序
{
for(i=0; i<100; i++)
for(j=0; j<100; j++);
}
void delays()
{
int k;
for (k=0;k<1200;k++);
}
///功能:串口初始化,波特率9600,方式1/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/主程序功能:实现接收数据并把接收到的数据原样发送回去///
void main()
{
Init_Com();//串口初始化
while(1)
{

if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
if(dat0x30) //如果PC发送十六进制00,单片机P1口全亮。
{P1=0x00;
Delay(); }
else if(dat
0x31)
{P1=0x01;
Delay();}
else if(dat0x32)
{P1=0x03;
Delay();}
else if(dat
0x33)
{P1=0x07;
Delay(); }
else if(dat0x34)
{P1=0x0f;
Delay(); }
else if(dat
0x35)
{P1=0x1f;
Delay();}
else if(dat0x06)
{P1=0x3f;
Delay(); }
else if(dat
0x07)
{P1=0x7f;
Delay();}
else if(dat==0x08)
{P1=0xff;
Delay(); }
else if(!(P2&0x01))
{ delays();
while(!(P2&0x01));
fan = 0x36;}
else if(!(P2&0x02))
{ delays();
while(!(P2&0x02));
fan = 0x37;}
else if(!(P2&0x04))
{ delays();
while(!(P2&0x04));
fan = 0x38;}
else if(!(P2&0x08))
{ delays();
RI=0; //RI 清零。
SBUF =dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
}
}
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 51单片机RS232通信是一种常见的串行通信方式。RS232通信协议是一种标准的串行通信协议,用于在计算机或其他设备之间进行数据传输。 在51单片机中,通常使用UART(通用异步收发传输器)来实现与RS232通信的功能。UART是一种串行通信接口,它能够将数据以位的形式发送和接收。 为了实现51单片机RS232通信,需要将单片机的串行端口连接到计算机的串行端口。首先,需要设置单片机的串行通信参数,如波特率、数据位数、校验方式等。然后,在单片机程序中,可以使用相应的UART库函数或编程指令来发送和接收数据。 数据的发送过程通常是将要发送的数据写入到UART的发送缓冲区,然后单片机通过UART将数据以位的形式传输给计算机。而数据的接收过程则是通过读取UART的接收缓冲区来获取计算机发送过来的数据。 通过51单片机RS232通信,可以实现许多应用,如与计算机进行数据交互、远程控制、数据采集等。此外,还可以通过双向通信实现命令的发送和接收,以实现更复杂的功能。 总结起来,51单片机RS232通信是一种常见的串行通信方式,通过串口连接,使用UART实现数据的发送和接收。这种通信方式广泛应用于各种领域,为系统间的数据交换和控制提供了一种可靠的方式。 ### 回答2: 51单片机RS232通信是一种常见的串行通信方式,通过这种方式可以实现单片机与计算机之间的数据交换。 在51单片机RS232通信中,需要通过串口来进行数据传输。串口是一种串行接口,它能够将数据一位一位地发送或接收。而RS232是一种物理层标准,规定了电气特性、信号电平等参数,使得通信双方能够正常地通信。 在实际应用中,通常需要使用MAX232芯片来进行电平转换,因为RS232通信采用的是±12V的电平,而51单片机输出的是0V和5V的电平。MAX232芯片可以将51单片机的信号转换成RS232所需的电平,从而实现双方的通信。 在程序设计上,通常需要使用相应的串口通信函数来实现数据的发送和接收。单片机利用串口发送数据时,需要将数据按照一定的格式进行封装,包括起始位、数据位、停止位等。计算机接收到数据后,也需要按照相同的格式进行解析。 通过51单片机RS232通信,可以实现很多实际应用,比如远程监控、数据采集等。例如,可以通过计算机向单片机发送指令,控制某个设备的开关状态。或者将传感器采集到的数据通过RS232传输到计算机端进行处理和显示。 总的来说,51单片机RS232通信是一种常见且实用的通信方式,通过合适的硬件和软件设计,可以实现单片机与计算机之间的数据交互。 ### 回答3: 51单片机RS232通信可以通过串口来实现。RS232是一种标准的串行通信接口,包括发送端和接收端,用来实现个人计算机(PC)与其他设备(如打印机、调制解调器等)的通信。而51单片机是一种常用的控制芯片,可以通过编程来控制和管理各种外设。 在使用51单片机RS232通信时,需要将51单片机的串口与RS232的发送端(TXD)和接收端(RXD)相连接。通过编程,可以配置51单片机的串口为特定的波特率、校验位、数据位和停止位,以便与RS232通信接口匹配。 在通信过程中,51单片机可以通过串口发送数据给RS232,或从RS232接收外部设备发送的数据。要发送数据,可以将需要发送的数据存储在相应的寄存器中,然后通过配置好的串口发送数据。要接收数据,需要不断地检测串口接收缓冲区是否有数据到达,如果有数据,则将其读取出来并进行处理。 通过51单片机RS232通信,可以实现各种应用,比如将传感器数据上传到PC,或者通过PC发送指令控制51单片机的行为。在实际应用中,需要根据具体的需求和通信协议来进行编程和配置。 总结起来,51单片机RS232通信通过配置51单片机的串口参数和编程来实现数据的发送和接收。这种通信方式广泛应用于工控领域、嵌入式系统和物联网等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创想工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值