单片机 串行口通信实验_第1页
单片机 串行口通信实验_第2页
单片机 串行口通信实验_第3页
单片机 串行口通信实验_第4页
单片机 串行口通信实验_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三串行口通信实验一、实验内容 据图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),判断完后要清除标志。 发送数据和接收数据函数voidsend(uchardat){ ACC=dat; TB8=P; //将奇偶校验位作为第9位数据发送,采用偶校验 SBUF=ACC; }ucharreceive(){ ACC=SBUF; //将接收缓冲器的数据存于ACC if(RB8==P){ //只有奇偶校验成功才能往下执行,接收数据 returnACC; //返回接收缓冲器的数据 }else{ return0x00; } }主要算法1(单向通信和双向通信实验项目合一):1、全局变量的定义:uchara; //记录发送数据ucharb; //记录接收数据2、外部中断0键控函数(用来发送数据给甲机):voidkeyControl()interrupt0{ if(INT0==0) { //K1键按下,a=0x01 if(K1==0){ a=0x01*16; } //K2键按下,a=0x02 if(K2==0){ a=0x02*16; } //K3键按下,a=0x04 if(K3==0){ a=0x04*16; } //K4键按下,a=0x08 if(K4==0){ a=0x08*16; } } TI=1;}3、串行口中断函数:voidES_int()interrupt4{ //串行口中断函数 if(RI){ RI=0; b=receive(); } if(TI){ TI=0; send(a); } }主要算法2(间隔发送):1、全局变量的定义:uchara; //发送数据intsend_time=0; //记录发送的次数ucharb; //接收数据intreceive_time=0; //记录接收的次数ucharc[3]; //判断接收值是否相同2、串行口中断函数:voidES_int()interrupt4{ //串行口中断函数 if(RI){//接收中断 RI=0; if(receive_time==1){ if(receive()==0xff){//判断第一次接收的数据是否为0xff,是继续接收后面的三个数据,否重新接收第一个数据 receive_time++; }else{receive_time=1;} }elseif(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); }elseif(send_time>=2&&send_time<=4){send(a);} if(send_time==4)//发送成功显示LED light(~(a|b));send_time++; } }2、实验原理图图2-1实验原理图3、程序流程图图2-2双向通信程序流程图图2-3间隔发送程序流程图三、源程序双向通信程序源代码:#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint//#defineTH(a)(65536-a)/256 //定义装入定时器高8位的时间常数//#defineTL(a)(65536-a)%256 //定义装入定时器低8位的时间常数sbitp=PSW^0;sbitK1=P2^0; sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;uchara; //记录发送数据ucharb; //记录接收数据voidlight(uchardat){ //亮灯函数 P0=dat; }voidsend(uchardat){ ACC=dat; TB8=P; //将奇偶校验位作为第9位数据发送,采用偶校验 SBUF=ACC; }ucharreceive(){ ACC=SBUF; //将接收缓冲器的数据存于ACC if(RB8==P){ //只有奇偶校验成功才能往下执行,接收数据 returnACC; //返回接收缓冲器的数据 }else{ return0x00; } }voidmain(){ 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; //启动定时器T1 while(1){ light(~(a|b)); //将发送数据和接收数据相或后取反显示 }}voidES_int()interrupt4{ //串行口中断函数 if(RI){ RI=0; b=receive(); } if(TI){ TI=0; send(a); } }voidkeyControl()interrupt0{ if(INT0==0) { //K1键按下,a=0x01 if(K1==0){ a=0x01*16; } //K2键按下,a=0x02 if(K2==0){ a=0x02*16; } //K3键按下,a=0x04 if(K3==0){ a=0x04*16; } //K4键按下,a=0x08 if(K4==0){ a=0x08*16; } } TI=1;}间隔发送程序源代码:#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineTH(a)(65536-a)/256 //定义装入定时器高8位的时间常数#defineTL(a)(65536-a)%256 //定义装入定时器低8位的时间常数sbitp=PSW^0;sbitK1=P2^0;sbitK2=P2^1;sbitK3=P2^2;sbitK4=P2^3;uchara; //发送数据intsend_time=0; //记录发送的次数ucharb; //接收数据intreceive_time=0; //记录接收的次数ucharc[3]; //判断接收值是否相同voidlight(uchardat){ //亮灯函数 P0=dat; }voidsend(uchardat){ ACC=dat; TB8=P; //将奇偶校验位作为第9位数据发送,采用偶校验 SBUF=ACC; }ucharreceive(){ ACC=SBUF; //将接收缓冲器的数据存于ACC if(RB8==P){ //只有奇偶校验成功才能往下执行,接收数据 returnACC; //返回接收缓冲器的数据 }else{ return0x00; } }voidmain(){ 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; //启动定时器T1 TH0=TH(50000);TL1=TL(50000);//给定时器T0赋初值,50ms TR0=1; //定时器T0初始为开启状态 while(1){ }}voidES_int()interrupt4{ //串行口中断函数 if(RI){//接收中断 RI=0; if(receive_time==1){ if(receive()==0xff){//判断第一次接收的数据是否为0xff,是继续接收后面的三个数据,否重新接收第一个数据 receive_time++; }else{ receive_time=1; } }elseif(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); }elseif(send_time>=2&&send_time<=4){ send(a); } if(send_time==4)//发送成功显示LED light(~(a|b)); send_time++; } }voidT0_int()interrupt1{ receive_time=1; RI=1; TH0=TH(50000);TL1=TL(50000); }voidkeyControl()interrupt0{ /*if(INT0==0) { //K1键按下,a=0x01 if(K1==0){ a=0x01*16; } //K2键按下,a=0x02 if(K2==0){ a=0x02*16; } //K3键按下,a=0x04 if(K3==0){ a=0x04*16; } //K4键按下,a=0x08 if(K4==0){ a=0x08*16; } }*/}四、实验结果单向通信及双向通信:1、开机即接收来自甲机发送的默认数据0x0f,取反通过LED输出(如图4-1)图4SEQ图\*ARABIC\s11接收甲机发送的默认数据2、接收到来自甲机的数据0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论