实验四基于单片机的串行通信
单片机串行通信实验

实验四单片机串行通信实验一、实验目的1、掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。
2、了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。
3、学习串口通讯的中断方式的程序编写方法二、实验说明利用单片机串行口,实现两个实验台之间的串行通讯。
其中一个实验台作为发送方,另一侧为接收方。
发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示。
三、实验仪器计算机伟福实验箱(lab2000P )四、实验内容与软件流程图1、8051的RXD、TXD接线柱在POD51/96仿真板上。
2、通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。
也可以将本机的TXD 接到RXD上,这样按下的键,就会在本机LED上显示出来。
3、若想与标准的RS232设备通信,就要做电平转换,输出时要将TTL电平换成RS232电平,输入时要将RS232电平换成TTL电平。
可以将仿真板上的RXD、TXD信号接到实验板上的“用户串口接线”的相应RXD和TXD端,经过电平转换,通过“用户串口”接到外部的RS232设备。
可以用实验仪上的逻辑分析仪采样串口通信的波形4、软件流程图5、实验电路连接方式①双机串行通信方式。
TXD脚和RXD脚分别用于发送和接收数据。
②单机通信的情况下,只需将自己的TXD脚与RXD脚连接就可以,不用公地操作。
五、思考题1、接收到的数据加1显示出来;2、保存前一个接收到的数据,数据向前推动显示。
六、源程序修改原理及其仿真结果实验结果图源程序:加1显示:接收到的数据先前推送:七、心得体会通过这次实验,我掌握了单片机串行口工作方式的程序设计,及简易三线式通讯的方法。
了解了实现串行通讯的硬环境、数据格式的协议、数据交换的协议。
学习了串口通讯的中断方式的程序编写方法。
单片机串行通信实验报告(实验要求、原理、仿真图及例程)

《嵌入式系统原理与实验》实验指导实验三调度器设计基础一、实验目的和要求1.熟练使用Keil C51 IDE集成开发环境,熟练使用Proteus软件。
2.掌握Keil与Proteus的联调技巧。
3.掌握串行通信在单片机系统中的使用。
4.掌握调度器设计的基础知识:函数指针。
二、实验设备1.PC机一套2.Keil C51开发系统一套3.Proteus 仿真系统一套三、实验容1.甲机通过串口控制乙机LED闪烁(1)要求a.甲单片机的K1按键可通过串口分别控制乙单片机的LED1闪烁,LED2闪烁,LED1和LED2同时闪烁,关闭所有的LED。
b.两片8051的串口都工作在模式1,甲机对乙机完成以下4项控制。
i.甲机发送“A”,控制乙机LED1闪烁。
ii.甲机发送“B”,控制乙机LED2闪烁。
iii.甲机发送“C”,控制乙机LED1,LED2闪烁。
iv.甲机发送“C”,控制乙机LED1,LED2停止闪烁。
c.甲机负责发送和停止控制命令,乙机负责接收控制命令并完成控制LED的动作。
两机的程序要分别编写。
d.两个单片机都工作在串口模式1下,程序要先进行初始化,具体步骤如下:i.设置串口模式(SCON)ii.设置定时器1的工作模式(TMOD)iii.计算定时器1的初值iv.启动定时器v.如果串口工作在中断方式,还必须设置IE和ES,并编写中断服务程序。
(2)电路原理图Figure 1 甲机通过串口控制乙机LED闪烁的原理图(3)程序设计提示a.模式1下波特率由定时器控制,波特率计算公式参考:b.可以不用使用中断方式,使用查询方式实现发送与接收,通过查询TI和RI标志位完成。
2.单片机与PC串口通讯及函数指针的使用(1)要求:a.编写用单片机求取整数平方的函数。
b.单片机把计算结果向PC机发送字符串。
c.PC机接收计算结果并显示出来。
d.可以调用Keil C51 stdio.h 中的printf来实现字符串的发送。
单片机指令的串口通信实现方法

