单片机双机通信课程设计报告.docx
《单片机双机通信课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机双机通信课程设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
单片机双机通信课程设计报告
课程设计说明书
课程设计名称:
单片机课程设计
课程设计题目:
单片机与单片机之间的串行通讯
学院名称:
信息工程学院
专业:
电子信息科学与技术班级:
090431班
学号:
xxx姓名:
xxx
评分:
教师:
xxx
2012年6月25日
电子信息工程专业课程设计任务书
2010-2011学年第2学期 第17周-20周
题目
单片机与单片机之间的串行通讯
内容及要求
1.用RS232串行芯片实现双向通讯。
2.传送的数据在显示器上(数码管和发光二极管)显示。
进度安排
1.第17周收集单片机双机通讯的资料,思考双机通讯传送形式,如何显示,了解RS232的作用。
2.第18周用proteus设计原理图,用Keil编写程序,实现仿真后,调试好程序。
3.第十九周把编译成功的程序下载到开发板上,进行实际操作。
4.第二十周完成课程报告总结和归纳双机通讯的知识要点。
学生姓名:
xxxxxxx
指导时间
指导地点:
E楼404室
任务下达
2012年06月日
任务完成
20年月日
考核方式
1.评阅□ 2.答辩□3.实际操作
4.其它□
指导教师
xxx
系(部)主任
注:
1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档
摘要
串行通讯是单片机的一个重要应用。
本设计就是利用两块单片机来完成一个系统,实现单片机之间的串行通讯。
随着计算机的不断普及,在我们的周围可能会同时出现多台微型计算机,而且这些计算机的牌号,后型号不同,而且有的格式不兼容。
于是利用单片机串行口实现不同计算机之间的相互通信,以达到信息或程序的共享是非常有用的。
从智能家用电器到工业上的控制系统都采用了上位机与下位机基于串行通信的主从工作方式,这样就充分利用了微机分析处理能力强、速度快的特点及下位机(单片机)面向控制、使用灵活方便的优势。
由于AT09C52系列单片机具有性能稳定、工作可靠、价格低廉等可特点,因此其应用相当广泛。
AT09C52单片机中有异步通信串行接口,能方便的构成双机,多机通讯接口。
随着测量向自动化,智能化,网络化方向的发展。
利用多机通讯构成的分布式系统逐渐普及。
本实验就点对点的双机通信进行训练。
学习串口的工作方式,初始化编程,和单片机与单片机点对点通信的编程方法以及硬件电路的设计方法。
在此基础上可以进一步提高,实现多机通信以及单片机与PC机的通讯,手机通过蓝牙与单片机通讯,电脑通过蓝牙与单片机通讯等一系列功能扩展。
【关键字】双机串行通讯AT89C52异步通讯功能扩展
前言
电子科学技术是人类在生产斗争和科学实验中发展起来的。
随着科学技术的发展和人类的进步,电子技术已经成了各种工程技术的核心,特别是进入信息时代以来,电子技术更是成了基本技术,其具体应用领域涵盖了通信领域、控制系统、测试系统、计算机等等各行各业。
单片机之间的数据通讯在当今社会应用相当广泛,单片机之间的数据通讯。
由于52系列单片机具有性能稳定、工作可靠、价格低廉等特点,因此其应用相当广泛。
一个52系列的单片机(如At89c52)内部包含有RAM、FLASHROM、三个16位的定时器/计数器、一个通用异步串行通信控制器(UART)等多种资源。
但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充I/O接口、定时器/计数器、串行通信接口、RAM、ROM等。
采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。
在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。
52系列的单片机(以下简称单片机)都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。
但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。
所幸的是,单片机的并行端口也能相互连接来进行数据通信。
根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。
本文就是关于用单片机与单片机之间的串行通讯的过程及基本原理。
第一章系统功能
1.1设计要求和系统的组成及工作原理
一.设计要求
1.用RS232串行芯片实现双向通讯。
2.传送的数据在显示器上(数码管和发光二极管)显示。
二.系统组成
图1总体框图
三.工作原理
双机通信系统通过甲乙单片机的串行口来实现数据的收发。
甲单片机通过开关电路来启动发送程序,甲机当开关按下时向乙机发送一个数据,乙机上蜂咛器发出声音提示有数据发送过来,乙机通过接收中断来接收和开关判断是否接收甲机发送过来的数据,并通过编写好的数据代码在8个发光二极管上显示主机发送过来的数据。
乙单片机通过开关电路来启动发送程序,乙机给甲机发送一数据,甲机上蜂咛器发出声音提示有数据发送过来,甲机通过接收中断来接收和开关判断是否接收乙机发送过来的数据,并通过编写好的数据代码在8个发光二极管上显示乙机发送过来的数据。
2.1硬件设计
2.1.1AT89C52和RS23说明
一.At89c52单片机内部有1个功能很强大的全双工串行口,可以同时发送和接收数据。
串行口的内部有数据接收缓冲器和数据发送缓冲器,数据接收缓冲器只能读出不能写入,数据发送缓冲器只能写入不能读出,这两个数据缓冲器都是用SBUF来表示,地址都是99H,CPU对特殊功能寄存器SBUF执行写操作就将数据写入发送缓冲器,对SBUF执行度操作就是读出接收缓冲器中的内容。
特殊功能寄存器SCON参访串行口的控制状态信号,串行口用T1或者T2作为波特率发生器(发送和接收时钟),特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍率控制位。
SCON:
串行口控制寄存器
寄存器地址98H,位寻址9FH~98H。
位地址
9F
9E
9D
9C
9B
9A
99
98
位符号
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:
串行口工作方式选择位
SM2:
多机通信控制位
REN:
允许/禁止串行口接收的控制位
TB8:
在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清
零,也可以作为奇偶校验位,在方式1中是停止位。
RB8:
在方式2和方式3中,是被接收的第9位数据(来自第TB8位);在方式
中,RB8收到的是停止位,在方式0中不用。
TI——串行口发送中断请求标志位:
当发送完一帧串行数据后,由硬件置1;在转
向中断服务程序后,用软件清0。
RI——串行口接收中断请求标志位:
当接收完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。
SM0、SM1:
串行口工作方式选择位,其组合含义如下所示:
PCON的D7位作为串行波特率系数SMOD控制位,PCON不可位寻址,其地址为87H,当SMOD=1时,波特率加倍。
SMOD在PCON中的位置如下所示:
二.RS232近程通讯总线适合于数据传输速率在0~20000b/s范围内的通信,由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。
如图2所示:
图2DB9
1.电气特性
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。
在TxD和RxD上:
逻辑1(MARK)=-3V~-15V
逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
RS232C与TTL转换:
EIA-RS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。
因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。
最大直接传输距离说明:
RS-232C标准规定,若不使用MODEM,在码元畸变小于4%的情况下,DTE和DCE之间最大传输距离为15m(50英尺。
2.DB-9连接器
使用DB-9连接器,作为提供多功能I/O卡或主板上COM1和COM2两个串行接口的连接器。
它只提供异步通信的9个信号。
DB-25型连接器的引脚分配与DB-25型引脚信号完全不同。
因此,若与配接DB-25型连接器的DCE设备连接,必须使用专门的电缆线。
最大直接传输距离说明:
RS-232C标准规定,若不使用MODEM,在码元畸变小于4%的情况下,DTE和DCE之间最大传输距离为15m(50英尺)。
用RS-232总线连接系统有近程通讯方式和远程通讯方式两种,近程通讯是指传输距离小于15米的通讯,可以用RS-232电缆直接连接。
15米以上的长距离通讯,需要采用调制调解器。
当计算机与终端之间利用RS-232作近程连接时,有几根线实现交换连接。
本次实验不需要检测数据等信号状态的
RS-232是异步通讯中最广泛的标准总线,适用于数据中端设备(DTE)和数据通讯设备(DCE)之间的接口。
在微机通讯中,通常使用的RS-232接口信号是九根引脚。
如图3:
各引脚功能如下:
引脚号
符号
方向
功能
1
DCD
输入
载波检测
2
RXD
输入
接收数据
3
TXD
输出
发送数据
4
DTR
输出
数据终端就绪
5
GND
信号地
6
DSR
输入
数据装置就绪
7
RTS
输出
请求发送
8
CTS
输入
清除发送
9
RI
输入
振铃指示
图3DB9管脚说明
用RS-232总线连接系统有近程通讯方式和远程通讯方式两种,近程通讯是指传输距离小于15米的通讯,可以用RS-232电缆直接连接。
15米以上的长距离通讯,需要采用调制调解器。
计算机和终端用RS-232连接的交叉图4如下,图中“发送数据”与“接收数据”是交叉相连的,是得两台设备都能正常的发送和接收。
图4通讯连接
数据发送与接收线:
发送数据(TxD)——通过TxD终端将串行数据发送到MODEM。
接收数据(RxD)——通过RxD线终端接收从MODEM发来的串行数据。
2.1.2双机通讯的方案选择
设计方案:
该系统采用主从共两片AT89C52单片机来实现上位机对下位机的控制,由于是近距离的双机通信,我们采用单片机直接交叉连接的方式,上位机发送的数据由串行口TXD端输出,直接由下位机的串行口数据接收端RXD接收。
需要注意的是一定要保证主从机相同的数据传输速率,即要求设置相同的波特率。
电路分为数码管显示模块,指示模块、以及单片机工作的基本复位、晶振模块。
甲机由3个数码管,4个独立键盘开关,1个蜂咛器组成。
乙机由8个发光二极管,一个蜂咛器,1个数字温度传感器DS18B20组成。
单片机上最基本的两个电路:
复位电路(图5)和晶振电路(图6)
图5复位电路
图6晶振电路
2.2软件设计
本系统的软件设计流程图。
系统设计代码分为以下几个部分:
初始化串行、发送数据、接收数据、键盘输入、数值转换、LED显示,数码管显示,用keil编译。
甲机程序设计框图(图7):
开始
图7甲程序设计框图
/******************************
程序名称:
双机通信甲机程序
实验地点:
信工学院E404
******************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P3^4;
sbitk2=P3^5;
sbitk3=P3^6;
sbitk4=P3^7;//四个独立键盘
sbitdula=P2^6;//段选
sbitwela=P2^7;//位选
sbitbeep=P2^3;//蜂鸣器
ucharwendu,temp;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点显示0到9
unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};//带小数点显示0到9
/******************************
延时程序x(ms)
******************************/
voiddelay(uintx)
{
chari;
while(x--)
for(i=0;i<120;i++);
}
/******************************
数码管显示温度值
******************************/
voiddisplay(uinttemp)
{
ucharA1,A2,A3;
if(wendu>=110)//温度大于31度蜂鸣器发声
{
beep=0;
delay(50);
beep=1;
}
temp=temp+200;
A1=temp/100;
A2=temp%100/10;
A3=temp%100%10;
dula=1;
P0=table[A1];//显示百位
dula=0;
wela=1;
P0=0x7f;//01111111选中第一个数码管
wela=0;
delay(5);
dula=1;
P0=table1[A2];//显示十位
dula=0;
wela=1;
P0=0x7e;//01111111选中第一个数码管
wela=0;
delay(5);
dula=1;
P0=table[A3];//显示个位
dula=0;
wela=1;
P0=0x7b;//01111111选中第一个数码管
wela=0;
delay(5);
}
/******************************
甲机向乙机发送程序
******************************/
voidcom(ucharcom)
{
SBUF=com;
while(!
TI);//是否发送完
TI=0;
}
voidmain()
{
ucharb;
SCON=0x50;//SM0=1,SM1=1,SEN=1
TMOD=0X20;//定时器工作于方式一
TH1=0XFD;
TL1=0XFD;//波特率9600
TR1=1;//启动定时器
IE=0X90;//开中断
beep=1;//蜂鸣器初始状态不响
while
(1)
{
if(k1==0)//接收乙机温度值显示
{
while(k4==1)
{
display(wendu);
delay(10);
}
}
if(k2==0)//发送流水灯指令
{
b=2;
com(b);
}
if(k3==0)//发送摇摆灯指令
{
b=3;
com(b);
}
if(k4==0)//关闭甲乙机所有显示
{
P0=0XFF;
delay
(1);
wela=1;
delay
(1);
wela=0;
b=4;
com(b);
}
delay(5);
}
}
/******************************
甲机从乙机接收程序
******************************/
voidert()interrupt4
{
RI=0;
wendu=SBUF;
}
乙机程序设计框图(图8):
图8乙机设计框图
/******************************
程序名称:
双机通信乙机程序
实验地点:
信工学院E404
******************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P2^2;//ds18b20片选信号
uinttemp;//记录ds18b20的温度值
sbitk1=P3^4;
sbitk2=P3^5;
sbitk3=P3^6;
sbitk4=P3^7;//四个独立键盘
sbitbeep=P2^3;
uchark;
/******************************
延时程序x(ms)
******************************/
voiddelay(uintx)
{
chari;
while(x--)
for(i=0;i<120;i++);
}
/******************************
sendresetandinitializationcommand
******************************/
voiddsreset(void)
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
/******************************
readabit
******************************/
bittmpreadbit(void)
{
uinti;
bitdat;
DS=0;i++;//i++fordelay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
/******************************
readabytedate
******************************/
uchartmpread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
/******************************
writeabytetods18b20
******************************/
voidtmpwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//write0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/******************************
DS18B20beginchange
******************************/
voidtmpchange(void)
{
dsreset();
delay
(1);
tmpwritebyte(0xcc);//addressalldriversonbus
tmpwritebyte(0x44);//initiatesasingletemperatureconversion
}
/******************************
getthetemperature
******************************/
uinttmp()
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;//twobytecomposeaintvariable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return(temp-200);
}
/******************************
乙机向甲机发送程序
******************************/
voidcom(ucharcom)
{
SBUF=com;
while(!
TI);
TI=0;
}
voidmain()
{
uchartemp,a,i;
SCON=0x50;//SM0=1,SM1=1,SEN=1
TMOD=0X20;//定时器工作于方式一
TH1=0XFD;//波特率9600
TL1=0XFD;
TR1=1;//启动定时器
IE=0X90;//开中断
beep=1;//蜂鸣器初始状态不响
while
(1)
{
if(k1==0)//采集当前温度值并向甲机发送
{
while(k2==1&&k3==1&&k4==1)
{
tmpchange();
delay(5);
for(a=10;a>0;a--)
{
com(tmp());
delay
(1);
}
}
}
if(k==2)//接收甲机流水灯指令并用蜂鸣器