历史上的今天
返回首页

历史上的今天

今天是:2025年06月27日(星期五)

正在发生

2020年06月27日 | 51单片机 | 串口通信实验(模拟串口通信/多机通信实例)

2020-06-27 来源:eefocus

实验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;

推荐阅读

史海拾趣

AMS公司的发展小趣事

ABLIC的起源可以追溯到精工电子有限公司旗下的精工半导体有限公司(SII Semiconductor Corporation)。在半导体产业蓬勃发展的背景下,日本政府通过政策投资银行对SII进行了注资,使其在原有业务基础上进一步拓展。然而,随着股权结构的变动,SII决定在2018年进行品牌重塑,更名为ABLIC,并专注于模拟半导体业务的发展。这一决策标志着ABLIC踏上了全新的发展道路。

Edsun Laboratories Inc公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ECM Electronics Limited.开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,将产品出口到多个国家和地区。为了更好地服务全球客户,公司还设立了海外办事处和研发中心,加强与国际市场的联系和合作。通过国际化战略的实施,ECM进一步提升了品牌知名度和市场竞争力。

洲光源(Chau Light)公司的发展小趣事

在洲光源公司的发展历程中,品质一直是其核心竞争力之一。公司始终坚持严格的质量控制标准,从原材料采购到产品生产、检测的每一个环节都严格把关。同时,洲光源还注重品牌塑造和市场推广,通过参加各种行业展会、举办技术交流会等方式,不断提升品牌知名度和影响力。这些努力使得洲光源的红外LED产品逐渐在市场上脱颖而出,成为众多客户的首选品牌。

Cynergy 3公司的发展小趣事

Cynergy 3一直将客户需求放在首位,致力于为客户提供定制化的产品解决方案。公司拥有一支经验丰富的工程师团队,他们与客户紧密合作,深入了解客户的实际需求。在此基础上,Cynergy 3不断推出符合客户需求的新产品和新技术。这种以客户需求为导向的产品创新策略使得Cynergy 3能够不断满足市场的变化需求,保持其在行业中的领先地位。

General Microcircuits Corp公司的发展小趣事
确保电路具有良好的接地和屏蔽,以减少外部干扰对电路的影响。
长江连接器(CJT)公司的发展小趣事

长江连接器一直将研发实力和技术创新作为公司的核心竞争力。公司拥有一支高素质的研发团队,不断投入资源进行新技术和新产品的研发。通过引进先进的研发设备和技术手段,长江连接器成功研发出了一系列高品质、高性能的连接器产品,满足了市场的多样化需求。同时,公司还积极申请各类专利和知识产权,保护自己的技术成果。

问答坊 | AI 解惑

搜集的PID资料

我搜集的PID资料,共享一下。…

查看全部问答>

MAX232

MAX232两个数据通道,7,8,9,10脚和11,12,13,14脚,在转送数据时,是不是有区别啊?我做串口通信时,用7,8,9,10脚的第二通道时,MAX232发热,串口检测不到,换了第二通道后就好了,不懂这是为什么,各位大虾指点一下呗,小生先谢谢了哦…

查看全部问答>

09年全国大学生电子设计大赛征题原题

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 09年全国大学生电子设计大赛征题原题!!!!!!很难得哦!!!  …

查看全部问答>

WinCE5.0选中文为默认语言后HPC的图片资源编不进来

WinCE5.0选中文为默认语言后HPC的图片资源编不进来 现象就是开机后,桌面上只有“我的电脑”,“回收站”,“我的文档”等文字,没有相应的图标。 Default Language选“中文”,并且增加了Multilingual User Interface(MUI) 编译出来的image就是 ...…

查看全部问答>

上海机房服务器托管|15900452544,上海\浙江\山东双线机房服务器托管

上海速腾数据主要经营:上海电信机房托管 上海电信主机租用 上海双线服务器托管 QQ:712296031  MSN/mail:chenxiaokai18@hotmail.com  手机:15900452544 网址:www.sutenw.com …

查看全部问答>

硬盘磁头坏了,修复硬盘恢复数据请指点

我在上海,我的硬盘Maxtor牌子的,由于电源线当时接反了,导致硬盘磁头已经坏,我上面的数据很重要,现在请教各地的高手或者介绍有比较强的技术和单位帮助恢复数据,不知道谁能介绍这样的单位和个人能恢复我的数据?…

查看全部问答>

如何利用KEIL 编译下载到0X1000运行的应用程序

如何设置KEIL及文件编译 使应用程序的地址为0X1000  使用的是LM3S8962开发板…

查看全部问答>

xilinx FPGA配置问题

请教个配置问题:在初始化下载链时,能找到FPGA芯片与配置芯片,可是在下载程序时,无论是下载到配置芯片,还是直接下载FPGA芯片,都遇到IDCODE 不匹配的错误(如图所示),请问高手这是什么原因造成的?(配置芯片上存有程序,且现在程序能正常运 ...…

查看全部问答>

求救:一个简单的 问题

我将一个数比如10传给单片机的一个管脚P2.6。 怎么利用这个数赋给GAIN呢。直接GAIN=P2.6?谢谢…

查看全部问答>

两个函数未定义,不知原因,高手指点

群里用人用 英蓓特stm32 v100的开发板么? 我是新手,有两个问题请教下~   Build target \'STM32F10x Release\'compiling main.c...main.c(123): warning:  #223-D: function \"RCC_WaitForH ...…

查看全部问答>