单片机指令的串口通信实现方法串口通信是指通过串行通信接口实现的数据传输方式。
在单片机系统中,串口通信是一种重要的通信方式,可以实现与外部设备(如PC 机、传感器等)的数据交互。
本文将介绍单片机指令的串口通信实现方法,包括硬件连接和软件编程两方面。
一、硬件连接串口通信需要通过发送器和接收器两个设备来完成数据的发送和接收。
在单片机系统中,可使用通用异步收发器(UART)作为串行通信接口。
下面是串口通信的硬件连接步骤:1. 将单片机与UART连接:首先,确保单片机具有UART接口,并根据其引脚定义将UART的发送线(TXD)连接到单片机的接收引脚,接收线(RXD)连接到单片机的发送引脚。
2. 选择波特率:波特率指每秒钟传送的位数,通常使用的波特率有9600、115200等。
在发送和接收数据时,单片机和外部设备需要使用相同的波特率,以保证数据的正确传输。
3. 连接外部设备:根据实际需求,将UART的发送线和接收线分别连接到外部设备的接收引脚和发送引脚。
二、软件编程实现单片机指令的串口通信需要编写相应的软件程序。
下面是基于C语言的软件编程实现方法:1. 初始化串口:在程序开始时,需要对串口进行初始化设置。
通过设置寄存器来配置波特率、数据位、停止位等参数。
2. 发送数据:使用发送指令将待发送的数据写入UART的数据寄存器,等待数据传输完成。
3. 接收数据:通过接收指令读取UART接收到的数据,并进行相应的处理。
可以使用中断或轮询方式进行数据接收。
4. 错误处理:在数据传输过程中,可能会出现错误,例如帧错误、奇偶校验错误等。
需要进行相应的错误处理操作,例如重新发送数据或发出错误提示。
5. 通信协议:根据通信需求,可以制定相应的通信协议。
通信协议包括数据帧结构、数据格式、数据校验等内容,用于确保数据的可靠传输。
三、实例演示下面通过一个简单的示例来演示单片机指令的串口通信实现方法。
假设我们需要实现从单片机向PC机发送一条消息,并接收PC机返回的确认信息。
单片机实验四 串行通信实验实验

昆明理工大学信息工程与自动化学院学生实验报告( 2014 — 2015 学年第 2 学期)课程名称:嵌入式技术开课实验室:信自楼402 2015年6月2日年级、专业、班计科122 学号201210405204 姓名邹华宇成绩实验项目名称实验四串行通信实验指导教师江虹教师评语该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□该同学的实验能力: A.强□ B.中等□ C.差□该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□实验报告是否规范: A.规范□ B.基本规范□ C.不规范□实验过程是否详细记录: A.详细□ B.一般□ C.没有□教师签名:年月日一、实验目的掌握单片机系统中串行端口的编程控制方法,学会实时程序的调试技巧。
二、实验原理89C51单片机的串行端口结构上有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H;接收器是双缓冲结构;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。
单片机的串口可以由特殊功能寄存器SCON设置其工作方式,是否允许接受等,由PCON 设置其波特率是否倍增。
发送和接收工作可以由中断完成,也可以不用中断,其中断矢量编号为4。
串口的处理主要涉及以下几个方面的内容:串口初始化发送程序设计(字节,字符串)接收程序设计是否用中断三、实验内容利用TX-1C实验板上及串口助手实现PC机与单片机的互相通信。
编写程序实现:当PC 机给单片机发送一个字符后,单片机回传PC机发送给它的字符的十六进制数。
四、实验步骤1、按实验要求在KeilC中创建项目,编辑、编译程序。
源代码:#include <reg52.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intbit bsf=0;uchar g_uRev;//uchar code table[]="I Love MCU!\n";//uchar code table1[]="昆明理工大学\n";void DelayMS(uint x){uchar i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void UartInit(void) //9600bps@11.0592MHz{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFD; //设定定时初值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1}void Send_Byte(uchar uDat){SBUF = uDat;while(!TI);TI = 0;}void Send_Str(uchar *pstr){while(*pstr){Send_Byte(*pstr++);}}uchar UART_Rev(void){static uchar g_uRev;if(RI){g_uRev = SBUF;RI = 0;bsf=1;}return g_uRev;}void senddata(void)uint utemp=0;utemp=UART_Rev();if(bsf){Send_Str("Y ou give me the number is ");Send_Byte(utemp);TI=1;printf("\n");printf("His ASCII number is 0x%x\n",utemp);while(!TI);TI=0;bsf=0;}}void main(){UartInit();DelayMS(10);//Send_Str("Kmust\n");// TI = 1;//printf("昆明理工大学\n");//while(!TI);// TI = 0;//while(1);while(1){senddata();P1=UART_Rev();}2、将编译生成的目标码文件(后缀为.Hex)下载到实验板电路中。
单片机课程设计实验单片机间串行通信

