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

发布者:zonheny最新更新时间:2022-05-26 来源: eefocus关键字:51单片机  串口通信  模拟  多机通信 手机看文章 扫描二维码
随时随地手机看文章

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. 1 #include

    2. 2 #include

    3. 3 unsigned char cort = 0;

    4. 4 sbit P3_5 = P3 ^ 5;

    5. 5 key_serial() interrupt 0 using 1

    6. 6 {

    7. 7     ++cort;

    8. 8     if (cort == 3)

    9. 9         cort = 1;

    10. 10 }

    11. 11 void main()

    12. 12 {

    13. 13     P2 = 0xff;

    14. 14     TMOD = 0x20;

    15. 15     TH1 = 0xFD;

    16. 16     TL1 = 0xFD;

    17. 17     PCON = 0x00;

    18. 18     TR1 = 1;

    19. 19     SCON = 0xF8;

    20. 20     EA = 1;

    21. 21     EX0 = 1;

    22. 22     IT0 = 1;

    23. 23     P3_5 = 1;

    24. 24     while(1)

    25. 25     {

    26. 26         if (cort == 1)

    27. 27         {

    28. 28             SBUF = 0x01;

    29. 29             while(TI != 1);

    30. 30             TI = 0;

    31. 31             P3_5 = 0;

    32. 32             RB8 = 1;

    33. 33             while(RI != 1);

    34. 34             RI = 0;

    35. 35             P2 = SBUF;

    36. 36             P3_5 = 1;

    37. 37         }

    38. 38         if(cort == 2)

    39. 39         {

    40. 40             SBUF = 0x02;

    41. 41             while(TI != 1);

    42. 42             TI = 0;

    43. 43             P3_5 = 0;

    44. 44             RB8 = 1;

    45. 45             while(RI != 1);

    46. 46             RI = 0;

    47. 47             P2 = SBUF;

    48. 48             SM2 = 1;

    49. 49             P3_5 = 1;

    50. 50         }

    51. 51

    52. 52     }

    53. 53 }

  • 从机1


    1. 1 #include

    2. 2 #include

    3. 3 sbit P3_5 = P3 ^ 5;

    4. 4 void serial(void) interrupt 4 using 1

    5. 5 {

    6. 6     ES = 0;

    7. 7     RI = 0;

    8. 8     if (SBUF == 0x01)

    9. 9     {

    10. 10         P3_5 = 1;

    11. 11         RI = 0;

    12. 12         TB8 = 1;

    13. 13         P1 = 0x10;

    14. 14         SBUF = 0x10;

    15. 15         while(!TI);

    16. 16         TI = 0;

    17. 17     }

    18. 18     else P1 = 0;

    19. 19     P3_5 = 0;

    20. 20     ES = 1;

    21. 21 }

    22. 22 void main()

    23. 23 {

    24. 24     P1 = 0x00;

    25. 25     TMOD = 0x20;

    26. 26     TH1 = 0xFD;

    27. 27     TL1 = 0xFD;

    28. 28     PCON = 0x00;

    29. 29     TR1 = 1;

    30. 30     SCON = 0xF0;

    31. 31     EA = 1;

    32. 32     ES = 1;

    33. 33     P3_5 = 0;

    34. 34     while(1)

    35. 35         _nop_();

    36. 36 }

  • 从机2


    1. 1 #include

    2. 2 #include

    3. 3 sbit P3_5 = P3 ^ 5;

    4. 4 void serial() interrupt 4 using 1

    5. 5 {

    6. 6     ES = 0;

    7. 7     RI = 0;

    8. 8     if (SBUF == 0x02)

    9. 9     {

    10. 10         P3_5 = 1;

    11. 11         RI = 0;

    12. 12         TB8 = 1;

    13. 13         P1 = 0x20;

    14. 14         SBUF = 0x20;

    15. 15         while(!TI);

    16. 16         TI = 0;

    17. 17     }

    18. 18     else P1 = 0;

    19. 19     P3_5 = 0;

    20. 20     ES = 1;

    21. 21 }

    22. 22 void main()

    23. 23 {

    24. 24     P1 = 0x00;

    25. 25     TMOD = 0x20;

    26. 26     TH1 = 0xFD;

    27. 27     TL1 = 0xFD;

    28. 28     PCON = 0x00;

    29. 29     TR1 = 1;

    30. 30     SCON = 0xF0;

    31. 31     EA = 1;

    32. 32     ES = 1;

    33. 33     P3_5 = 0;

    34. 34     while(1)

    35. 35         _nop_();

    36. 36 }

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

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

  • 主机


    1. 1 #include

    2. 2 unsigned char cort = 0;

    3. 3 sbit P3_5 = P3 ^ 5;

    4. 4 void key_serial() interrupt 0 using 1

    5. 5 {

    6. 6     ++cort;

    7. 7 }

    8. 8 void main()

    9. 9 {

    10. 10     P2 = 0x0f;

    11. 11     TMOD = 0x20;

    12. 12     TH1 = 0xFD;

    13. 13     TL1 = 0xFD;

    14. 14     PCON = 0x00;

    15. 15     TR1 = 1;

    16. 16     SCON = 0xD0;

    17. 17     EA = 1;

    18. 18     EX0 = 1;

    19. 19     IT0 = 1;

    20. 20     P3_5 = 1;

    21. 21     while(1)

    22. 22     {

    23. 23         if (cort == 1)

    24. 24         {

    25. 25             SBUF = 0x01;

    26. 26             while(!TI);

    27. 27             TI = 0;

    28. 28             P3_5 = 0;

    29. 29             while(!RI);

    30. 30             RI = 0;

    31. 31             P2 = SBUF;

    32. 32             P3_5 = 1;

    33. 33         }

    34. 34         if(cort == 2)

    35. 35         {

    36. 36             SBUF = 0x02;

    37. 37             while(!TI);

    38. 38             TI = 0;

    39. 39             P3_5 = 0;

    40. 40             while(!RI);

    41. 41             RI = 0;

    42. 42             P2 = SBUF;

    43. 43             P3_5 = 1;

    44. 44         }

    45. 45         if (cort == 3)

    46. 46             cort = 1;

    47. 47     }

    48. 48 }

  • 从机1


    1. 1 #include

    2. 2 #include

    3. 3 sbit P3_5 = P3 ^ 5;

    4. 4 void serial(void) interrupt 4 using 1

    5. 5 {

    6. 6     ES = 0;

    7. 7     RI = 0;

    8. 8     P2 =  SBUF;

    9. 9     if (SBUF == 0x01)

    10. 10     {

    11. 11         P3_5 = 1;

    12. 12         P1 = 0x10;

    13. 13         SBUF = 0x30;

    14. 14         while(!TI);

    15. 15         TI = 0;

    16. 16     }

    17. 17     else P1 = 0;

    18. 18     P3_5 = 0;

    19. 19     ES = 1;

    20. 20 }

    21. 21 void main()

    22. 22 {

    23. 23     P1 = 0x00;

    24. 24     TMOD = 0x20;

    25. 25     TH1 = 0xFD;

    26. 26     TL1 = 0xFD;

    27. 27     PCON = 0x00;

    28. 28     TR1 = 1;

    29. 29     SCON = 0xD0;

    30. 30     EA = 1;

    31. 31     ES = 1;

    32. 32     P3_5 = 0;

    33. 33     while(1)

    34. 34         _nop_();

    35. 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:


    • 从机2:略

    1. 1 #include

    2. 2 #include

    3. 3 sbit P3_5 = P3 ^ 5;

    4. 4 void serial(void) interrupt 4 using 1

    5. 5 {

    6. 6     ES = 0;

    7. 7     RI = 0;

    8. 8     if (SBUF == 0x01)

    9. 9     {

    10. 10         P3_5 = 1;

    11. 11         SM2 = 0;

    12. 12         P1 = 0x10;

    13. 13         SBUF = 0x10;

    14. 14         while(!TI);

    15. 15         TI = 0;

    16. 16     }

    17. 17     else P1 = 0;

    18. 18     SM2 = 1;

    19. 19     P3_5 = 0;

    20. 20     ES = 1;

    21. 21 }

    22. 22 void main()

    23. 23 {

    24. 24     P1 = 0x00;

    25. 25     TMOD = 0x20;

    26. 26     TH1 = 0xFD;

    27. 27     TL1 = 0xFD;

    28. 28     PCON = 0x00;

    29. 29     TR1 = 1;

    30. 30     SCON = 0xF0;

    31. 31     EA = 1;

    32. 32     ES = 1;

    33. 33     P3_5 = 0;

    34. 34     while(1)

    35. 35         _nop_();

    36. 36 }

    37. 1 #include

    38. 2 #include

    39. 3 unsigned char cort = 0;

    40. 4 sbit P3_5 = P3 ^ 5;

    41. 5 key_serial() interrupt 0 using 1

    42. 6 {

    43. 7     ++cort;

    44. 8 }

    45. 9 void main()

    46. 10 {

    47. 11     P2 = 0xff;

    48. 12     TMOD = 0x20;

    49. 13     TH1 = 0xFD;

    50. 14     TL1 = 0xFD;

    51. 15     PCON = 0x00;

    52. 16     TR1 = 1;

    53. 17     SCON = 0xF8;

    54. 18     EA = 1;

    55. 19     EX0 = 1;

    56. 20     IT0 = 1;

    57. 21     P3_5 = 1;

    58. 22     while(1)

    59. 23     {

    60. 24         if (cort == 1)

    61. 25         {

    62. 26             SBUF = 0x01;

    63. 27             while(TI != 1);

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

上一篇:LCD1602温度显示程序设计流程
下一篇:51单片机入门 - 定时/计数器原理及结构(T0和T1)

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

粤芯陈卫:模拟芯片进口替代或加速
9月17日,2020第23届中国集成电路制造年会暨广东集成电路产业发展论坛在广州召开。广州市半导体协会会长、广州粤芯半导体技术有限公司总裁及首席执行官陈卫以《卓“粤”创芯,集“制”未来》为主题做报告,介绍了疫情下整个行业的趋势情况与粤芯半导体的情况。 在新冠疫情的阴影笼罩下,全球半导体产业发生动荡,产业遭受冲击,尤其欧美制造业的PMI指数呈现严重下滑。虽然疫情冲击着产业,但是同时也给产业带来了机遇。 陈卫表示,中国疫情在短时期内得到控制,最早实现了复工复产,而全球半导体产业虽然总需求有所下滑,但是以5G、特高压等为代表的新基建投资启动,将会带动半导体产业成长。 在全球疫情对于国际半导体巨头供应链严重冲击下,国产半导体企业将会迎
[手机便携]
51单片机驱动CT1642数码管显示源程序
拆解电视机顶盒找到带CT1642控制的数码管 在网上找到代码修改了一下 没有解决按键检测的问题 可根据自己的需求修改对应引脚 制作出来的实物图如下: 单片机源程序如下: sbit DAT=P2^2; sbit CLK=P2^1; sbit KEY=P2^0; u8 NixieTable ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; u8 NixieTablepos ={0,0x02,0x04,0x08}; void CT1642_Write(u8 Pos, u8 Val) { u8 i,Posn; // 1、移18位:对应C1--C4、6位空、Q2--Q9 P
[单片机]
<font color='red'>51单片机</font>驱动CT1642数码管显示源程序
ADC0809与MCS-51单片机接口电路图及编程
ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。目前仅在单片机初学应用设计中较为常见。 ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。 主要特性 1)8路输入通道,8位A/D转换器,即分辨率为8位。 2)具有转换起停控制端。 3)转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时)。 4)单个+5V电
[单片机]
ADC0809与MCS-<font color='red'>51单片机</font>接口电路图及编程
如何使用8051单片机在7段显示器上显示数字?
在使用 单片机开发 项目的时候,经常会使用到7段显示器。7段显示器可以显示字母和数字,它内部是其实是发光 LED 灯,通过控制不同的 接口 点亮内部LED灯,从而显示出数字。目前,它在许多 电子产品 中用于显示 信息 ,比如:充电宝、直发器等。 7段显示器由8个LED构成,这些LED以顺序方式连接,以方便在打开某些LED组合时显示0到9的数字。点亮时,它一次只显示一位数字。 使用80 51单片机 在7段显示器上显示数字的原理图: 在7段显示器上显示从“0到F”的数字的程序是: #include reg51.h sbit a= P3^0; sbit x= P3^1; sbit y= P3^2; sbit z= P3
[单片机]
如何使用80<font color='red'>51单片机</font>在7段显示器上显示数字?
51单片机的控制语句
Cx51流程控制共有3种基本结构:顺序结构、选择结构以及循环结构。 一、顺序结构 顺序结构是最基本、最简单的编程结构,程序按先后顺序执行指令代码。 下图是8051单片机的P0口和P1口上分别连接了8个LED,请分别用P0和P1口显示加法125+34和减法176-98的运算结果 #include int main(void) { unsigned char a=125,b=34,c=176,d=98; P1=a+b; //加法运算结果送P1端口,P1=159=1001 1111B P0=c-d; //减法运算结果送P0端口,P0=78=0100 1110B while(1); //循环等待,防止主程序退出后单片
[单片机]
<font color='red'>51单片机</font>的控制语句
一文解析从数字PWM信号获得准确、快速稳定的模拟电压
脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。    例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于 π/n ,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合
[模拟电子]
51单片机自学笔记(三)——电子电路基础
电平特性 单片机是一种数字集成芯片,走的是数字电路。在数字电路中,只有两种电平:高电平(5V)和低电平(0V)。一般定义单片机的输入和输出为TTL电平,TTL电平信号采用二进制来表示数据,5V等价于逻辑“1”,0V等价于逻辑“0”,TTL电平规定高电平输出电压 2.4V,低电平输出电压 0.4V。计算机串口采用的是RS-232C电平,其高电平为-12V,低电平为+12V。单片机与计算机串口通信时需要使用电平转换芯片,把RS-232C电平转为TTL电平后单片机才能识别。 51单片机IO口 I/O口是基本输入Input/输出Output接口。单片机对外围设备的控制都是通过I/O口来进行的(输出高低电平)。接收外部控制也是通过I/O
[单片机]
<font color='red'>51单片机</font>自学笔记(三)——电子电路基础
众半导体制造商聚焦300mm模拟晶圆厂
2009年,TI(德州仪器)建造了行业里第一个300mm的用于模拟芯片的晶圆厂,此举改变了半导体行业的局面。 到那时为止,模拟芯片的制造使用的是200mm以及更小尺寸的晶圆。在300mm晶圆厂里,TI(德州仪器)可以获得比竞争对手更有利的die-size 和成本优势。理论上,一块300mm晶圆提供的芯片数比200mm的晶圆多2.5倍,从而使TI(德州仪器)降低整体的制造成本。 在过去的一年里,英飞凌和意法半导体已经开始加紧筹划各自的用于模拟芯片的300mm晶圆厂。并且寻求填补缺少晶圆厂和轻晶圆客户空隙的方法,GlobalFoundries是能够提供300mm产能的、用于模拟/混合信号技术的最优秀制造商之一。“TI具
[半导体设计/制造]

