设计单片机串行通信课程设计报告Word格式.docx
《设计单片机串行通信课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《设计单片机串行通信课程设计报告Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
让我们增加了对单片机的感性认识,加深对单片机理论方面的理解,同时也加深单片机的内部功能模块的应用。
使我们了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。
提高我们在单片机应用方面的实践技能和科学作风;
培育我们综合运用理论知识解决问题的能力。
(2)课程设计要求
通过对课题的分析,进行系统功能设计,选择器件,划分软硬件的功能,用Proteus软件在PC机上完成硬件原理图设计。
用汇编语言,完成软件设计。
然后使用Proteus仿真软件在PC机上进行系统仿真,调试电路和修改调试程序,直至达到设计的要求和取得满意的效果。
(3)课程设计的内容
1).A机控制B机的两个LED闪烁,B机控制A机的数码管加一显示。
2).使用DS18B20温度传感器,由B机测量温度后由A机显示.
2、主要步骤及方案
(1)主要步骤
1)对题目进行分析
2)确定电路图需要的元件
3)画出电路图
4)写出运行程序
5)加载并调试修改程序
(2)主要方案
利用AT51芯片、复位电路、时钟电路、LED数码管等,使
A机控制B机的两个LED闪烁,B机控制A机的数码管加一显示。
使用DS18B20温度传感器,由B机测量温度后由A机显示.把P1口的高7位与数码管
相连,绿灯表示通行方向。
P2口与LED显示器相连,用来输出显示的数字。
系统的原理框图如下:
【摘要】串行通信是单片机的一个重要应用。
本次课程设计就是要利用单片机来完成一个系统,实现双片单片机串行通信。
通信的结果实用数码管进行显示。
两个单片机之间采用RS232进行双机通信。
在通信过程中,使用通信协议进行通信。
【关键字】52单片机,串行通信,接口,DS18B20
一、总体设计
1.设计要求:
(1单片机之间进行串行通信,发送端将0~f循环发送到接收端,并在接收端显示。
(2)使用DS18B20温度传感器,由B机测量温度后由A机显示.
2.设计方案:
本次设计,对于两片AT51,采用RS232进行双机通信。
发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。
接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。
接受方接收后,在数码管上显示接收的信息及利用LED显示通信结果,与此同时由DS18B20测量温度后由另一单片机显示。
为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。
软件部分,通过通信协议进行发送接收,主机先送信号给从机,从机接收信号后发出应答信号并显示相应内容.
二、硬件设计
1.51单片机的串行通信
图1.AT89C51
计算机与外界的信息交换称为通信,常用的通信方式有两种:
并行通信和串行通信。
51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。
串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。
51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。
51片机串行接口的结构如下:
(1)数据缓冲器(SBUF)
接受或发送的数据都要先送到SBUF缓存。
有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;
接收时用指令将SBUF中接收到的数据取出。
(2)串行控制寄存器(PCON)
SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0,SM1:
串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。
串行接口工作方式特点见下表
工作方式
功能
波特率
0
8位同步移位寄存器(用于I/O扩展)
fORC/12
1
10位异步串行通信(UART)
可变(T1溢出率*2SMOD/32)
2
11位异步串行通信(UART)
fORC/64或fORC/32
3
SM2:
多机通信控制位。
REN:
接收允许控制位。
软件置1允许接收;
软件置0禁止接收。
TB8:
方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。
RB9:
在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI:
发送中断标志。
发送完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续发送。
RI:
接收中断标志。
接收完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续接收。
(3)输入移位寄存器
接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。
(4)波特率发生器
波特率发生器用来控制串行通信的数据传输速率的,52系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。
波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
(5)电源控制寄存器PCON
其最高位为SMOD。
(6)波特率计算
当定时器T1工作在定时方式的时候,定时器T1溢出率=(T1计数率)/(产生溢出所需机器周期)。
由于是定时方式,T1计数率=fORC/12。
产生溢出所需机器周期数=模M-计数初值X。
2.MAX232芯片
用89C51串行接口通信,如果两台单片机之间的距离很近(不超过1.5m),可以采用直接将两台单片机的串行接口直接相连,利用其自身的TTL电平(0-5V)直接传输数据信息。
如果传输距离较远(超过1.5m),由于传输线的阻抗与分布电容,会产生电平损耗和波形畸变,以至于检测不出数据或数据出错。
此时可利用RS232标准总线接口,将单片机输出的TTL电平转换为RS232标准电平(逻辑1为-15—-5V;
逻辑0为+5-—+15V)。
用RS232可将传输距离提高到15m,如果想远距离传输,可以采用RS422或者RS485。
电平转换芯片MAX232是美信公司(MAXIM)生产,专用于进行将TTL电平转换为RS232电平的芯片,MAX232内部有泵电源,能将+5V电源电压在芯片内提高到RS232电平所需的+10V或者-10V电平。
图2.电平转换芯片MAX232
3.DS18B20温度传感器
数字温度传感器DS18B20介绍
1、DS18B20的主要特性
1.1、适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃
1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
1.9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的外形及管脚排列如下图1:
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图2:
DS18B20内部结构图
3、DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
4.整体电路设计
最终设计电路如下图3所示,发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。
接受方接收后,通过P1口在数码管上显示接收的信息。
A机控制B机LED,B机控制A机数码管加一显示
B机DS18B20温度传感器检测温度送A机显示
三、软件设计
1.串行通信软件实现
(1)串行口工作于方式1;
用定时器1产生9600bit/s的波特率,工作于方式2。
(2)功能:
将本机ROM中数码表TAB[16]中的16个数发送到从机,并保存在从机内部ROM中,从机收到这16个数据后送到一个数码管循环显示。
(3)通信协议:
主机首先发送连络信号(信号),从机接收到之后返回一个连络信号(BBH)表示从机已准备好接收。
(4)通信过程使用第九位发送奇偶校验位。
(5)从机接收到一个数据后,立即进行奇偶校验,若数据没有错误,则返回00H,否则返回FFH。
(6)主机发送一个数据后,等待从机返回数据;
若为00H,则继续发送下一个数据,若为FFH,则重新发送数据。
(7)通过通信协议进行发送接收,A机向B机发送操作代码A、B、C或停止发送,对应的开关K1按一下两机LED1都亮,按第二下两机LED2都亮,再按下时,LED1、LED2全亮,再按则四灯全灭。
(8)K2控制B机向A机发送字符,根据按键次数逐次加1至9,10为关闭状态,同时B机接收A机命令,受K1控制LED灯的亮、灭。
(9)由B机DS18B20测量温度后A机显示测量的温度值.
2串行通信的传输方式
串行通信的传送方向通常有三种
(1)单向(或单工)配置,只允许数据向一个方向传送;
(2)半双向(或半双工)配置,允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;
(3)全双向(全双工)配置,允许同时双向传送数据,因此,全双工配置是一对单向配置,它要求两端的通信设备都具有完整和独立的发送和接受能力。
3、串行通信工作方式
方式1接收时,数据从引脚RXD(P3.0)端输入。
接收是在SCON寄存器中REN位置1的前提下,并检测到起始位(RXD上检测到1→0的跳变,即起始位)而开始的。
接收时,定时信号有两种:
一种是接收移位时钟(RX时钟),它的频率和传送波特率相同,也是由定时器T1的溢出信号经过16或32分频而得到的;
另一种是位检测器采样脉冲,它的频率是RX时钟的16倍,亦即在一位数据期间有16位检测器采样脉冲,为完成检测,以16倍于波特率的速率对RXD进行采样。
4程序流程图
(1)发送端程序流程图
(2)接收方程序流程图
四、联合调试
在protues上进行仿真实验。
首先使用KeilC将编写完成的程序编译生成HEX文件,将HEX文件烧录到两片单片机中,进行仿真实验,结果如下图所示,可以看到,接收端已将接受到的数据完整的显示了出来。
附录
A机控制B机LED
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P1^0;
sbitLED2=P1^3;
sbitK1=P1^7;
ucharOperation_No;
//操作代码
//数码管代码
ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时
voidDelaysMS(uintms)
{
uchari;
while(ms--)for(i=0;
i<
120;
i++);
}
//向串口发送字符
voidPutc_to_SerialPort(ucharc)
SBUF=c;
while(TI==0);
TI=0;
//主程序
voidmain()
{
LED1=LED2=1;
P0=0x00
SCON=0x50;
//串口模式一,允许接收
TMOD=0x20;
//T1工作模式2
PCON=0X00;
//波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=RI=0;
TR1=1;
IE=0x90;
//允许串口中断
while
(1)
DelaysMS(100);
if(K1==0)//按下K1时选择操作代码0,1,2,3
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No)//根据操作代码发送A/B/C或停止发送
{
case0:
Putc_to_SerialPort('
X'
);
LED1=LED2=1;
break;
case1:
A'
);
LED1=~LED1;
LED2=1;
case2:
Putc_to_SerialPort('
B'
LED2=~LED2;
LED1=1;
case3:
C'
LED2=LED1;
}
}
//甲机串口接收中断函数
voidSerial_INT()interrupt4
if(RI)
{
RI=0;
if(SBUF>
=0&
&
SBUF<
=9)P0=DSY_CODE[SBUF];
elseP0=0x00;
B机控制A机数码管加一显示
sbitK2=P1^7;
ucharNumX=-1;
{LED1=LED2=1;
P0=0x00;
//波特率9600
RI=TI=0;
if(K2==0)
while(K2==0);
NumX=++NumX%11;
//产生0~10范围内的数字,其中10表示关闭
SBUF=NumX;
while(TI==0);
TI=0;
if(RI)//如收到则LED则动作
switch(SBUF)//根据所收到的不同命令字符完成不同动作
case'
:
//全灭
case'
LED1=0;
//LED1亮
LED2=0;
//LED2亮
LED1=LED2=0;
//全亮
B机DS18B20温度传感器检测温度送A机显示
A机程序
#include<
intrins.h>
#definedelayNOP(){_nop_();
_nop_();
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodeTemp_Disp_Title[]={"
CurrentTemp:
"
};
ucharCurrent_Temp_Display_Buffer[]={"
TEMP:
ucharcodeTemperature_Char[8]=
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
ucharcodedf_Table[]=
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
ucharCurrentT=0;
ucharTemp_Value[]={0x00,0x00};
ucharDisplay_Digit[]={0,0,0,0};
bitDS18B20_IS_OK=1;
intb;
sbitDQ=P3^4;
voidDelayXus(uintx)
uchari;
while(x--)
for(i=0;
200;
voidDelay(uintx)
while(--x);
ucharInit_DS18B20()
ucharstatus;
DQ=1;
Delay(8);
DQ=0;
Delay(90);
returnstatus;
bitLCD_Busy_Check()
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&
0x80);
LCD_EN=0;
returnresult;
voidWrite_LCD_Command(ucharcmd)
while(LCD_Busy_Check());
LCD_RW=0;
LCD_EN=0;
_nop_();
P0=cmd;
voidWrite_LCD_Data(uchardat)
LCD_RS=1;
P0=dat;
voidLCD_Initialise()
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
Write_LCD_Command(0x0c);
Write_LCD_Command(0x06);
voidSet_LCD_POS(ucharp