1 设计任务
单片机间串行通信,是工业自动化、智能终端、通信管理等领域传统且重要的通讯手段。
此次设计单片机串行通信,就是为了了解单片机的工作原理,从而学会制作数字钟。本次课程设计通过理论设计和实物制作解决相应的实际问题,巩固和运用在《单片机原理与应用及C51程序设计》中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。
AT89C51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。其基本结构如图1
图 1 AT89C51单片机的基本结构
AT89C51 是一个低电压,高性能CMOS 8 位单片机,片内含8kB 的可反复擦写的Flash 只读程序存储器和256B 的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052 产品引脚兼容,片内置有通用8 位中央处理器(CPU)和Flash 存储单元。
《题目:单片机间串行通信原理
专业班级:2012级电子信息科学与技术
学生姓名:罗滨志
学号:120802010051
成绩:
2014年12月27日
4实验步骤14
4.1实验程序调试14
4.1.1发送端程序调试14
4.1.2接收端程序调试15
4.2实验仿真16
摘
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而AT89C51单片机是各单片机中最为典型和最有代表性的一种,本设计是基于MCS51系列单片机中AT89C51所设计的一种具有一个全双工的串行通信口,可以实现单片机与单片机之间点对点串行通信,主从通信以及上,下位机互相通信等。本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,由单片机与键盘控制数码管的显示,修改设置LED显示由按键开关控制,通过硬件电路制作以及软件程序的编制,设计制作一个简单的单片机间串行通信。
实验四(一) 串并转换实验(2学时)

