51单片机 | 串口通信实验(模拟串口通信/多机通信实例)

发布者:不羁少年最新更新时间:2020-06-27 来源: eefocus关键字:51单片机  模拟串口通信  多机通信 手机看文章 扫描二维码
随时随地手机看文章

实验7.4:RS232串口应用实例

设计要求:

通过串口发送接收数据(串口工作方式1)

实现思路:

  • 定时器设置

  • 串口设置

  • 开启定时/计数器

  • 串口执行

    • 接收数据

    • 发送数据

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:

 1 #include

 2 main()

 3 {

 4     TMOD = 0x20;

 5     SM0 = 0;

 6     SM1 = 1;

 7     REN = 1;

 8     PCON = 0;

 9     TH1 = 0xFD; //253=256-(1*11.0592*10^6)/(384*9600)

10     TL1 = 0xFD;

11     TR1 = 1;

12     P1 = SBUF;

13     while(!RI);

14     RI = 0;

15     SBUF = P1;

16     while(!TI);

17     TI = 0;

18 }

————————————————————————————————————————————

实验7.5:MAX487多机通信应用实例

设计要求:

在主从3个单片机中进行双机通信,当从机显示的数字和主机相同,则表示该主机和从机正在通信。按下主机按键切换当前对象。

实现思路:

  • 主机端

    在主机中设置定时器和串口参数,并一直保持发送数据的状态。

    通过MAX487芯片将3个单片机连接,并通过设置/RE、DE管脚控制单片机输入输出状态。

    需要按下主机按键时检测按键状态,切换当前对象,设置中断,并标记此时状态是从机1或从机2。

    //中断发生时按照中断优先级,主机先执行cort++并发送信息,主机中断结束后才进入从机中断。

    如果是从机1,输出状态下发送对应数字,输入状态下设置单片机通信(非多机通信)接收并显示对应数字,重置输出状态。从机2同理。

  • 从机端

    设置与主机相同的串口参数和定时器和默认显示值。允许接收中断

    当按键被按下,判断主机要通信的是否是自己,是则显示对应数字并向主机发送数字,否则重置状态。

执行流程:(多机通信模式)

  • 主机

  • 从机

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:SM2=1,多机通信模式!


主机

 1 #include

 2 #include

 3 unsigned char cort = 0;

 4 sbit P3_5 = P3 ^ 5;

 5 key_serial() interrupt 0 using 1

 6 {

 7     ++cort;

 8     if (cort == 3)

 9         cort = 1;

10 }

11 void main()

12 {

13     P2 = 0xff;

14     TMOD = 0x20;

15     TH1 = 0xFD;

16     TL1 = 0xFD;

17     PCON = 0x00;

18     TR1 = 1;

19     SCON = 0xF8;

20     EA = 1;

21     EX0 = 1;

22     IT0 = 1;

23     P3_5 = 1;

24     while(1)

25     {

26         if (cort == 1)

27         {

28             SBUF = 0x01;

29             while(TI != 1);

30             TI = 0;

31             P3_5 = 0;

32             RB8 = 1;

33             while(RI != 1);

34             RI = 0;

35             P2 = SBUF;

36             P3_5 = 1;

37         }

38         if(cort == 2)

39         {

40             SBUF = 0x02;

41             while(TI != 1);

42             TI = 0;

43             P3_5 = 0;

44             RB8 = 1;

45             while(RI != 1);

46             RI = 0;

47             P2 = SBUF;

48             SM2 = 1;

49             P3_5 = 1;

50         }

51 

52     }

53 }

从机1

 1 #include

 2 #include

 3 sbit P3_5 = P3 ^ 5;

 4 void serial(void) interrupt 4 using 1

 5 {

 6     ES = 0;

 7     RI = 0;

 8     if (SBUF == 0x01)

 9     {

10         P3_5 = 1;

11         RI = 0;

12         TB8 = 1;

13         P1 = 0x10;

14         SBUF = 0x10;

15         while(!TI);

16         TI = 0;

17     }

18     else P1 = 0;

19     P3_5 = 0;

20     ES = 1;

21 }

22 void main()

23 {

24     P1 = 0x00;

25     TMOD = 0x20;

26     TH1 = 0xFD;

27     TL1 = 0xFD;

28     PCON = 0x00;

29     TR1 = 1;

30     SCON = 0xF0;

31     EA = 1;

32     ES = 1;

33     P3_5 = 0;

34     while(1)

35         _nop_();

36 }