推荐帖子

ADXL345程序,,希望可以对大家有用
#includereg52.h#defineucharunsignedchar#defineuintunsignedint#includeINTRINS.H#includemath.hsbitP2_0=P2^0;sbitP2_1=P2^1;sbitP2_2=P2^2;sbitP2_3=P2^3;uintwan,qian,bai,shi,ge,temp_data,t;intdis_data;floata,b,c;#
jonlovehanxu 51单片机
液晶屏 做过 4位显示的 单颜色显示屏的 青帮忙
液晶屏做过4位显示的单颜色显示屏的青帮忙谢谢了QQ122473474液晶屏做过4位显示的单颜色显示屏的青帮忙
xiaokai301 工控电子
求助:stm32对脉冲计数
有哪位大侠用stm32做过对脉冲计数的我现在对电机的位置编码器的输出脉冲进行计数位置编码器一周360度出1024个脉冲,一周以后重新计数哪位大侠指点下,或者有对脉冲计数的程序发我邮箱我来体会一下,不胜感激邮箱:fnj_fny0624@126.com求助:stm32对脉冲计数哇哈哈哈哈。原来STM32就是用这个来做QEI的啊。或者叫做QEP。感谢楼上提问。我也打算用这个做一个电机的位置编码器计数,请问楼主,这个脉冲计数是不是用定时器的输入捕获功能?
zyyu stm32/stm8
STM32插上网线如何通过路由器怎么访问外网啊
现在有一块STM32F107的开发板,按照lwip的例程已经可以和局域网内的另一台电脑进行TCP通信(用python写的server)收发数据。于是想访问互联网,比如简单的,访问一个网址获取网络时间,并且以TCP方式在win电脑上用python写的例子也是能访问成功的(网站没有挂掉),照猫画虎搬运到stm32上,为什么就收不到回信了呢?网上查到的方法有说内网穿透的,有说用ESP8266连WiFi的,但是我觉得电脑或者Linux的开发板,用网线直接插在路由器上就能上网,为什么单片机就不能
硫酸锌01 stm32/stm8
烧78E58 ldrom用什么烧录器.
烧78E58ldrom用什么烧录器.我们公司的烧录器是很老的一个superpro/Z,识别78E58话最大的也就到7FFF,而ldrom烧录的起始位为10000H,找不到这个空间,是不是我的设置不对,如果这个烧录器不能烧ldrom,请帮我介绍一个烧录器.烧78E58ldrom用什么烧录器.
luoweiliang1982 嵌入式系统
我想要一份Evc平台下的用msxml做报告的例子
寻某了很久也没有解决这个问题。希望有人给我发一份MSN:guitar_1314@hotmail.comQQ:22174907我想要一份Evc平台下的用msxml做报告的例子什么意思,没有明白???用msxml做报告的wince例子自己顶下1123顶下有点失望了我不信11
albertzhou 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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