delay(10); //延时一小段时间
ZX=0xff; //
数码管消影
ZX=table[buffer[1]]; //显示ASCII的十位
ZW=table2[1];
delay(10);
ZX=0xff;
ZX=table[buffer[2]]; //显示ASCII值的个位
num++;
if(num==10) //定时1S时间到
{Hale Waihona Puke num=0;i++;
if(i==10) i=0; //数码管反复扫描
SBUF=~Table[i]; //取反,送数码管显示数字
}
}
实验四(二) 单片机与PC机串行通信实验(2学时)
一、实验目的
⑴掌握串行口工作方式的程序设计,掌握单片机通信程序编制方法。
0x49,0x41,0x1F,0x01,0x09}; //共阳数码管字段
void main()
{ TMOD=0x01; //定时器T0方式1
TH0=(65536-50000)/256;//定时器赋初值,定时100ms,(12MHz晶振)
TL0=(65536-50000)%256;
EA=1; //总中断打开
湖北民族学院科技学院
信息工程学院
单片机原理实验报告
实验名称:单片机串口应用
专业班级
学号
姓名
指导教师
实验四(一) 串并转换实验(2学时)
一、实验目的
⑴掌握8031串行口方式0工作方式及编程方法。
⑵掌握利用串行口扩展并行I/O通道的方法。
二、实验内容
(1)在实验箱上完成:
单片机 串行口通信实验

实验三串行口通信实验一、实验内容据图1所示电路,两个同学为一组分为甲方、乙方,所有实验都采用方式3,偶校验,波特率为2400bit/s,采用T1作波特率发生器,均采用中断发送和接收。
按键值a:按K1,a=0x01;按K2,a=0x02;按K3,a=0x04;按K4,a=0x08。
1、单向通信向甲方连续不断地发送变量a的值,未按键,a=0x0f,按键后根据按键确定a值;并将a的值取反从P0口输出,控制D0、D1、D2、D3相应点亮。
乙方接收到数据并偶校验正确后,将接收数据取反从P0口输出,控制D0、D1、D2、D3相应点亮。
2、双向通信甲方连续不断地发送变量a的值,未按键,a=0x0f,按键后根据按键确定a 值;乙方未按键不发送,按键后将a*16发送;甲乙双方都将发送数据与接收数据相或后再取反,从P0口输出控制D0—D7相应点亮。
3、间隔发送未按键,甲方不发送数据,按键后甲方每隔50ms连续发送4个字节:0xff、a、a、a。
乙方只在收到甲方数据0xff后的3个数据并验证相同时,才将接收数据*16发送。
甲乙双方都将发送数据与接收数据相或后,从P0口输出控制D0—D7相应点亮。
二、实验方案本人负责编程和处理乙机的编程和实验。
1、总体方案设计所用硬件:AT89C52、BUTTON、LED、10BQ040、电源共有4个按键K1、K2、K3、K4,分别连接到单片机P2.0、P2.1、P2.2、P2.3引脚,按键后对应引脚为低电平,通过4个二极管5连接到P3.2(外部中断0),通过通信接口排插将甲机的TXD、RXD连接到乙机的RXD、TXD。
软件设计:1、按键处理采用中断处理按键,甲方在外部中断0服务程序中:判断按键确定发送数据,并判断是否开始发送,若未开始发送,设置TI=1。
2、双向通信串行口中断后要注意判断是发送中断( TI=1 ) 还是接收中断( RI=1 ),判断完后要清除标志。
发送数据和接收数据函数void send(uchar dat){ACC=dat;TB8=P;//将奇偶校验位作为第9位数据发送,采用偶校验SBUF=ACC;}uchar receive(){ACC=SBUF;//将接收缓冲器的数据存于ACCif(RB8==P){//只有奇偶校验成功才能往下执行,接收数据return ACC;//返回接收缓冲器的数据}else{return 0x00;}}主要算法1(单向通信和双向通信实验项目合一):1、全局变量的定义:uchar a; //记录发送数据uchar b;//记录接收数据2、外部中断0键控函数(用来发送数据给甲机):void keyControl() interrupt 0{if(INT0==0){//K1键按下,a=0x01if(K1==0){a=0x01*16;}//K2键按下,a=0x02if(K2==0){a=0x02*16;}//K3键按下,a=0x04if(K3==0){a=0x04*16;}//K4键按下,a=0x08if(K4==0){a=0x08*16;}}TI=1;}3、串行口中断函数:void ES_int() interrupt 4{//串行口中断函数if(RI){RI=0;b=receive();}if(TI){TI=0;send(a);}}主要算法2(间隔发送):1、全局变量的定义:uchar a;//发送数据int send_time=0;//记录发送的次数uchar b; //接收数据int receive_time=0;//记录接收的次数uchar c[3];//判断接收值是否相同2、串行口中断函数:void ES_int() interrupt 4{//串行口中断函数if(RI){//接收中断RI=0;if(receive_time==1){if(receive()==0xff){//判断第一次接收的数据是否为0xff,是继续接收后面的三个数据,否重新接收第一个数据receive_time++;}else{receive_time=1;}}else if(receive_time>=2&&receive_time<=4){if(receive_time==2){//接收第一位个数据c[0]=receive();}if(receive_time==3){//接收第二个数据c[1]=receive();}if(receive_time==4){//接收第三个数据c[2]=receive();if(c[0]==c[1]&&c[1]==c[2]){//判断后三个数据是否相同,相同就把接收到的数据*16然后发送给甲机b=c[0];a=b*16;send_time=1;TI=1;}}receive_time++;}}if(TI){//发送中断TI=0;if(send_time==1){send(0xff);}else if(send_time>=2&&send_time<=4){send(a);}if(send_time==4)//发送成功显示LEDlight(~(a|b));send_time++;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 双向通信程序流程图图2-3 间隔发送程序流程图三、源程序双向通信程序源代码:#include"reg51.h"#define uchar unsigned char#define uint unsigned int//#define TH(a) (65536-a)/256//定义装入定时器高8位的时间常数//#define TL(a) (65536-a)%256//定义装入定时器低8位的时间常数sbit p=PSW^0;sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3;uchar a; //记录发送数据uchar b;//记录接收数据void light(uchar dat){//亮灯函数P0=dat;}void send(uchar dat){ACC=dat;TB8=P;//将奇偶校验位作为第9位数据发送,采用偶校验SBUF=ACC;}uchar receive(){ACC=SBUF;//将接收缓冲器的数据存于ACCif(RB8==P){//只有奇偶校验成功才能往下执行,接收数据return ACC;//返回接收缓冲器的数据}else{return 0x00;}}void main(){TMOD=0x20;//设置定时器T1为方式2定时IE=0x91;//总中段开,允许串行、外部中断0中断IT0=1;//选择外部中断0为跳沿触发方式SCON=0xd0;//设置串口为方式3并允许串口接收数据PCON=0x00;//SMOD=0;TH1=0xf4;TL1=0xf4; //给定时器T1赋初值,波特率设置为2500 TR1=1;//启动定时器T1while(1){light(~(a|b));//将发送数据和接收数据相或后取反显示}}void ES_int() interrupt 4{//串行口中断函数if(RI){RI=0;b=receive();}if(TI){TI=0;send(a);}}void keyControl() interrupt 0{if(INT0==0){//K1键按下,a=0x01if(K1==0){a=0x01*16;}//K2键按下,a=0x02if(K2==0){a=0x02*16;}//K3键按下,a=0x04if(K3==0){a=0x04*16;}//K4键按下,a=0x08if(K4==0){a=0x08*16;}}TI=1;}间隔发送程序源代码:#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define TH(a) (65536-a)/256//定义装入定时器高8位的时间常数#define TL(a) (65536-a)%256//定义装入定时器低8位的时间常数sbit p=PSW^0;sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3;uchar a;//发送数据int send_time=0;//记录发送的次数uchar b; //接收数据int receive_time=0;//记录接收的次数uchar c[3];//判断接收值是否相同void light(uchar dat){//亮灯函数P0=dat;}void send(uchar dat){ACC=dat;TB8=P;//将奇偶校验位作为第9位数据发送,采用偶校验SBUF=ACC;}uchar receive(){ACC=SBUF;//将接收缓冲器的数据存于ACCif(RB8==P){//只有奇偶校验成功才能往下执行,接收数据return ACC;//返回接收缓冲器的数据}else{return 0x00;}}void main(){TMOD=0x21;//设置定时器T1为方式2定时,T0为方式1定时IE=0x93;//总中段开,允许串行、外部中断0、定时器T0中断IT0=1;//选择外部中断0为跳沿触发方式SCON=0xd0;//设置串口为方式3并允许串口接收数据PCON=0x00;//SMOD=0;TH1=0xf4;TL1=0xf4; //给定时器T1赋初值,波特率设置为2500 TR1=1;//启动定时器T1TH0=TH(50000);TL1=TL(50000);//给定时器T0赋初值,50msTR0=1;//定时器T0初始为开启状态while(1){}}void ES_int() interrupt 4{//串行口中断函数if(RI){//接收中断RI=0;if(receive_time==1){if(receive()==0xff){//判断第一次接收的数据是否为0xff,是继续接收后面的三个数据,否重新接收第一个数据receive_time++;}else{receive_time=1;}}else if(receive_time>=2&&receive_time<=4){if(receive_time==2){//接收第一位个数据c[0]=receive();}if(receive_time==3){//接收第二个数据c[1]=receive();}if(receive_time==4){//接收第三个数据c[2]=receive();if(c[0]==c[1]&&c[1]==c[2]){//判断后三个数据是否相同,相同就把接收到的数据*16然后发送给甲机b=c[0];a=b*16;send_time=1;TI=1;}}receive_time++;}}if(TI){//发送中断TI=0;if(send_time==1){send(0xff);}else if(send_time>=2&&send_time<=4){send(a);}if(send_time==4)//发送成功显示LEDlight(~(a|b));send_time++;}}void T0_int() interrupt 1{receive_time=1;RI=1;TH0=TH(50000);TL1=TL(50000);}void keyControl() interrupt 0{/*if(INT0==0){//K1键按下,a=0x01if(K1==0){a=0x01*16;}//K2键按下,a=0x02if(K2==0){a=0x02*16;}//K3键按下,a=0x04if(K3==0){a=0x04*16;}//K4键按下,a=0x08if(K4==0){a=0x08*16;}}*/}四、实验结果单向通信及双向通信:1、开机即接收来自甲机发送的默认数据0x0f,取反通过LED输出(如图4-1)图4-1 接收甲机发送的默认数据2、接收到来自甲机的数据0x02并取反通过LED输出(如图4-2)图4-2 接收来自甲机的数据0x023、K3键按下向甲机发送数据0x04*16并输出接收数据及发送数据相或并取反到LED(如图4-3)图4-3 K3键按下向甲机发送数据,本机输出数据间隔发送:1、接收到甲机发送的数据0x02,三次校验成功后发送0x02*16到甲机,输出接收数据和发送数据相或并取反后的结果到LED(如图4-4)图4-4 K3键按下恢复原来的交通灯状态并正常运行五、实验思考题1、为什么串行口中断后要注意判断是发送中断( TI=1 ) 还是接收中断( RI=1 ),判断完后要清除标志。
单片机串行通信实验报告

单片机实验报告(三)实验名称:串行通信姓名:张昊学号:110404247班级:通信2班时间:2013.11南京理工大学紫金学院电光系一、实验目的1、理解单片机串行口的工作原理;2、学习使用单片机的TXD、RXD口;3、了MAX232解芯片的作用。
二、实验原理计算机与其外部设备之间进行数据交换称为通信。
通信的基本方式可分为并行通信和串行通信两种。
并行通信中数据至少有8路,可以同时将一个字节的8位二进制代码发送到对方。
串行通信用两根传输线进行数据的传输,一次只能发送一位二进制。
串行通信技术根据传送的编码格式不同,可分为同步通信和异步通信两种方式:1、同步方式:数据以数据块为单位传送。
在开始传送前用同步字符来指示,并由时钟来实现发送端和接收端同步。
2、异步方式:数据时不连续传送的。
以字符为单位进行传送。
被传送字节分为:起始位、数据位、校验位和停止位,称为一帧。
常用格式:a、1bit起始位+8bit数据位+无校验位+1bit停止位b、1bit起始位+8bit数据位+1位偶校验位+1bit停止位串行通信技术根据数据流动方向分为三种方式:1、单工通信:数据流动方向是固定的,数据只能由一方发送到另一方。
2、半双工通信:数据的流动方向是双向的,但一时刻,数据只能在一个方向流动。
3、全双工通信:允许数据在两个方向流动,即通信双方的数据发送和接收是同时的。
串行口控制寄存器SCON的格式如下:D7 D6 D5 D4 D3 D2 D1 D0SM0、SM1:由软件置位或清零,用于选择串行口四种工作方式。
SM2:多机通信控制位。
在方式2和方式3中,如SM2=1,则接收到的第9位数据(RB8)为0时不启动接收中断标志RI(即RI=0),并且将接收到的前8位数据丢弃;RB8为1时,才将接收到的前8位数据送入SBUF,并置位RI,产生中断请求。
当SM2=0时,则不论第9位数据为0或1,都将前8位数据装入SBUF中,并产生中断请求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四基于单片机的串行通信一、 实验目的1.了解串行通信的基本知识;2.掌握用单片机串行口实现串行通信的方法。
二、 实验器材微机、示波器、万用表、电源、AEDK仿真开发系统,面包板一块,MAX202C芯片一块,电容、电阻、导线若干。
三、 实验原理此处仅介绍与本实验内容密切相关的串行通信基本知识,其它有关基本知识介绍请见本讲义实验七。
1.串行通信的异步和同步传送方式CPU与其外部设备之间的信息交换或计算机之间的信息交换均可被称为“通信”。
通信的基本方式可分为并行通信和串行通信两类。
并行通信是指数据各位同时并行传送的通信方式,而串行通信是指数据逐位顺序串行传送的通信方式(如图4.1所示)。
在并行通信中,由于有多根传输线并行传送数据,因此传送速度快、通信速率高。
但当多位数据远程传输时,传输线路的开销就成为突出问题。
由于串行通信只需一对传输线,并且可以利用电话线等现有通信信道作为传输介质,因而可以大大降低传输线路的成本。
一般而言,串行通信的传送速度明显低于并行通信。
(a)并行通信 (b)串行通信图4.1 通信方式示意图串行通信分为异步传送和同步传送两类。
异步通信是一种字符再同步的通信方式,而同步通信是靠识别同步字符来实现数据的发送和接收的。
(1) 异步传送方式异步传送的特点是:①数据以字符方式随机且断续地在线路上传送(但在同一字符的内部的传送是同步的)。
各字符的传送依发送方的需要可连续,也可间断。
②通信双方用各自的时钟源来控制发送和接收。
③通信双方按异步通信协议传输字符。
异步通信格式如图4.2所示,每个字符由起始位、数据位、奇偶校验位和停止位四个部分顺序组成。
这四个部分组成异步传输中的一个传输单元,即字符帧。
z 起始位:为“0”信号,占1位。
起始位的作用有两个:①表示一个新字符帧的开始。
即线路上不传送字符时,应保持为“1”。
接收端检测线路状态连续为“1”后或在停止位后有一个“0”,就知道将发来一个新的字符帧。
②用以同步接收端的时钟,以保证后续的接收能正确进行。
z 数据位:紧接于起始位后面,它可以占5、6、7或8位不等,数据的位数依最佳传送速率来确定。
如所传数据为ASCII 码字符,则常取7位。
数据位传输的顺序,总是最低位(LSB )D 0在先。
z 奇偶校验位:在数据位之后,占1位。
它用来检验信息传送否有错。
它的状态常由发送端的奇偶校验电路确定。
奇偶位的值取决于校验类型,若为偶校验,则数据位和校验位中逻辑“1”的个数必须是偶数;若为奇校验,则数据位和校验位中逻辑“1”的个数必须是奇数。
也可以规定不用奇偶校验位,或用其它的校验方法来检验信息传送过程是否有错。
z 停止位:用“1”来表征一个字符帧的结束。
停止位可以占1位、1.5位或2位不等。
接收端收到停止位时,表明这一字符已接收完毕,也表明下一个字符帧可能到来。
若停止位以后不是紧接着传送下一个字符帧,则让线路上保持为“1”,即空闲等待状态。
图4.2既表示一个字符紧接一个字符传送的情况,又表示两个字符间有空闲位的情况。
串行通信的一个重要指标是波特率。
它定义为每秒钟传送二进制数码的位数(亦称波特率),以“位/秒”(bps )为单位。
在异步通信中,波待率=(每个字符帧的位数)×(每秒传送的字符数)常用的波特率有600、1200、2400、4800、9600、19200(bps )等。
由于异步通信双方各用自己的时钟源,若时钟频率等于波特率,则频率稍有偏差就会产生接收错误。
时钟频率应比波特率高,时钟频率与波特率的比一般选16:1或者64:1。
采用较高频率的时钟,在一位数据内就有16或64个时钟,就可以保证捕捉正确的信号。
空闲位 起校停起校停空闲位 第n 个字符帧 第n +1个字符帧图4.2异步通信的字符帧格式因此,在异步通信中,收发双方必须事先约定两件事:一是规定字符帧格式,即规定字符各部分所占的位数,是否采用校验,以及校验的方式等;二是规定所采用的波特率以及时钟频率和波特率间的比例关系。
异步传送由于不传送同步时钟脉冲,所以设备比较简单,实现起来方便,它还可根据需要连续地或有间隙地传送数据,对各字符间的间隙长度没有限制。
缺点是在数据字符串中要加上起同步作用的起始位和停止位,降低了有效数据位的传送速率,仅适合于低速通信的场合。
(2) 同步传送方式同步传送方式以许多字符或许多位组成的数据块为传输单位连续地传送数据。
在通信开始以后,发送端连续发送字符,接收端也连续接收字符,直到一个数据块传送结束。
同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,仅在数据块开始时用同步字符SYNC来指示,这就提高了数据传送的效率,其符号格式如图4.3所示。
同步通信可以分为单同步字符方式和双同步字符方式,图4.3(a)为双同步字符方式,图4.3(b)为单同步字符方式,同步字符之后是连续的数据块。
同步字符可以由用户约定,当然也可以采用ASCII码中规定的SYN代码,即16H。
按同步方式通信时,在发送时要插入同步字符,接收方检测到同步字符时,即准备开始接收,因此,硬件设备需有插入同步字符和相应的检测手段,设备较复杂。
在同步传送时,无论接收或发送,都要求统一时钟。
为了保证接收正确无误,发送方除了传送数据外还要把时钟信号同时传送出去。
同步传送的优点是传送速率较高,可达56K波特或更高。
图4.3同步传送符号格式2.MCS-51系列单片机的串行通信接口MCS一51系列单片机内部有一个可编程的全双工串行通信口,可作为通用异步接收和发送器,也可作为同步移位寄存器用。
该串行口有4种工作模式(详见下文2.6)。
片内的定时器/计数器可用作波特率发生器。
接收、发送均可工作在查询方式或中断方式。
2.1串行通信接口结构MCS一51系列单片机内部的串行通信口,有二个物理上相互独立的接收、发送缓冲器SBUF,对外也有两条独立的收、发信号线RxD(P3.0)和TxD(P3.1)。
可以同时发送、接收数据,实现全双工传送。
发送缓冲器和接收缓冲器不能互换,发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入。
两个缓冲器占用同一个端口地址(99H)。
具体对哪一个缓冲器进行操作,取决于所用的指令是发送还是接收。
接收是双缓存的,以避免在接收下一帧数据之前,CPU未能及时响应接收中断, 未把上一帧数据取走而产生两帧数据重叠的问题。
而对于发送器,,因为发送时CPU是主动的,不会产生写重叠的问题,所以不需要双缓存。
与串行通信口有关的寄存器有多个,除SBUF之外,还有SCON、PCON、IE和定时器/计数器,用校验方式进行通信,有时也会用到程序状态字寄存器PSW。
2.2串行口控制寄存器SCONSCON用于控制和监视串行口的工作状态,定义如下:表4.2 SCON 寄存器(MSB) (LSB)SM0 SM1 SM2 REN TB8 RB8 TI RIz SM0和SM1:串行口工作模式选择位,对应四种模式,见表4.3。
z SM2:在模式0时,SM2不用,应设置为0。
在模式1时,SM2一般也应设置为0。
若SM2=1,则只有收到有效停止位才会激活RI,并自动发出串行口中断请求(设中断是开放的),若没有接收到有效停止位,则RI清零。
在模式2或模式3下,SM2的设置与字符帧第九位的作用有关。
①在第九位用作奇偶位的情形,应置SM2=0。
②在第九位用于表示是地址帧还是数据帧的多机通信情形,若SM2=1和RB8=1时,RI不仅被激活,而且可以向CPU请求中断;若SM2=0,串行口以单机发送或接收方式工作,TI和RI以正常方式被激活。
SM2在多机通信中的使用方法,详见本讲义P.34的有关主从式多机通信过程的说明。
表4.3 串行口工作模式选择SM0 SM1 模 式 功 能 波 特 率0 00 11 0 1 1 0123同步移位寄存器8位UART9位UART9位UARTf OSC/12可变f OSC/64或f OSC/32可变z REN:允许接收控制位,由软件置位或清除。
REN=1则允许接收, REN=0, 禁止接收。
z TB8:该位是模式2和3中要发送的第九位数据。
在许多通信协议中, 该位是奇偶位,可以按需要由软件置位或清除。
在多机通信中, 该位用于表示是地址帧还是数据帧。
z RB8:该位是模式2和3中已接收的第九位数据(可能是奇偶位, 或是地址帧/数据帧标识位)。
在模式1中, 若SM2=0, RB8是已接收的停止位。
在模式0中, RB8未用。
z TI:发送中断标志。
在模式0中, 在发送完第8位数据时, 由硬件置位;在其他模式中, 在发送停止位之初, 由硬件置位,申请中断, CPU响应中断后, 发送下一帧数据。
在任何模式中, 都必须由软件清除TI.z RI:接收中断标志。
在模式0中, 接收第8位数据结束时, 由硬件置位;在其他模式中, 在接收停止位的半中间, 由硬件置位,申请中断, 要求CPU取走数据。
但在模式1中, SM2=1时, 若未接收到有效的停止位, 则不会对RI 置位。
在任何模式中,都必须由软件清除RI.2.3 电源控制寄存器PCON 中的波特率倍增控制位SMODPCON 中有与串行口通信波特率有关的控制位SMOD ,SMOD =1时波特率加倍。
2.4 允许中断寄存器IE 的串行口中断控制位ESIE 中的ES 位为串行口中断控制位,ES=1且总中断允许位EA=1时,允许串行口中断。
2.5 定时器/计数器1作波特率发生器在模式1和模式3下,其中f osc 为晶振频率, TH1为定时器1的重装载值.,定时器/计数器1工作于自动重装载模式, 即模式2。
定时器1中断应禁止。
2.6 串行口的工作模式串行口的四种工作模式中,模式1、2、3用于通信,模式0主要用于I/O 口扩展。
模式0在模式0状态下,串行口为同步移位寄存器方式,其波特率固定为f osc /12。
RxD (P3.0)端输入/输出数据,而TxD(P3.1)线专用于输出时钟脉冲给外部移位寄存器。
发送、接收的是8位数据,低位在先。
模式1串行口工作在模式1,为8位异步通信口,即一字符帧由10位组成:1位起始位、8位数据位和1位停止位。
模式1发送图4.4模式1发送时序图4.4示意模式1的发送时序。
模式1的发送是在发送中断标志TI=0时,由一条写SBUF 的指令启动发送控制器的SEND 端,使SEND=0。
启动发送后,串行口能自动地插入一()125612322TH f osc SMOD−××=()计数器溢出速率定时器波特率/322×=SMOD位起始位0,在字符结束前插入一位停止位1,然后在发送移位脉冲SHIFT作用下,依次由TxD线上发出。
一个字符发完之后,自动维持TxD线的信号为1,在8位数据发出之后,也就是在停止位开始时,使TI置1,用以通知CPU可以发出下一个字符。