从机2

 1 #include

 2 #include

 3 sbit P3_5 = P3 ^ 5;

 4 void serial() interrupt 4 using 1

 5 {

 6     ES = 0;

 7     RI = 0;

 8     if (SBUF == 0x02)

 9     {

10         P3_5 = 1;

11         RI = 0;

12         TB8 = 1;

13         P1 = 0x20;

14         SBUF = 0x20;

15         while(!TI);

16         TI = 0;

17     }

18     else P1 = 0;

19     P3_5 = 0;

20     ES = 1;

21 }

22 void main()

23 {

24     P1 = 0x00;

25     TMOD = 0x20;

26     TH1 = 0xFD;

27     TL1 = 0xFD;

28     PCON = 0x00;

29     TR1 = 1;

30     SCON = 0xF0;

31     EA = 1;

32     ES = 1;

33     P3_5 = 0;

34     while(1)

35         _nop_();

36 }

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


实现代码:SM2=0,单机通信模式!


主机

 1 #include

 2 unsigned char cort = 0;

 3 sbit P3_5 = P3 ^ 5;

 4 void key_serial() interrupt 0 using 1

 5 {

 6     ++cort;

 7 }

 8 void main()

 9 {

10     P2 = 0x0f;

11     TMOD = 0x20;

12     TH1 = 0xFD;

13     TL1 = 0xFD;

14     PCON = 0x00;

15     TR1 = 1;

16     SCON = 0xD0;

17     EA = 1;

18     EX0 = 1;

19     IT0 = 1;

20     P3_5 = 1;

21     while(1)

22     {

23         if (cort == 1)

24         {

25             SBUF = 0x01;

26             while(!TI);

27             TI = 0;

28             P3_5 = 0;

29             while(!RI);

30             RI = 0;

31             P2 = SBUF;

32             P3_5 = 1;

33         }

34         if(cort == 2)

35         {

36             SBUF = 0x02;

37             while(!TI);

38             TI = 0;

39             P3_5 = 0;

40             while(!RI);

41             RI = 0;

42             P2 = SBUF;

43             P3_5 = 1;

44         }

45         if (cort == 3)

46             cort = 1;

47     }

48 }

从机1

 1 #include

 2 #include

 3 sbit P3_5 = P3 ^ 5;

 4 void serial(void) interrupt 4 using 1

 5 {

 6     ES = 0;

 7     RI = 0;

 8     P2 =  SBUF;

 9     if (SBUF == 0x01)

10     {

11         P3_5 = 1;

12         P1 = 0x10;

13         SBUF = 0x30;

14         while(!TI);

15         TI = 0;

16     }

17     else P1 = 0;

18     P3_5 = 0;

19     ES = 1;

20 }

21 void main()

22 {

23     P1 = 0x00;

24     TMOD = 0x20;

25     TH1 = 0xFD;

26     TL1 = 0xFD;

27     PCON = 0x00;

28     TR1 = 1;

29     SCON = 0xD0;

30     EA = 1;

31     ES = 1;

32     P3_5 = 0;

33     while(1)

34         _nop_();

35 }

从机2:略

————————————————————————————————————————————

关于该实验在多机通信和单机通信下不同情况的讨论

  • 在单机通信模式下,SM2 == 0,

    初始化:SCON = D0;

    发送完毕:TI=0;

    接收完毕:RI=0;

    中断触发条件:RI=0且SM2=0,RI置位

    此情况下,发送和接收信息结束后需要对RI和TI手动置为0即可。

  • 在多机通信模式下,SM2在0和1之间调整

    初始化:主机:SCON = F8;从机:SCON = F0;

    中断触发条件:接收到的第九位RB9==1,RI置位(如果RB8=0,RI就会等于0,就不能进入接收中断,自然丢失信息了。)

       

  • 51单片机原理及应用(陈海宴)书P129案例是在主机发送状态下使用多机通信,接收状态下使用单机通信,在理解上容易出现错误,过程分析及代码如下:

实现代码:


主机:

 1 #include

 2 #include

 3 unsigned char cort = 0;

 4 sbit P3_5 = P3 ^ 5;

 5 key_serial() interrupt 0 using 1

 6 {

 7     ++cort;

 8 }

 9 void main()

