单片机双击串行通信C语言设计报告含代码.docx
- 文档编号:29123807
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:20
- 大小:383.60KB
单片机双击串行通信C语言设计报告含代码.docx
《单片机双击串行通信C语言设计报告含代码.docx》由会员分享,可在线阅读,更多相关《单片机双击串行通信C语言设计报告含代码.docx(20页珍藏版)》请在冰豆网上搜索。
单片机双击串行通信C语言设计报告含代码
探※※※※※※※※
2012级
单片机接口课程设计
探※※※※※※※※
石家庄铁道大学四方学院
集中实践报告书
课题名称双机串行通信设计
姓名邢志杰
学号
系、部电气工程系
专业班级方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章软件程序设计4
4.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系统框图
图3-1系统框图
3.2STC89C5单片机最小系统
89C52共有四个八位的并行双向口,即有32根输入输出口线。
各口的每位均由锁存器、输出驱动器和输入缓冲器组成。
VCC(40引脚):
电源电压
VSS(20引脚):
接地
LS
STALL
PCO.ADOmiAm
39
18
PTTAL3
PQ2AZ>Z
37
JJLD5
3B
32
PS5ADS
J*_
EtZT
u--I'-
H—
STC^9C52
M_L.ADO
21
q
2s
AJJ1O
j*
P23AI>11
24
-LLE
肥4917
25
F25AD13
丄芒
列!
U
FZ-ADI?
L
PLQT2
P3Q&W
77
PlI
PJl.TXDP32.-TKTD
4
FlJ.INTI
-4-
□14
4TH
id
PLJ5
MJ5.T1
13
OL.S
ltf
a
L7
PJKRD
17
图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按键电路
3.4
图3-3按键电路图
本设计按键采用矩阵键盘,键盘连接主机的P2口,主机从矩阵键盘接收信
息,通过串行输出口输出到从机,从机从串行输入口接收信息并把信息显示在数码管上。
3.5
主电路设计
74HC573
图3-4主电路图
第4章软件程序设计
设计思路为:
主机通过键盘扫描程序确认是否有键按下,若有键按下则将按键号对应的显示代码发送给从机,并判断是否是波特率按键,若是则进行波特率调整,若无键按下,则继续进行键盘扫描。
从机主程序动态显示缓冲区内的数据。
中断子程序接收数据并判断是否是波特率按键所对应的显示代码,若是则进行波
特率调整,然后将数据保存到缓冲区。
初始波特率都为9600。
5.1主程序流程图
键盘连接到甲机的P2口,通过按键扫描确定键值,从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,实现两机之间的串行通信。
5.2键盘扫描子程序流程图
矩阵式键盘扫描的方法常用的有两种,一种是逐列送0,依次读回行;另一
种为反转法。
本程序采用前者,程序流程图如下:
5.3从机主程序流程图
从机主程序动态显示缓冲区的4个数据。
从机的P1口经锁存器74HC573连接数码管位码,P2口经锁存器74HC573连接数码管的段码。
从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,利用中断来接收主机发来的数据,并根据接收的数据来判断是否需要进行波特率调整。
从机主程序流程图如下:
图4-3从机主程序流程图
4.4从机中断子程序流程图
图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;
等待按键松开
P2=0xf0;temp=P2;
temp&=0xf0;
while(temp!
=0xf0){temp=P2;temp&=0xf0;
}
}
/*****
主函数*****/
voidmain()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//装初值设置波特率
TL1=0xfd;
TR1=1;//打开定时器1
SCON=0x40;//8位异步
while
(1)
{
keyscan();
if(log==1)//有键按下发送键号
{
SBUF=num;//发送按键号
while(!
TI);
TI=0;//清发送标志位
log=0;//清按键标志位if(bot==1)//是波特率按键进行波特率调整{
switch(num)
{
case0:
TH1=TL1=0xe8;break;
case1:
TH1=TL1=0xf4;break;
case2:
TH1=TL1=0xfa;break;
case3:
TH1=TL1=0xfd;break;
}
}
bot=0;//清波特率标志位
}
}
}
双机串行通信从机程序源代码:
程序名称:
双机串行通信波特率可调从机C语言程序
从机功能:
主函数显示缓冲区数据。
中断子函数接收主机发送的显示代码,同时判断是否是波特率按键代码,若是则进行调整。
简要说明:
P1口接4个数码管位选端,P2口接段选端,数码管采用共阴极接法。
编写:
邢志杰
时间:
2015年07月02日
最后修改:
2015年07月03日
*****************************************************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
inti=1;
ucharval[]={3,16,16,16},va;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};//0~F共阴极数码管显示段码,0为全部熄灭段码
voiddelay(uintx)//延时
{
uchart;
while(x--)
for(t=0;t<110;t++);
}
voidser()interrupt4//无返回值,函数名ser,关键字,中断号4
{
RI=0;
va=SBUF;
val[i]=va;
switch(va)//判断是否需进行波特率调整
{
case0:
TH1=TL1=0xe8;
val[0]=va;
val[1]=val[2]=val[3]=16;
i=3;
break;
case1:
TH1=TL1=0xf4;
val[0]=va;
val[1]=val[2]=val[3]=16;
i=3;
break;
case2:
TH1=TL1=0xfa;
val[0]=va;
val[1]=val[2]=val[3]=16;
i=3;
break;
case3:
TH1=TL1=0xfd;
val[0]=va;
val[1]=val[2]=val[3]=16;
i=3;
break;
default:
break;
}
i++;
if(i==4)
i=1;
}
voidmain()
{
TMOD=0x23;//设置定时器1为工作方式2
TH1=0xfd;//装初值设置波特率
TL1=0xfd;
TR1=1;//打开定时器1
SCON=0x50;//8位异步收发,串行允许接收
IE=0x90;//允许串口中断
while
(1)
{
P1=0xfe;
P2=table[val[0]];
delay
(1);
P1=0xfd;
P2=table[val[1]];
delay
(1);
P1=0xfb;
P2=table[val[2]];
delay
(1);
P1=0xf7;
P2=table[val[3]];
delay
(1);
}
}
第5章结论
串口通信是学习单片机的重点也是难点。
要想实现正常通信就必须保证两个单片机具有一致的波特率。
单片机具有强大中断功能,使得从机在显示数据的同时还能接收主机发来的信息,这给程序设计带来了极大的方便。
尽管与C语言等高级语言相比汇编语言的可读性不高,也缺乏灵活性,但是在某些情况下汇编语言却是其他语言无法替代的,因此本程序依然采用汇编语言来编写。
在本次的课程设计过程中,我们通过查阅资料,接口设计,程序设计,安装调试等环节完成了仿真电路的设计,然后才进行硬件电路的焊接,实现了一个基于MCS—51系列单片机,涉及多种资源应用,并具有综合功能的小应用系的统设计。
由于提前进行了软件的仿真,所以得到的实物结果也比较理想。
本次设计提高了我们在单片机方面的实践技能和综合运用理论知识解决问题的能力。
参考文献
[1]高峰.单片微型计算机原理与接口技术.科学出版社,2007.
[2]胡汉才.单片机原理及其接口技术.清华大学出版社,2004.
[3]李勋.单片机微型计算机大学读本.北京航空航天大学出版社,2002.
[4]王幸之.单片机应用系统抗干扰技术.北京航空航天大学出版社,2001.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 双击 串行 通信 语言 设计 报告 代码