找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12358|回复: 1
打印 上一主题 下一主题
收起左侧

单片机与单片机之间的串行通讯课设报告

[复制链接]
跳转到指定楼层
楼主
ID:328014 发表于 2018-6-20 05:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机课程设计


课题单片机与单片机之间的串行通


班级


学号


姓名:


指导老师





一、任务简介--------------------------------1


二、具体功能--------------------------------1


三、实验设备及原理图-------------------1


四、控制程序设计--------------------------3


五、调试分析---------------------------------9

六、用户使用说明--------------------------11


七、实验小结--------------------------------12

八、附录(源代码-----------------------13






一、任务简介

实现单片机与单片机之间的串行通讯,要求:

(1)利用RS232串行芯片实现双向通讯

(2)传送的数据在数码管上显示出来

(3)可通过键盘选择波特率1200、2400、4800和9600bit/s

(4)串行口工作方式为方式1的全双工串行通信

二、具体功能

(1)首先要能够通过键盘设定两台单片机的波特率,最好能将波特率显示在数码管(注意:两台单片机要想成功通信,必须选择相同的波特率,否则无法正常通信)

(2)发送端的单片机选择数据并通过按键进行发送,在接收端的单片机可选择要不要接受该数据(即按不按接收键),若接收成功则将数据在本机的数码管上显示出来。

(3)两台通信的单片机选择的工作方式为全双工通信方式,即两台单片机都可以选择接收数据与发送数据。

三、实验设备及原理图




四、控制程序设计

1、设计方案:

采用两片89C52单片机来实现上位机对上位机的控制,由于是近距离的双机通信,所以选择接交叉相连的方式,上位机发送的数据由串行口TXD端发送,直接由下位机的串行口数据端RXD接收。需要注意的是一定要保证两台单片机以相同的波特率进行通信,电路分为数码管显示模块,指示模块,以及单片机工作的基本复位,晶振模块,甲机和乙机都需要用到1个数码管,6个按键(2个收发数据按键+4个波特率选择按键)

2、流程图如下:

甲机:

乙机:

  • 实验结果

程序下载成功后,连接好线(P3.0连接P3.1,P3.1连接P3.0)两机都按下S15键,选择波特率4800bit/s,再按下K3键发送,甲机按下K4键接收乙机发送的数字7,并显示在数码管上,如下:(甲机在上,乙机在下)

接下来乙机按S4键接收,数码管上显示3

同理,两机按下复位键后,再分别按下S14键选择波特率2400bit/s,同时按下K3和K4,两边同时接收,甲机显示6,乙机显示2

若所选波特率不同,则两边都显示8

五、调试分析

(1)波特率设置调试

在开始进行波特率调试时,总是不能做到设置多种波特率,后来是设置了四个按键来对应四种不同的波特率,通过检测按键的高低电平来设置波特率,设计波特率的原理就是给不同的按键触发设置不同的TH1和TL1初值,这些初值对应着不同波特率的值。

(2)数码管显示程序调试

本次实验设计要把接收到的数据显示在数码管上,一开始在设计显示程序时,显示的数据总是显示不正确,有时候是乱码显示,有时候是显示初始数据8,有时候是不能显示出数据,经过调试发现是在循环扫描数码管时的所设置的延时时间太长,并且自己所写的字型表也存在一些错误,导致数据不能够在数码管上正常显示,所以对数码管的扫描以及字型表的正确与否,对于数码管显示正确与否至关重要。另外在之后的调试过程中我发现自己无法将波特率和传送的数据同时显示出来,最终便没有显示波特率,只是设置了不同的波特率传送不同的数据。

(3)通信调试

系统采用的是RS232模块进行通信,在开始进行通信调试时,每次都是在另一端不能正确接收,后来发现是连线不正确,我连接的时候将两个发送端相连,两个接收端相连,而正确的连线方法是甲机的RXD(P3.0)连接乙机的TXD(P3.1),然后同理甲机的TXD连接乙机的RXD。

  • 发送与接收数据调试

在确定数码管显示程序调试正确后,我发现进行发送与接收数据调试时数码管显示出来的数据大部分时候都是不正确的,有时是上几次发送的数据,有时候是系统中原有的其他数据。出现这些问题的主要原因是程序设计不够规范致使收发数据不同步,经过老师的指导,我设置了两个按键来控制发送与接收,并调用了合适的延时函数,这才使得数据接收与发送基本同步。

(5)调试心得

通过对程序的不断调试,对于串行口通信有了更深的理解,在调试过程中要想调试出自己的想要的结果,必须要了解硬件的设计原理和电路原理,否则即使代码没有问题,也无法在硬件上调试成功。还有一点就是在调试过程中要有耐心,认真对待,不要浮躁,心态一旦消极了,只会事倍功半,简单的问题也会变得复杂。


  • 用户使用说明

1、首先将MCU程序下载到两台89C52单片机上,两台单片机的代码一样,只是在选择不同波特率时所传送的数据不一样,用户可自行在设置波特率初值之后修改相应的传送数据(本次实验时是甲机传送1,2,3,4给乙机,乙机传送5,6,7,8给甲机)

2、给两台主机设置波特率,通过矩阵按键S13到S16选择波特率,若选择的波特率为1200,则按下k13确认该波特率;同样的按下S14,则选择的波特率为2400;按下S15,波特率为4800;按下S16,波特率为9600,每次选择波特率时也传送了相应的数据给另一台机。另外需注意:要想进行正常通信,两台单片机要设置相同的波特率(按下相同的键),否则无法正常传送数据。

3、设置完波特率之后就可以进行两台单片机之间的通信了,按下k3是选择数据并发送,之后在另一台机器上可以选择是否接收数据,若需接收数据则按下k4,接收数据之后数据可以在接收方的数码管上显示(甲乙两机收发可以同时进行,即同时按下K3键发送不同的数据,同时按下K4键接收,数码管上分别显示收到的数据)

4、若需要选择另外一种波特率进行通信,则需要按下复位键,然后重新在矩阵键盘上选择波特率,方法如上(若甲乙两机选择不同的波特率,则数码管上将乱码显示)。

七、实验小结

这次课程设计主要是实现单片机与单片机之间串行通信,通过本次实验设计,我对单片机之间的串行通信有了更加深刻的理解与体会,对软件与硬件的配合使用也有了新的了解,同时也懂得了一些分析电路及调试程序的方法。在这次程序设计过程中我也遇到了很多困难,例如开始时对题目的理解有偏差,所写的程序与自己后来买的单片机也有些地方不适用等。经过与同学的讨论、老师的指导、以及自己进一步查阅相关资料,回归书本,问题才得以解决。虽然最后设计并没有那么理想(比如波特率与传输数据不能同时显示),但总体上来说实现了单片机间串行通信,基本上算完成了实验要求。通过本次设计我明白了软件与硬件相结合的重要性,二者缺一不可,在实现硬件连接的同时也要读懂软件所实现的功能;通过做实验能够加深我们对理论知识的理解,能够及时地查漏补缺,实现了很好地互补;同时我也意识到做实验时严谨认真的态度是非常重要的,在不断地调试与分析过程中,我们才能真正的意识到自己存在的不足,能够及时地改正,学到更多有用的知识。


八、附录(源代码

当波特率是1200,2400,4800,9600时,甲分别送乙机数据1,2,3,4

当波特率是1200,2400,4800,9600时,乙分别送甲机数据5,6,7,8

以下是甲机源代码:(乙机源代码与甲机一样,只需将1,2,3,4改成5,6,7,8


  1. ORG 0000H
  2.     LJMP  MAIN
  3. ORG  0023H                                ;串行口中断入口地址
  4. LJMP  Seri_INT
  5. MAIN:MOV   SP,#0EFH              ;堆栈初始化      
  6.      MOV   TMOD,#20H              ;定时器T1方式2
  7. MOV   SCON,#50H ;串口初始化方式1多机通信
  8. MOV   R0,#30H              ;发送数据区首址
  9. MOV   R1,#40H   ;接收数据区首址                                                                     
  10. LCALL Switch                 ;选择波特率
  11. SETB    EA       ;开总中断控制位
  12.      SETB    TR1      ;启动T1
  13.      SETB    ES      ;允许串口中断

  14. Seri_INT:
  15.          LCALL  DLY
  16.          JNB   P3.2,FSSSS1                            ;K3按键发送
  17. SJMP               Seri_INT

  18. FSSSS1:
  19.         LCALL  DLY                             ;延时20ms
  20.         LCALL SEND                               ;调用发送子程序

  21. ACCCN2:
  22.          LCALL DLY
  23.          JNB P3.3,FSSSS2   ;K4按键接收
  24.               SJMP               ACCCN2

  25. FSSSS2:
  26.          LCALL DLY
  27.          LCALL RECE              ;调用接收子程序
  28.          INC R0                                          ;修改发送数据指针
  29.   INC R1                                          ;修改接收数据指针
  30.               LCALL Display              ;将接收到的数据显示出来

  31. SEND:
  32.           MOV A,@R0                            ;进入串口中断            
  33. MOV C,P                            ;C为进位标志位,P为奇偶标志位,把P中的内容传输给C
  34.           MOV SBUF,A              ;发送数据到缓冲区
  35.               CLR TI                            ;发送中断标志清零
  36.                   RET


  37. RECE:
  38. CLR   RI                            ;接收中中断标志清0
  39.       MOV   A,SBUF              ;读出接收缓冲区内容
  40.       MOV   @R1,A                            ;读入接收缓冲区内容
  41.         RET


  42. DELAY2ms:                                              ;延时2ms
  43.         MOV  R6,#62
  44. DEL1: MOV  R7,#8
  45. DEL2: NOP          ; 晶振频率12MHz,则执行一次所需时间为1微秒
  46.       NOP            ; 1微秒
  47.       DJNZ   R7,DEL2  ; 2微秒
  48.       DJNZ   R6,DEL1  ; 2微秒[(1+1+2)*62+2]*80=2ms
  49.         RET

  50. DLY:                                                           ;延时20ms
  51.       MOV  R6,#62
  52. DLY3: MOV  R7,#80
  53. DLY4: NOP          ; 晶振频率12MHz,则执行一次所需时间为1微秒
  54.       NOP            ; 1微秒
  55.       DJNZ   R7,DLY4  ; 2微秒
  56.       DJNZ   R6,DLY3  ; 2微秒[(1+1+2)*62+2]*80=20ms
  57.         RET


  58. Display:
  59.         MOV DPTR,#TAB              ;字型表首址
  60.         CLR P2.2
  61.          CLR P2.3
  62. CLR P2.4                            ;使传送的数据在第0位数码管显示
  63.               MOV A,40H
  64.               MOVC A,@A+DPTR              ;查字型表
  65.               MOV P0,A                                 ;将传送的数据送到P0口显示
  66.               LCALL DELAY2mS
  67.               SJMP Display

  68. Switch:                                                           ;选择波特率
  69.        LCALL  DLY               
  70.        MOV    P1,#0EFH                  ;选择按键S13到S16,屏蔽S1到S12
  71.        MOV    R3,P1
  72.        CJNE   R3,#0EFH,CON1              ;判断按下的键
  73.        SJMP   Switch                              
  74.                                                                                       
  75. CON1: CJNE R3,#0E7H,CON2     ;S13选择波特率1200
  76.      MOV TH1,#0E8H                                          ;赋初值232
  77.      MOV TL1,#0E8H
  78. MOV 30H,#1            ;当波特率是1200时,甲机发送数据1
  79.                 RET

  80. CON2: CJNE R3,#0EBH,CON3     ;S14选择波特率2400
  81.       MOV TH1,#0F4H                                          ;初值244
  82.       MOV TL1,#0F4H
  83. MOV 30H,#2          ;当波特率是2400时,甲机发送数据2
  84.                 RET                                          
  85.                
  86. CON3: CJNE R3,#0EDH,CON4     ;S15选择波特率4800
  87.       MOV TH1,#0FAH                                          ;初值250
  88.       MOV TL1,#0FAH
  89. MOV 30H,#3        ;当波特率是4800时,甲机发送数据3
  90.               RET

  91. CON4: CJNE R3,#0EEH,CON5      ;S16选择波特率9600
  92.       MOV TH1,#0FDH                                            ;初值253
  93.       MOV TL1,#0FDH
  94. MOV 30H,#4     ;当波特率是9600时,甲机发送数据4
  95. CON5:   RET

  96. TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H  ;0到f的字型表
  97.      DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H  
  98. END
复制代码

完整的Word格式文档51黑下载地址:
单片机与单片机之间的串行通讯.doc (1002.43 KB, 下载次数: 26)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:354902 发表于 2018-6-20 09:41 | 只看该作者
厉害了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表