10 {

11     P2 = 0xff;

12     TMOD = 0x20;

13     TH1 = 0xFD;

14     TL1 = 0xFD;

15     PCON = 0x00;

16     TR1 = 1;

17     SCON = 0xF8;

18     EA = 1;

19     EX0 = 1;

20     IT0 = 1;

21     P3_5 = 1;

[1] [2]
关键字:51单片机  模拟串口通信  多机通信 引用地址:51单片机 | 串口通信实验(模拟串口通信/多机通信实例)

上一篇:STC89C52_51单片机_串口配置_UART串口通信
下一篇:单片机_指针读取内容解析

推荐阅读最新更新时间:2024-11-11 12:11

51单片机+DS18B20温度上下限报警可调数字温度计
单片机源程序如下: /******************************************************************** * 程序名; 基于DS18B20的测温系统 * 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来 * 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限 * 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动 * 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除 * 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能, * K1是实现减1功能,K3是用来设定上下限温
[单片机]
<font color='red'>51单片机</font>+DS18B20温度上下限报警可调数字温度计
51单片机程序设计中的地址指针及其应用
CS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令: MOVX A,@DPTR MOVX @DPTR,A MOVX A,@RI MOVX @RI,A 其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。 MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。 执行“MOVX A,@DPTR”和“MOVX @DPTR,A”指令时,在读指令代码阶段,由程序计数器(PC)提供A0
[单片机]
51单片机(STC89C52)在Ubuntu下的开发
简介 都是8051衍生的8位单片机, STC单片机有89/90/10/11/12/15这几个大系列, 每个系列的特点如下 89系列是传统的8051单片机, 烧录方法有区别, 但是功能上可以和AT89系列兼容, 属于12T单片机 90系列是89系列的改进型, 12T单片机 10和11系列是1T单片机, 有PWM, 4态IO接口, EEPROM等功能, 但都没有ADC 12系列是增强型功能的1T单片机, 型号后缀AD的带ADC, 后缀S2的除了ADC还带双串口 15系列是最新的产品, 内部集成了高精度R/C时钟, 不需要外部晶振 STC89C52参数 STC89C52和STC89C51的区别仅在于Flash大小, C51为4K而C
[单片机]
基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
基本介绍 这个一个基于51单片机做的一个语音识别分类智能垃圾桶,我这里用的是STC89C52 通过我们说话来对垃圾词语进行分类。比如:垃圾桶(一级指令)易拉罐(垃圾词语),我们通过说话 说出关键字 让语音模块 接收到 —— 语音模块通过串口发指令给51单片机,针对指令 51单片机发指令和语音合成模块,让喇叭说话、 并且控制指令对应的舵机从而实现对垃圾桶开盖。实现起来其实不难。 器件 51单片机 LD3320语音模块 我用的是这个 飞音云店铺的 开源的。 SYN6288语音合成 SG90舵机(4个) 180°不带限位。 usb-ttl模块 垃圾桶四个(4个) 面包板(建议用) 其他 还有什么杜邦线啥的这里
[单片机]
基于<font color='red'>51单片机</font>+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
如何利用51单片机同时扩展RAM和ROM
下面这个系统中,8051同时扩展片外程序存储器和数据存储器,两片存储器的片选信号都接地, 即同时有效,也就是说,这两片存储器无需选择。 51同时扩展RAM和ROM 下面来分析这个问题,该系统中虽然有两片存储器,但由于两片存储器的输入,输入允许信号不同,程序存储器没有输入允许,其输出允许由8051的引脚PSEN控制,只有当程序存储器的片选信号和输出允许信号同时有效时,程序存储器的总线才挂接到CPU总线上 。否则,程序存储器的所有总线引脚都为高阻态,即相当于存储器与CPU总线断开。 数据存储器的输入允许端为WR,受控于8051的P3.6, 输出允许信号为RD,受控于8051的P3.7,数据存储器要与8051挂接的条件是片选信号
[单片机]
51单片机实现控制网卡芯片进行数据传输的设计
在网络技术应用日益广泛的今天,网络传输是最经济有效的数据传输方式。如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的高级协议,采用发送小数据包的方式以避免分段,来简化TCP协议和UDP协议,实现互联接入。 硬件设计与实现 系统的硬件结构框图如图1所示。本系统的微控制器是Winbond公司的78E58,网络接口芯片是与NE2000系列兼容的ReaLTEk公司的RTL8019AS。RTL8019AS内置了10BASE-T收发器,外接一个隔离LPF滤波器,经RJ-45接口输出。外部RAM
[单片机]
<font color='red'>51单片机</font>实现控制网卡芯片进行数据传输的设计
利用AT89S51单片机的T0、T1的定时计数器功能
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 1. 电路原理图 2. 系统板上硬件连线 (1). 把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 (2). 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。 (3). 把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。 3. 程序设
[单片机]
51单片机数据操作和指令类型
MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类 数据传送指令(29条) 算术运算指令(24条) 逻辑运算指令(24条) 控制转移指令(17条) 位操作指令(17条)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved