实验七 单片机串口通信
单片机串口通信实验报告

单片机串口通信实验报告Abstract本实验旨在通过单片机串口通信的方式,实现两个或多个单片机之间的数据传输与交互。
通过该实验,旨在加深对串口通信的理解,以及掌握单片机串口通信的配置与应用。
1. 实验背景在现代电子产品中,单片机广泛应用于各个领域。
而串口通信作为一种常见的单片机通信方式,被广泛使用。
通过串口通信,单片机可以与其他设备或单片机进行数据传输和通信。
2. 实验目的本实验的目的如下:- 了解串口通信的基本原理和工作方式;- 掌握单片机串口通信的配置方法;- 实现两个或多个单片机之间的数据传输与交互。
3. 实验原理3.1 串口通信的基本原理串口通信通过发送和接收两个引脚实现数据的传输。
典型的串口通信包含一个发送引脚(Tx)和一个接收引脚(Rx)。
发送端将数据通过发送引脚逐位发送,接收端通过接收引脚逐位接收。
3.2 单片机串口通信的配置在单片机中进行串口通信配置,需要设置波特率、数据位、停止位和校验位等参数。
波特率用于控制数据的传输速率,数据位决定发送和接收的数据位数,停止位用于标识数据的停止位,校验位用于检测数据传输的错误。
4. 实验步骤4.1 硬件准备(描述实验所需硬件的准备,例如单片机、串口模块等)4.2 软件配置(描述实验所需软件的配置,例如开发环境、编译器等)4.3 单片机串口通信程序编写(描述如何编写单片机串口通信程序,包括发送和接收数据的代码)4.4 程序下载与调试(描述如何下载程序到单片机,并进行调试)5. 实验结果与分析(描述实验的结果,并进行相应的分析和解释)6. 实验总结通过本实验,我深入了解了串口通信的基本原理和工作方式。
通过编写单片机串口通信程序,实现了两个单片机之间的数据传输与交互。
在实验过程中,我掌握了单片机串口通信的配置方法,并解决了一些可能出现的问题。
通过实验,我加深了对单片机串口通信的理解,并提升了自己的实践能力。
参考文献:(列出参考文献,不需要链接)致谢:(感谢相关人员或机构对实验的支持与帮助)附录:(附上相关的代码、电路图等附加信息)以上为单片机串口通信实验报告,通过该实验,我掌握了串口通信的基本原理和工作方式,以及单片机串口通信的配置与应用方法。
单片机串口通信原理

单片机串口通信原理
单片机串口通信原理是指通过串口进行数据的发送和接收。
串口通信是一种异步通信方式,它使用两根信号线(TXD和RXD)进行数据的传输。
在发送数据时,单片机将待发送的数据通过串口发送数据线(TXD)发送出去。
发送的数据会经过一个串口发送缓冲区,然后按照一定的通信协议进行处理,并通过串口传输线将数据发送给外部设备。
在接收数据时,外部设备将待发送的数据通过串口传输线发送给单片机。
单片机接收数据线(RXD)会将接收到的数据传
输到一个串口接收缓冲区中。
然后,单片机会根据通信协议进行数据的解析和处理,最后将数据保存在内部的寄存器中供程序使用。
串口通信协议通常包括数据位、停止位、校验位等信息。
数据位指的是每个数据字节占据的位数,常见的有8位和9位两种。
停止位用于表示数据的结束,常用的有1位和2位两种。
校验位用于检测数据在传输过程中是否发生错误,常见的校验方式有奇偶校验和无校验。
总的来说,单片机串口通信原理是通过串口发送数据线和接收数据线进行数据的传输和接收,并通过一定的通信协议进行数据的解析和处理。
这种通信方式可以实现单片机与外部设备的数据交换,广泛应用于各种嵌入式系统和物联网设备中。
单片机串口通信设计报告

单片机串口通信设计报告一、实验目的将单片机IO 口状态通过串口发送至PC 机,PC 上位机程序使用串口调试助手或自行编程。
二、串口通信方式串口通信分为两种:串行同步通信、串行异步通信本实验采用串行异步通信,即RS232通信。
在异步通行中有两个比较重要的指标:字符帧格式和波特率。
数据通常以字符或者字节为单位组成字符帧传送。
字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。
发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
数据传输特点:从低位开始发送到高位(起始位一般是1位的低电平开始的,接着的是数据位5-10位,一般是8位,接下来是奇偶校验位1位,停止位1-2位,空闲位)帧格式图起始位数据位奇偶校验位停止位空闲位起始位数据位硬件原理图三、相关寄存器1、串行接口控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。
(1)、SM0 SM1:串行口工作方式控制位SM0、SM1工作方式 :00方式0 ;01方式1;10方式2;11方式3。
(2)、SM2:多机通信控制位多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF ,且置位RI 发出中断申请,否则会将接受到的数据放弃。
当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF ,并发出中断申请。
工作于方式0时,SM2必须为0。
(3)、REN :允许接收位内部CPU 总线(TXD )(RXD )D0D1D2D3D4D5D6D7SCON: 可位寻址字节地址:98HREN 用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4)、TB8:发送接收数据位8在方式2和方式3中,TB8是要发送的——即第9位数据位。
在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
单片机串口通信实验报告

单片机串口通信实验报告
实验目的:
1.掌握单片机串口通信的基本原理和实现方法;
2.学会使用串口模块与上位机进行数据交互;
3.进一步巩固单片机的编程与调试能力。
实验原理:
实验器材:
1.STC89C52单片机开发板1块
2.PC机一台
3.串口线1根
4. 上位机调试软件(如Tera Term) 1个
实验步骤:
1.将STC89C52单片机开发板与PC机通过串口线连接起来;
2. 使用Keil等编程软件编写单片机程序,实现串口通信功能;
4.在PC机上打开上位机调试软件,设置波特率和数据位;
5.测试通信功能,查看上位机接收到的数据是否正确。
实验结果:
经过调试和测试,实验结果如下:
1.单片机程序正常运行,可以通过串口与PC机进行数据交互;
2.上位机调试软件能够正确接收到单片机发来的数据,并显示在界面上;
实验总结:
通过本次实验,我掌握了单片机串口通信的基本原理和实现方法。
在
实验中,我学会了使用串口模块与上位机进行数据交互,并进一步提高了
单片机的编程与调试能力。
这对于今后的电子设计与开发工作将具有很大
的帮助。
同时,在实验过程中,我也遇到了一些问题和困难,如串口连接错误、波特率设置错误等,但通过仔细检查和调试,最终我成功解决了这些问题。
在以后的学习和工作中,我将进一步熟悉串口通信的相关知识,并通
过实际项目的实践,提升自己的实际操作能力和解决问题的能力。
我相信,通过不断的学习和实践,我会越来越熟练地掌握串口通信技术,为以后的
工作打下坚实的基础。
单片机 串行口通信实验

实验三串行口通信实验一、实验内容据图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 ),判断完后要清除标志。
单片机实验报告-串口通信

单片机实验报告姓名___ _ 学号___一、实验项目单片机串行口通讯实验二、实验要求利用单片机串行口,实现两个实验台之间的串行通讯。
其中一个实验台作为发送方,另一侧为接收方。
发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示。
三、实验目的1.掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。
2.了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。
3.学习串口通讯的中断方式的程序编写方法。
四、实验说明1、8051、80C196 的RXD、TXD接线柱在POD51/96 仿真板上,8088/86的TXD、RXD在POD8086仿真板上的8251芯片旁边。
2、通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。
也可以将本机的TXD接到RXD上,这样按下的键,就会在本机LED上显示出来。
3、若想与标准的RS232设备通信,就要做电平转换,输出时要将TTL电平换成RS232电平,输入时要将RS232电平换成TTL电平。
可以将仿真板上的RXD、TXD信号接到实验板上的“用户串口接线”的相应RXD和TXD端,经过电平转换,通过“用户串口”接到外部的RS232设备。
可以用实验仪上的逻辑分析仪采样串口通信的波形五、程序框图六、源程序发射程序:org 0000hljmp mainorg 0023hljmp com_in ;串行口中断服务子程序入口org 1000hmain: mov sp,#50h ;设置堆栈指针mov dptr,#7f00h ;81c55初始化mov a,#03hmovx @dptr,amov tmod,#20h ;设置定时器T1工作方式为方式2mov th1,#0f4h ;设置定时器T1计数初值mov tl1,#0f4hmov pcon,#80h ;波特率加倍setb tr1 ;打开定时器mov scon,#40h ;设置串行口工作方式为方式1,8位异步收发,波特率可变mov ie,#90h ;打开中断允许寄存器,采用中断方式发送数据clr ti ;关闭发送中断标志位T1loop: acall key1 ;调用读取键值子程序mov r0,a ;键值存入R0setb ti ;开发送中断标志位T1ljmp loopcom_in: clr ti ;关闭发送中断标志位T1mov sbuf,r0 ;发送数据retikey1: acall ks1 ;调用判定有无键闭合子程序jnz lk1 ;有键闭合,跳转lk1acall dir ;无键闭合,调用显示子程序ajmp key1lk1: acall dir ;可能有键闭合,延时24msacall diracall ks1 ;调用判定有无键闭合jnz lk2 ;经去抖动,判断有键闭合跳转lk2acall dir ;无键闭合,调用延时子程序ajmp key1lk2: mov r2,#0feh ;列选码送到R2mov r4,#00h ;r4为列号计数器lk4: mov dptr,#7f01h ;列选码送到PA口mov a,r2movx @dptr,amov dptr,#7f03Hmovx a,@dptr ;读PC口jb acc.0,lone ;0行线为高电平,无键闭合,跳转lone,转判1行mov a,#00h ;0行有键闭合,首键号0→Aajmp lkp ;跳转lkp,计算键号lone: jb acc.1,ltw0 ;1行线为高电平,无键闭合,跳转ltwo,转判2行mov a,#06h ;1行有键闭合,首键号8→Aajmp lkp ;跳转lkp,计算键号ltw0: jb acc.2,lthr ;2行线为高电平,无键闭合,跳转lthr,转判3行mov a,#12h ;2行有键闭合,首键号10H→Aajmp lkp ;跳转lkp,计算键号lthr: jb acc.3,next ;3行线为高电平,无键闭合,跳转next,准备下一列扫描mov a,#18h ;3行有键闭合,首键号18H→Alkp: add a,r4 ;计算键号,即行首键号+列号=键号push a ;键号进栈保护lk3: acall dir ;调用显示子程序,延时6msacall ks1 ;调用判定有无键闭合子程序,延时6msjnz lk3 ;判定键释放否,未释放,则循环pop a ;键已释放,键号出栈→Aretnext: inc r4 ;列计数器加1,为下一列扫描做准备mov a,r2 ;判定是否已扫到最后一列jnb acc.5,knd ;键扫描已到最后一列,跳转knd,重新扫描rl a ;键未扫到最后一列,位选码左移一位mov r2,a ;位选码→R2ajmp lk4knd: ajmp key1ks1: mov dptr,#7f01h ;判定有无键闭合子程序,全0→扫描口(PA口)mov a,#00h ;即列线全为低电平movx @dptr,amov dptr,#7f03h ;PC口地址movx a,@dptr ;从PC口读行线状态cpl a ;行线状态取反,如无键按下,则A中内容为0anl a,#0fh ;屏蔽无用的高四位ret接受程序:org 0000hljmp mainorg 0023hljmp com_inorg 1000hmain: mov sp,#50h ;设置堆栈指针mov 60h,#0 ;显示缓冲区初始化mov 61h,#0mov 62h,#0mov 63h,#0mov 64h,#0mov 65h,#0mov dptr,#7f00h ;81c55初始化mov a,#03hmovx @dptr,aacall dir ;调用显示子程序mov tmod,#20h ;设置定时器T1工作方式为方式2mov th1,#0f4h ;设置定时器T1计数初值mov tl1,#0f4hmov pcon,#80h ;波特率加倍setb tr1 ;打开定时器mov scon,#50h ;设置串行口工作方式为方式1,允许串行接受位REN置1 mov ie,#90h ;打开中断允许寄存器,采用中断方式发送数据com_in: clr ri ;接收中断标志位清0mov a,sbuf ;接收数据retiloop: mov r1,a ;键值转换为显示数据mov r0,#0f0hmov a,r1anl a,r0mov 61h,a ;61h对应的数码管显示大于16的数mov r2,#0fhmov a,r1anl a,r2mov 60h,a ;60h对应的数码管显示小于16的数acall dirhere: sjmp $dir: mov r0,#60h ;置缓冲器指针初值mov r3,#01h ;位选码的初值送R3mov a,r3ld0: mov dptr,#7f01h ;位选码→PA口movx @dptr,ainc dptr ;指向PB口mov a,@r0 ;显示数据送到Aadd a,#0dh ;加偏移量movc a,@a+pc ;根据显示数据来查表取段码movx @dptr,a ;段码→PB口acall delay ;延时1ms,即该位显示1msinc r0 ;显示数据缓冲区指针指向下一个数据单元mov a,r3 ;位选码送入A中jb acc.5,ld1 ;判断是否扫描到最右边的LED,如到,则返回rl a ;位选码向左移一位,准备让显示位右边的下一位LED亮mov r3,a ;位选码送r3中保存ajmp ld0ld1: rettab: db 3fh,06h,5bh,4fh,66h,6dh ;共阴极LED段码表db 7dh,07h,7fh,6fh,77h,7chdb 39h,5eh,79h,71h,73h,3ehdb 31h,6eh,1ch,23h,40h,03hdb 18h,00hdelay: mov r7,#02h ;延时1ms子程序D1: mov r6,#0FFHD2: djnz r6,D2djnz r7,D1ret七、实验小结单片机实验报告姓名:毛幸林班级:2010138学号:201013803专业:电子信息工程。
单片机串口通信原理

单片机串口通信原理一、引言单片机串口通信是一种常见的通信方式,它通过串口将单片机与其他设备进行数据交换。
本文将介绍单片机串口通信的原理、工作方式以及相关的应用。
二、单片机串口通信原理单片机串口通信是通过串行通信接口实现的。
串口通信使用两根信号线进行数据传输,分别是发送线(TXD)和接收线(RXD)。
发送端将要传输的数据按照一定的规则转换为电信号,通过发送线发送出去;接收端则将接收到的电信号转换为数据,通过接收线接收。
在单片机串口通信中,数据的传输是按照一定的帧格式进行的。
典型的帧格式包括起始位、数据位、校验位和停止位。
起始位用来表示数据传输的开始,通常为逻辑低电平;数据位用来存储要传输的数据,通常为8位;校验位用来检测数据传输的正确性,可以用于纠错;停止位用来表示数据传输的结束,通常为逻辑高电平。
三、单片机串口通信工作方式单片机串口通信有两种工作方式,分别是同步方式和异步方式。
1. 同步方式同步方式的特点是发送端和接收端的时钟信号保持同步。
发送端和接收端需要在通信之前约定好时钟信号的频率和相位,以确保数据的传输速度和稳定性。
同步方式的优点是传输速度快且稳定,但需要更复杂的硬件支持。
2. 异步方式异步方式的特点是发送端和接收端的时钟信号不同步。
发送端和接收端之间不需要约定时钟信号,而是通过起始位和停止位来进行数据的同步。
异步方式的优点是硬件要求简单,适用于大多数场景。
四、单片机串口通信应用单片机串口通信广泛应用于各种领域,例如智能家居、工业自动化、医疗设备等。
通过串口通信,单片机可以与各种传感器、执行器、显示器等设备进行数据交换,实现各种功能。
1. 智能家居在智能家居系统中,单片机可以通过串口与各种传感器连接,如温度传感器、湿度传感器、烟雾传感器等。
通过串口通信,单片机可以读取传感器的数据,并根据数据进行相应的控制,如控制空调、灯光等。
2. 工业自动化在工业自动化领域,单片机串口通信被广泛应用于PLC(可编程逻辑控制器)和人机界面(HMI)之间的数据交换。
单片机串口应用实验报告

单片机串口应用实验报告实验名称:单片机串口应用实验报告实验目的:1. 了解单片机串口通信的原理和应用;2. 掌握单片机串口通信的编程方法;3. 实现单片机与计算机之间的数据传输。
实验器材:1. 单片机开发板(如STC89C52);2. 串口数据线;3. 计算机。
实验原理:单片机的串口通信是通过串行通信接口实现的,其中包括发送数据和接收数据两个部分。
串口通信的原理是将数据按照一定的格式进行传输,其中包括起始位、数据位、校验位和停止位。
计算机与单片机之间通过串口数据线连接,通过发送和接收数据来实现双向通信。
实验步骤:1. 连接单片机开发板和计算机,将串口数据线的一端连接到单片机的串口接口,另一端连接到计算机的串口接口或USB转串口适配器。
2. 打开单片机开发环境,创建一个新的工程。
3. 在工程中编写程序,实现单片机与计算机之间的数据传输。
可以使用C语言编程,通过串口发送和接收函数来实现数据的发送和接收。
4. 在程序中设置单片机的串口通信参数,包括波特率、数据位、校验位和停止位等。
5. 编译并下载程序到单片机开发板中。
6. 打开计算机上的串口调试助手软件,设置串口参数与单片机一致。
7. 在串口调试助手软件中发送数据,观察单片机是否能够接收到数据,并通过串口发送数据给计算机。
8. 在单片机程序中添加相应的处理逻辑,实现对接收到的数据的处理和回复。
实验结果:通过串口调试助手软件发送数据,单片机能够正确接收并处理数据,并通过串口发送数据给计算机。
实验结果符合预期。
实验总结:通过本次实验,我了解了单片机串口通信的原理和应用,掌握了单片机串口通信的编程方法。
通过实验,我成功实现了单片机与计算机之间的数据传输,并能够对接收到的数据进行处理和回复。
这对于实际应用中的数据传输和通信具有重要意义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七串口通信实验【实验目的】1、理解单片机串行口的工作原理;2、学习使用单片机的TXD、RXD口;3、学习PC机的串口通讯原理。
【实验内容】任务:1.单片机与电脑串口通讯,将单片机与电脑相连,借助串口调试助手,单片机发送“Everything is possible ^_^”。
2.串口调试助手中输入“turnonled1”、“turnonled2”、“turnonled3”中一个,相应的led点亮,单片机再发送“Turn on LED1 has been executed!”消息提示输入下一个需要点亮的灯。
通讯波特率:9600bps,信息格式:无校验位+8个数据位+1个停止位,传送方式,单片机采用中断方式接收信息。
原理:SM0、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 中,并产生中断请求。
在方式0时,SM2必须为0。
REN:允许串行接收控制位。
若REN=0,则禁止接收;REN=1,则允许接收,该位由软件置位或复位。
TB8:发送数据D8位。
在方式2和方式3时,TB8为所要发送的第9位数据。
在多机通信中,以TB8位的状态表示主机发送的是地址还是数据:TB8=0为数据,TB8=1为地址;也可用作数据的奇偶校验位。
该位由软件置位或复位。
RB8:接收数据D8位。
在方式2和方式3时,接收到的第9位数据,可作为奇偶校验位或地址帧或数据帧的标志。
方式1时,若SM2=0,则RB8是接收到的停止位。
在方式0时,不使用RB8位。
TI:发送中断标志位。
在方式0时,当发送数据第8位结束后,或在其它方式发送停止位后,由内部硬件使TI置位,向CPU请求中断。
CPU在响应中断后,必须用软件清零。
此外,TI也可供查询使用。
RI:接收中断标志位。
在方式0时,当接收数据的第8位结束后,或在其它方式接收到停止位的中间由内部硬件使RI置位,向CPU请求中断。
同样,在CPU 响应中断后,也必须用软件清零。
RI也可供查询使用。
倍。
其余各位与串行口无关。
波特率设置:串行口的4种工作方式对应着三种波特率模式。
对于方式0,波特率是固定的,为fosc/12。
对于方式2,波特率由振荡频率fosc和SMOD(PCON.7)所决定。
其对应公式为波特率=2SMOD×fosc/64。
当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为fosc/32。
对于方式1和方式3,波特率由定时器/计数器T1的溢出率和SMOD决定,即由下式确定:波特率=2SMOD×定时器/计数器T1溢出率/32鉴于8051单片机输入、输出电平均为TTL/CMOS电平,而计算机配置的是RS232标准串行接口,使用的是RS232标准电平(逻辑0:+3V~+15V,逻辑1:约-3V~-15V),二者的电气规范不一致,因此要完成PC机与单片机的数据通讯,必须进行电平转换。
实验参考程序:一、任务11.main.c程序/************************************************************************* 程序名称:串口发送数据(晶振频率18.432MHz)功能说明: 通过串口1发送“Everything is possible!”波特率9600,数据位8,奇偶效验无,停止位1,数据流控制无************************************************************************/ #include "iap15w4k58s4.h"#include <intrins.h> // 加入此头文件后,可使用_nop_库函数#include "delay.h" // 延时函数头文件#include "uart.h" // 串行通信函数头文件//======================================================================== // 函数: void SYS_Init(void)// 描述: 单片机端口初始化//======================================================================== void SYS_Init(){P0M0=0x20;P0M1=0x20;P1M0=0x3C;P1M1=0x3C;P2M0=0x00;P2M1=0x00;P3M0=0x00;P3M1=0x00;P4M0=0x00;P4M1=0x00;P5M0=0x00;P5M1=0x00;}//======================================================================== // 函数: void main(void)// 描述: 主函数//======================================================================== void main() // 主函数{SYS_Init();DelayMS(100);UartInit(); // 初始化串口DelayUS(100);while (1) // 主循环{DelayMS(2000);// 延时2秒SendString("Everything is possible ^_^\r\n"); // 发送字符串 }}2. uart.c程序/************************************************************************* 程序名称:串口1通讯函数(晶振频率18.432MHz)功能说明: 串口1初始化,字符发送与字符串发送函数,波特率9600bps**********************************************************************/ #include "iap15w4k58s4.h"#include "intrins.h"void SendData(unsigned char ch);void SendString(char *s);void UartInit(void);/*----------------------------串口初始化----------------------------*/void UartInit(void) //9600bps@18.432MHz{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xC4; //设定定时初值TH1 = 0xC4; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1}/*----------------------------发送串口数据----------------------------*/void SendData(unsigned char ch){SBUF = ch; //写数据到UART数据寄存器while(TI == 0);TI = 0;}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s) //检测字符串结束标志{SendData(*s++); //发送当前字符}}3.uart.h程序#ifndef __UART_H_#define __UART_H_void SendData(unsigned char ch);void SendString(char *s);void UartInit(void);#endif4.delay.c程序/****************************************************************程序名称:延时函数(晶振频率18.432MHz)功能说明: 延时毫秒与微秒******************************************************************/#include "iap15w4k58s4.h" // 单片机STC15F2K60S2头文件,可以不再加入reg51.h #include <intrins.h> // 加入此头文件后,可使用_nop_库函数#include <stdio.h>void Delay1us() //@18.432MHz{unsigned char i;i = 2;while (--i);}void Delay1ms() //@18.432MHz{unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i);}void DelayMS(int t){while(t--){Delay1ms();}}void DelayUS(int t){while(t--){Delay1us();}}5.delay.c 程序#ifndef __DELAY_H_#define __DELAY_H_void DelayUS(int t);void DelayMS(int t);#endif二、任务2 扩展部分程序串口1中断控制,串口控制单片机上的三只LED灯的开启和关闭,串口1收到数据,如果数据为“turnonled1"、"turnonled2"、"turnonled3"对应LED点亮2秒后,再熄灭。
(上一工程的主程序换成如下程序)Main.c/************************程序名称:串口1中断控制测试(晶振频率18.432MHz)功能说明: 串口1收到数据,如果数据为“turnonled1"、"turnonled2"、"turnonled3"对应LED点亮2秒后,再熄灭。