课程设计说明书
课程设计名称: 单片机课程设计
课程设计题目: 单片机与单片机之间的串行通讯
学 院 名 称: 信息工程学院
专业: 电子信息科学与技术 班级: 090431班
学号: xxx 姓名: xxx
评分: 教师: xxx
2012年6月25日
电子信息工程专业 课程设计任务书
20 10 -20 11学年 第 2 学期 第 17 周- 20 周
注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档
摘要
串行通讯是单片机的一个重要应用。本设计就是利用两块单片机来完成一个系统,实现单片机之间的串行通讯。
随着计算机的不断普及,在我们的周围可能会同时出现多台微型计算机,而且这些计算机的牌号,后型号不同,而且有的格式不兼容。于是利用单片机串行口实现不同计算机之间的相互通信,以达到信息或程序的共享是非常有用的。从智能家用电器到工业上的控制系统都采用了上位机与下位机基于串行通信的主从工作方式,这样就充分利用了微机分析处理能力强、速度快的特点及下位机(单片机)面向控制、使用灵活方便的优势。由于AT09C52系列单片机具有性能稳定、工作可靠、价格低廉等可特点,因此其应用相当广泛。AT09C52单片机中有异步通信串行接口,能方便的构成双机,多机通讯接口。随着测量向自动化,智能化,网络化方向的发展。利用多机通讯构成的分布式系统逐渐普及。本实验就点对点的双机通信进行训练。学习串口的工作方式,初始化编程,和单片机与单片机点对点通信的编程方法以及硬件电路的设计方法。
在此基础上可以进一步提高,实现多机通信以及单片机与PC机的通讯,手机通过蓝牙与单片机通讯,电脑通过蓝牙与单片机通讯等一系列功能扩展。
【关键字】 双机串行通讯 AT89C52 异步通讯 功能扩展
目录
前言.............................................................................................. 1
第一章、系统功能............................... 2
1.1 设计要求和系统的组成及工作原理.................................. 2
第二章、系统设计方案............................ 3
2.1硬件设计............................................................................... 3
2.1.1 AT89C52和RS232说明.................................................... 3
2..12 双机通讯的方案选择....................................................... 7
2.1软件设计............................................................................... 8
2.2.1 甲机程序的编写说明....................................................... 8
2.2.2 甲机程序的编写说明..................................................... 12
第三章、调试与操作............................ 19
3.1 开发板调试......................................................................... 19
3.2 测试结果与分析.................................................................. 20
第四章、结论.................................. 21
附录一、参考文献.............................. 22
附录二、元器件清单............................ 23
附录三、 电路总图............................. 24
附录四、 实物图............................... 25
前言
电子科学技术是人类在生产斗争和科学实验中发展起来的。随着科学技术的发展和人类的进步,电子技术已经成了各种工程技术的核心,特别是进入信息时代以来,电子技术更是成了基本技术,其具体应用领域涵盖了通信领域、控制系统、测试系统、计算机等等各行各业。
单片机之间的数据通讯在当今社会应用相当广泛,单片机之间的数据通讯。由于52系列单片机具有性能稳定、工作可靠、价格低廉等特点,因此其应用相当广泛。一个52系列的单片机(如At89c52)内部包含有RAM、FLASH ROM、三个16位的定时器/计数器、一个通用异步串行通信控制器(UART)等多种资源。但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充I/O接口、定时器/计数器、串行通信接口、RAM、ROM等。采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。52系列的单片机(以下简称单片机)都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。所幸的是,单片机的并行端口也能相互连接来进行数据通信。根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。
本文就是关于用单片机与单片机之间的串行通讯的过程及基本原理。
第一章 系统功能
1.1设计要求和系统的组成及工作原理
一.设计要求
1.用RS232串行芯片实现双向通讯。
2.传送的数据在显示器上(数码管和发光二极管)显示。
二.系统组成
图1 总体框图
三.工作原理
双机通信系统通过甲乙单片机的串行口来实现数据的收发。
甲单片机通过开关电路来启动发送程序,甲机当开关按下时向乙机发送一个数据,乙机上蜂咛器发出声音提示有数据发送过来,乙机通过接收中断来接收和开关判断是否接收甲机发送过来的数据,并通过编写好的数据代码在8个发光二极管上显示主机发送过来的数据。
乙单片机通过开关电路来启动发送程序,乙机给甲机发送一数据,甲机上蜂咛器发出声音提示有数据发送过来,甲机通过接收中断来接收和开关判断是否接收乙机发送过来的数据,并通过编写好的数据代码在8个发光二极管上显示乙机发送过来的数据。
第二章 系统设计方案
2.1 硬件设计
2.1.1 AT89C52和RS23说明
一. At89c52单片机内部有1个功能很强大的全双工串行口,可以同时发送和接收数据。串行口的内部有数据接收缓冲器和数据发送缓冲器,数据接收缓冲器只能读出不能写入,数据发送缓冲器只能写入不能读出,这两个数据缓冲器都是用SBUF来表示,地址都是99H,CPU对特殊功能寄存器SBUF执行写操作就将数据写入发送缓冲器,对SBUF执行度操作就是读出接收缓冲器中的内容。特殊功能寄存器SCON参访串行口的控制状态信号,串行口用T1或者T2作为波特率发生器(发送和接收时钟),特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍率控制位。
SCON:串行口控制寄存器
寄存器地址98H,位寻址9FH~98H。
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所示:
图2 DB9
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:各引脚功能如下:
图3 DB9管脚说明
用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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7; //四个独立键盘
sbit dula=P2^6; //段选
sbit wela=P2^7; //位选
sbit beep=P2^3; //蜂鸣器
uchar wendu,temp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点显示0到9
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; // 带小数点显示0到9
/******************************
延时程序 x (ms)
******************************/
void delay(uint x)
{
char i;
while(x--)
for(i=0;i<120;i++);
}
/******************************
数码管显示温度值
******************************/
void display(uint temp)
{
uchar A1,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; //0111 1111 选中第一个数码管
wela=0;
delay(5);
dula=1;
P0=table1[A2]; //显示十位
dula=0;
wela=1;
P0=0x7e; //0111 1111 选中第一个数码管
wela=0;
delay(5);
dula=1;
P0=table[A3]; //显示个位
dula=0;
wela=1;
P0=0x7b; //0111 1111 选中第一个数码管
wela=0;
delay(5);
}
/******************************
甲机向乙机发送程序
******************************/
void com(uchar com)
{
SBUF=com;
while(!TI); //是否发送完
TI=0;
}
void main()
{
uchar b;
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);
}
}
/******************************
甲机从乙机接收程序
******************************/
void ert()interrupt 4
{
RI=0;
wendu=SBUF;
}
乙机程序设计框图(图8):
图8 乙机设计框图
/******************************
程序名称: 双机通信乙机程序
实验地点: 信工学院E404
******************************/
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //ds18b20片选信号
uint temp; // 记录ds18b20的温度值
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7; //四个独立键盘
sbit beep=P2^3;
uchar k;
/******************************
延时程序 x (ms)
******************************/
void delay(uint x)
{
char i;
while(x--)
for(i=0;i<120;i++);
}
/******************************
send reset and initialization command
******************************/
void dsreset(void)
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
/******************************
read a bit
******************************/
bit tmpreadbit(void)
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
/******************************
read a byte date
******************************/
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
/******************************
write a byte to ds18b20
******************************/
void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/******************************
DS18B20 begin change
******************************/
void tmpchange(void)
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
/******************************
get the temperature
******************************/
uint tmp()
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return (temp-200);
}
/******************************
乙机向甲机发送程序
******************************/
void com(uchar com)
{
SBUF=com;
while(!TI);
TI=0;
}
void main()
{
uchar temp,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) //接收甲机流水灯指令并用蜂鸣器提示
{
while(1)
{
beep=0;
if(k1==0) //决定接收流水灯指令并关闭蜂鸣器
{
beep=1;
break;
}
}
while(1) //显示流水灯现象
{
temp=0x7f;
P1=temp;
for(i=1;i<8;i++)
{
a=temp>>i;
P1=a;
delay(50);
}
if(k==4) //关闭所有显示
{
P1=0x0ff;
beep=0;
delay(50);
beep=1;
break;
}
}
}
if(k==3) //接收甲机摇摆灯指令并用蜂鸣器提示
{
while(1)
{
beep=0;
if(k1==0) //决定接收摇摆灯指令并关闭蜂鸣器
{
beep=1;
break;
}
}
while(1) //显示摇摆灯现象
{
delay(50);
P1=0x55;
delay(50);
P1=0x0aa;
if(k==4) //关闭所有显示
{
P1=0x0ff;
beep=0;
delay(50);
beep=1;
break;
}
}
}
}
}
/******************************
乙机从甲机接收程序
******************************/
void ert()interrupt 4
{
RI=0;
k=SBUF;
}
最后用Proteus画好原理图,把编译好的甲乙机程序HEX文件,下载到原理图里,点击运行仿真,查看效果!
第三章 调试与操作
3.1开发板调试
通过Proteus仿真(附录三)得出甲乙程序在理论上已经通过,接下来通过下载软件STC-ISP把甲乙机程序分别下载到两块单片机里,上电调试。
首先进行甲机向乙机发送数据,按下流水灯按钮,这时乙机蜂咛器发出声音提示有数据传送过来,按下乙机接收按钮,这是可以看到乙机上的八个发光二极管显示流水灯的现象(图9所示)。
图9 流水灯现象
按下甲机上的关闭所有显示按钮,再发送要摇摆灯按钮这时乙机蜂咛器发出声音提示有数据传送过来,按下乙机接收按钮,这是可以看到乙机上的八个发光二极管显示摇摆灯的现象(图10所示)。
图10 摇摆灯现象
甲机向乙机发送的数据可以在乙机上显示出来的,然后进行乙机向甲机发送乙机通过DS18B20采集到的温度值传输到甲机上显示。按下乙机发送温度值按钮,这时甲机蜂咛器发出声音提示有数据传送过来,按下甲机接收按钮,这是可以看到甲机上的数码管上显示温度值的现象(图11所示)。
图11 温度显示
这时如果用手触摸乙机上数字温度传感器DS18B20,可以发现甲机上的显示数字不断上升,当温度上升超过程序设置的31度时,甲机上的蜂咛器发出报警信号!并且温度不断闪烁。
3.2测试结果与分析
通过甲乙相互通信在开发板上的现象和测量的结果,可以知道甲乙机程序开发板上是可行的。甲机传送的数据通过乙机八个发光二极管显示,结果可以看到流水灯和摇摆灯现象;乙机传送的数据通过甲机数码管来显示,结果可以知道乙机当时采集到的温度是29.9度。
第四章 总结
一 .设计中注意事项
1.串行通信,使用的晶振是11.05926MHZ,波特率是9600 两块板子要严格一致。
2.程序下载时通过P3.1(TXD)下载进去的,因此下载时此端口不用被占用。
3.双机通信的基本原理是对RXD和TXD操作,RS23最大通信距离为15m。
4.如果之间用三根线 TXD RXD GND连接两个单片机,这时候的传输距离在1m 内,距离越大干扰越大,因为导线存在电阻。
5.由于SBUF是8位的,最大是256,如果乙机直接传输必然,甲机显示的温度就不是正常的温度!这时在乙的程序中温度值减去200,甲的程序加回200就是!
二.设计体会和收获
最初选择双机串行通信这个实验时,由于从未接触过这类设计,感到新鲜的同时不乏挑战性。现在终于将它完成了,感到受益颇多。第一,这是一份考验我们自觉性、动手能力与协作意识的任务。在长达二个礼拜的时间里,我们不断发现自身不足也不断自我完善。第二,未知并不可怕,可怕的是因未知而止步。我们在课堂上所学的知识是非常有限的,这次的课程设计就是个很好的体现。很多函数的运用我们还没掌握,一些简单的循环语句都可能出错。实践后才能真的知道我们真正掌握了多少。第三,团结就是力量一点都不假,三个臭皮匠顶一个诸葛亮。在团组合作时我们更便于互相取长补短,相互讨论,效果很好。
附录一参考文献
1《C语言程序设计》清华大学出版社;谭浩强主编 1999.12
2《C语言程序设计技巧及应用》 上海科学普及出版社;陈进编著 1992.6
3《微型计算机原理与应用》(第二版)西安电子科技大学出版社;王永山,杨宏五, 杨婵娟编著 1999.12
4《单片机原理及应用教程》北京大学出版社;范立南,谢子殿编著 2007.8
5.《51单片机C语言应用程序设计实例精讲》(第二版)电子工业出版社;戴佳 戴卫恒编著 2008.12
6.《单片机语言C51典型应用设计》 人民邮电出版社;刘文涛编著 2005.10
7.《μVision2单片机应用程序开发指南》科学出版社;尹勇 李宇编著 2005.2
附录二 元器件清单
附录三 电路总图
Proteus画原理图如下:
附录四 实物图