单片机双击串行通信C语言设计报告含代码.docx
《单片机双击串行通信C语言设计报告含代码.docx》由会员分享,可在线阅读,更多相关《单片机双击串行通信C语言设计报告含代码.docx(27页珍藏版)》请在冰豆网上搜索。
![单片机双击串行通信C语言设计报告含代码.docx](https://file1.bdocx.com/fileroot1/2023-1/23/c38db667-745c-40b3-809d-5319e443cdd4/c38db667-745c-40b3-809d-5319e443cdd41.gif)
单片机双击串行通信C语言设计报告含代码
.
※※※※※※※※※
※
※
※
2012级
单片机接口课程设计
※
※
※
※※※※※※※※※
石家庄铁道大学四方学院
集中实践报告书
课题名称
双机串行通信设计
姓
名
邢志杰
学
号
20127019
系、
部
电气工程系
专业班级
方1210-4
指导教师
马丽
2015年7月3日
.
.
一、设计任务及要求:
设计任务:
双机串行通信设计
设计要求:
1、两片单片机利用串行口进行串行通信:
串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。
串行口工作方式为方式1的全双工串行通信。
2、两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1计数
初值TH1、TL1进行设定。
故本题目本质上是通过键盘扫描得到设定的波特率,从而
载入相应的T1计数初值TH1、TL1实现的。
3、要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数码管上。
4、要求做出实物。
二、指导教师评语:
.
.
三、成绩
指导教师签名:
年月日
第1章设计目的··············································错误!
未定义书签。
第2章设计要求··············································错误!
未定义书签。
第3章硬件电路设计············································错误!
未定义书签。
3.1系统框图··············································1
3.2STC89C52单片机最小系统·····································2
3.3按键电路··············································3
3.4主电路设计············································错误!
未定义书签。
第4章软件程序设计············································44.1主程序流程图···········································4
4.2键盘扫描子程序流程图·······································5
4.3从机主程序流程图·········································6
4.4从机中断子程序流程图·······································7
4.5程序调试··············································8
4.6双机串行通信源程序········································9第5章结论················································13参考文献··················································13
.
.
第1章设计目的
1.1设计目的
(1)掌握单片机实际系统的开发步骤。
(2)了解串行通信的原理;了解数码管显示的工作原理;了解键盘扫描的
工作原理;对双机串行通信软件编程、调试、相关硬件设备的使用技能等方面得
到真正的实践机会,把软硬件结合,克服其中的种种问题,提高编程能力。
第2章设计要求
2.1设计要求
(1)两片单片机利用串行口进行串行通信:
串行通信的波特率可从键盘进
行设定,可选的波特率为1200、2400、4800和9600bit/s。
串行口工作方式为方
式1的全双工串行通信。
(2)两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1
计数初值TH1、TL1进行设定。
故本题目本质上是通过键盘扫描得到设定的波特
率,从而载入相应的T1计数初值TH1、TL1实现的。
(3)要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数
码管上。
(4)要求做出实物。
第3章硬件电路设计
3.1系统框图
.
.
单片机1单片机2
按键电路显示电路
AT89C52AT89C52
图3-1系统框图
3.2STC89C52单片机最小系统
89C52共有四个八位的并行双向口,即有32根输入输出口线。
各口的每一
位均由锁存器、输出驱动器和输入缓冲器组成。
VCC(40引脚):
电源电压
VSS(20引脚):
接地
图3-2STC89C52引脚图
P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以
作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
.
.
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端
口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
P1口特点是输出锁存器,输出时没有条件。
输入缓冲,输入时有条件,即需要先将该口设为输入状态,先输出1。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。
P3口为准双向口。
可以字节访问,也可以位访问。
P3.0---RXD,串行输入口。
P3.1---TXD,串行输出口。
P3.2---INT0,外部中断0的请求。
P3.3---INT1,外部中断1的请求。
P3.4---T0,定时器/计数器0外部计数脉冲。
P3.5---T1,定时器/计数器,1外部计数脉冲。
P3.6---WR,外部数据存储器写选通。
P3.7---RD,外部数据存储器读选通。
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,
用来完成单片机单片机的复位初始化操作。
ALE(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存
低8位地址的输出脉冲。
XTAL1(19引脚):
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
STC89C52引脚图如图3-2
所示。
3.3按键电路
.
.
6
7
图3-3按键电路图
本设计按键采用矩阵键盘,键盘连接主机的P2口,主机从矩阵键盘接收信息,通过串行输出口输出到从机,从机从串行输入口接收信息并把信息显示在数码管上。
3.4主电路设计
C1
U1
0
33pF
1
X1
19
XTAL1
P0.0/AD0
39
C2
CRYSTAL
P0.1/AD1
38
2
37
P0.2/AD2
18
36
XTAL2
P0.3/AD3
3
35
S3
S0
P0.4/AD4
33pF
34
P0.5/AD5
C3
33
P0.6/AD6
4
9
32
RST
P0.7/AD7
10uF
P2.0/A8
21
0
0
R3
R1
22
1
P2.1/A9
1
5
10k
10k
23
2
2
P2.2/A10
24
3
29
PSEN
P2.3/A11
3
30
25
4
ALE
P2.4/A12
4
31
26
5
EA
P2.5/A13
5
6
27
6
P2.6/A14
6
28
7
P2.7/A15
7
1
P1.0/T2
P3.0/RXD
10
7
2
11
P3
P3
P1.1/T2EX
P3.1/TXD
3
12
P1.2
P3.2/INT0
4
13
P1.3
P3.3/INT1
5
14
P1.4
P3.4/T0
6
15
P1.5
P3.5/T1
7
16
P1.6
P3.6/WR
8
17
P1.7
P3.7/RD
AT89C52
C4
33pF
U2
X2
19
XTAL1
P0.0/AD0
39
C5
CRYSTAL
P0.1/AD1
38
37
P0.2/AD2
18
36
XTAL2
P0.3/AD3
35
P0.4/AD4
33pF
34
P0.5/AD5
C6
9
33
U4
RST
P0.6/AD6
32
P0.7/AD7
a2
19
a
D0
Q0
10uF
21
b3
18
P2.0/A8
a
b
D1
Q1
R2
22
c4
17
P2.1/A9
b
c
D2
Q2
10k
23
d5
16
29
P2.2/A10
c
d
D3
Q3
PSEN
P2.3/A11
24
d
e
e6
D4
Q4
15
30
25
f7
14
ALE
P2.4/A12
e
f
D5
Q5
31
26
g8
13
EA
P2.5/A13
f
g
D6
Q6
27
h9
12
P2.6/A14
g
h
D7
Q7
28
P2.7/A15
h
11
LE
P10
P3
1
10
P3
1
P1.0/T2
P3.0/RXD
OE
P11
2
11
P1.1/T2EX
P3.1/TXD
P12
3
12
74HC573
P1.2
P3.2/INT0
P13
4
13
P1.3
P3.3/INT1
5
14
P1.4
P3.4/T0
6
15
P1.5
P3.5/T1
U3
7
16
P1.6
P3.6/WR
P10
8
17
2
19
P1.7
P3.7/RD
D0
Q0
P11
3
18
D1
Q1
AT89C52
P12
4
17
D2
Q2
P13
5
16
D3
Q3
6
15
D4
Q4
7
14
D5
Q5
8
13
D6
Q6
9
12
D7
Q7
11
1
LE
OE
74HC573
图3-4主电路图
第4章软件程序设计
.
.
设计思路为:
主机通过键盘扫描程序确认是否有键按下,若有键按下则将按
键号对应的显示代码发送给从机,并判断是否是波特率按键,若是则进行波特率
调整,若无键按下,则继续进行键盘扫描。
从机主程序动态显示缓冲区内的数据。
中断子程序接收数据并判断是否是波特率按键所对应的显示代码,若是则进行波
特率调整,然后将数据保存到缓冲区。
初始波特率都为9600。
4.1主程序流程图
键盘连接到甲机的P2口,通过按键扫描确定键值,从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,实现两机之间的串行通信。
开始
设置串行口工
作方式及波特
N
检测按键
Y
确定按键号
并发送
N
波特率按键
Y
调整波特率
图4-1主机主程序流程图
4.2键盘扫描子程序流程图
.
.
矩阵式键盘扫描的方法常用的有两种,一种是逐列送0,依次读回行;另一种为反转法。
本程序采用前者,程序流程图如下:
开始
P2口列置0,行
置1
读回P2口
行值是否变化
N
调整行,列值
Y
得键号
结束
图4-2键盘扫描子程序流程图
4.3从机主程序流程图
从机主程序动态显示缓冲区的4个数据。
从机的P1口经锁存器74HC573连接数码管位码,P2口经锁存器74HC573连接数码管的段码。
从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,利用中断来接收主机发来的数据,并根据接收的数据来判断是否需要进行波特率调整。
从机主程序流程图如下:
.
.
开始
初始化
送段码,送位码
显示完?
N
调整指针
Y
图4-3从机主程序流程图
4.4从机中断子程序流程图
.
.
开始
清接收标志位RI
保存到缓冲区
波特率按键?
Y
调整波特率
N
中断返回
图4-3从机中断子程序流程图
4.5程序调试
图4-5程序调试
.
.
4.6双机串行通信源程序
/*************************************************************
程序调试软件:
KeiluVision4
程序仿真软件:
ISIS即Proteus-7.8sp2
/*************************************************************
双机串行通信主机程序源代码:
/***********************************************
程序名称:
双机串行通信波特率可调主机程序(C语言)
主机功能:
通过键盘扫描得到键号并发送,同时判断是否是波特率按键,若是则
调整波特率。
简要说明:
主机P2口接4*4矩阵式键盘,高4位行,低4位列。
其中0~4号按键分别代表4种不同波特率(1200、2400、4800、9600)。
初始波特率9600。
编写:
邢志杰(QQ824997141)
时间:
2015年07月02日
最后修改:
2015年07月03日
***********************************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
intlog=0,bot=0;//log,bot分别是按键标志位和波特率调整标志位
uchartemp,num;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
.
.
for(y=110;y>0;y--);
}
/*****按键扫描子函数*****/
voidkeyscan()
{
P2=0xf0;
temp=P2;
temp&=0xf0;
if(temp!
=0xf0)
{
delay(5);//延时消抖
P2=0xf0;//二次读回
temp=P2;
temp&=0xf0;
if(temp!
=0xf0)
{
log=1;//有按键
P2=0xfe;
temp=P2;
if(temp!
=0xfe)
switch(temp)
{
case0xee:
num=0;bot=1;break;//bot=1表示是波特率按键
case0xde:
num=4;break;
case0xbe:
num=8;break;
case0x7e:
num=12;break;
}
P2=0xfd;
temp=P2;
if(temp!
=0xfd)
switch(temp)
{
case0xed:
num=1;bot=1;break;//bot=1表示是波特率按键
case0xdd:
num=5;break;
case0xbd:
num=9;break;
case0x7d:
num=13;break;
}
P2=0xfb;
.
.
temp=P2;
if(temp!
=0xfb)
switch(temp)
{
case0xeb:
num=2;bot=1;break;//bot=1表示是波特率按键
case0xdb:
num=6;break;
case0xbb:
num=10;break;
case0x7b:
num=14;break;
}
P2=0xf7;
temp=P2;
if(temp!
=0xf7)
switch(temp)
{
case0xe7:
num=3;bot=1;break;//bot=1表示是波特率按键
case0xd7:
num=7;break;
case0xb7:
num=11;break;
case0x77:
num=15;break;
}
//等待按