单片机课程设计
课题:单片机与单片机之间的串行通讯
班级:
学号:
姓名:
指导老师:
目录一、任务简介--------------------------------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)
- ORG 0000H
- LJMP MAIN
- ORG 0023H ;串行口中断入口地址
- LJMP Seri_INT
- MAIN:MOV SP,#0EFH ;堆栈初始化
- MOV TMOD,#20H ;定时器T1方式2
- MOV SCON,#50H ;串口初始化方式1多机通信
- MOV R0,#30H ;发送数据区首址
- MOV R1,#40H ;接收数据区首址
- LCALL Switch ;选择波特率
- SETB EA ;开总中断控制位
- SETB TR1 ;启动T1
- SETB ES ;允许串口中断
-
- Seri_INT:
- LCALL DLY
- JNB P3.2,FSSSS1 ;K3按键发送
- SJMP Seri_INT
-
- FSSSS1:
- LCALL DLY ;延时20ms
- LCALL SEND ;调用发送子程序
-
- ACCCN2:
- LCALL DLY
- JNB P3.3,FSSSS2 ;K4按键接收
- SJMP ACCCN2
-
- FSSSS2:
- LCALL DLY
- LCALL RECE ;调用接收子程序
- INC R0 ;修改发送数据指针
- INC R1 ;修改接收数据指针
- LCALL Display ;将接收到的数据显示出来
-
- SEND:
- MOV A,@R0 ;进入串口中断
- MOV C,P ;C为进位标志位,P为奇偶标志位,把P中的内容传输给C
- MOV SBUF,A ;发送数据到缓冲区
- CLR TI ;发送中断标志清零
- RET
-
-
- RECE:
- CLR RI ;接收中中断标志清0
- MOV A,SBUF ;读出接收缓冲区内容
- MOV @R1,A ;读入接收缓冲区内容
- RET
-
-
- DELAY2ms: ;延时2ms
- MOV R6,#62
- DEL1: MOV R7,#8
- DEL2: NOP ; 晶振频率12MHz,则执行一次所需时间为1微秒
- NOP ; 1微秒
- DJNZ R7,DEL2 ; 2微秒
- DJNZ R6,DEL1 ; 2微秒[(1+1+2)*62+2]*80=2ms
- RET
-
- DLY: ;延时20ms
- MOV R6,#62
- DLY3: MOV R7,#80
- DLY4: NOP ; 晶振频率12MHz,则执行一次所需时间为1微秒
- NOP ; 1微秒
- DJNZ R7,DLY4 ; 2微秒
- DJNZ R6,DLY3 ; 2微秒[(1+1+2)*62+2]*80=20ms
- RET
-
-
- Display:
- MOV DPTR,#TAB ;字型表首址
- CLR P2.2
- CLR P2.3
- CLR P2.4 ;使传送的数据在第0位数码管显示
- MOV A,40H
- MOVC A,@A+DPTR ;查字型表
- MOV P0,A ;将传送的数据送到P0口显示
- LCALL DELAY2mS
- SJMP Display
-
- Switch: ;选择波特率
- LCALL DLY
- MOV P1,#0EFH ;选择按键S13到S16,屏蔽S1到S12
- MOV R3,P1
- CJNE R3,#0EFH,CON1 ;判断按下的键
- SJMP Switch
-
- CON1: CJNE R3,#0E7H,CON2 ;S13选择波特率1200
- MOV TH1,#0E8H ;赋初值232
- MOV TL1,#0E8H
- MOV 30H,#1 ;当波特率是1200时,甲机发送数据1
- RET
-
- CON2: CJNE R3,#0EBH,CON3 ;S14选择波特率2400
- MOV TH1,#0F4H ;初值244
- MOV TL1,#0F4H
- MOV 30H,#2 ;当波特率是2400时,甲机发送数据2
- RET
-
- CON3: CJNE R3,#0EDH,CON4 ;S15选择波特率4800
- MOV TH1,#0FAH ;初值250
- MOV TL1,#0FAH
- MOV 30H,#3 ;当波特率是4800时,甲机发送数据3
- RET
-
- CON4: CJNE R3,#0EEH,CON5 ;S16选择波特率9600
- MOV TH1,#0FDH ;初值253
- MOV TL1,#0FDH
- MOV 30H,#4 ;当波特率是9600时,甲机发送数据4
- CON5: RET
-
- TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0到f的字型表
- DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
- END
复制代码
完整的Word格式文档51黑下载地址:
单片机与单片机之间的串行通讯.doc
(1002.43 KB, 下载次数: 26)
|