8用串行口扩展并行输出口

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CHANGZHOU INSTITUTE OF TECHNOLOGY 单片机实践报告

题目:单片机双机通讯

学院:延陵学院

班级:10电Y3

姓名:赵静

学号:10124536

一、实验目的

1、掌握89C51单片机异步串行口的通信原理和编程

2、掌握串行口工作方式1的使用及其波特率的计算

二、实验电路

元器件编号元器件名称说明U1、U3 AT89C52 AT89C52单片机

U2、U4 74HC245 8位总线驱动器

7SEG-BCD 7段BCD数码管显示器

四、实验内容及调试

串行口设为工作方式1,其中一个单片机为发送方,另外一个单片机为接收方。发送数据块大小为10字节,存放在发送方单片机内部RAM 的50H~59H 中,通过发送方单片机的串行口发出,再通过接收方单片机接收。接收的数据块存放到接收方单片机内部RAM 的60H~69H 中。实验中数据传输通过程序查询控制,查询数据有否已发送或已收到。发送数据之前,发送方单片机持续发送联络信号AAH 给接收的单片机,收到接收单片机的应答信号才开始发送数据块。发送和接收数据均传送到各自P2口的7SEG-BCD 数码管显示器上显示。

/*在P2口显示启动信号AA,回答信号BB,发送数据*/

#include

#include

#include

#include

#include

#include

#define byte unsigned char

#define uchar unsigned char

#define word unsigned int

#define uint unsigned int

#define ulong unsigned long

#define BYTE unsigned char

#define WORD unsigned int

#define TRUE 1

#define FALSE 0

sbit SEND_RECI_CTRL=P1^0; //SEND_RECI_LINE=1设置发送,=0设置接收

void initUart(void); //初始化串行口波特率,使用定时器2 void send(uchar idata *d); //发送函数

void receive(uchar idata *d); //接收函数

void initUart(void); //初始化串行口

void time(unsigned int ucMs); //延时单位:ms

uchar idata sbuf [10] _at_ 0x50; //发送内容

uchar idata rbuf [10] _at_ 0x60; //接收缓冲区

/**************** main c*************/

void main(void){

initUart(); //初始化串行口

time(10); //延时等待外围器件完成复位

if(SEND_RECI_CTRL){ //如果发送标志有效则初始化发送数组数据

uchar i;

for(i=0;i<10;i++){

sbuf[i]=0x20+i;

}

}

if(SEND_RECI_CTRL){ //发送

send(sbuf);

}

else{ //接收

receive(rbuf);

}

while(TRUE){}

}

/**********初始化串行口波特率********/

void initUart(void)

{

SCON=0x50; //串行口工作在方式1下TMOD=0x20;

PCON=0x0;

TH1=0xfd;

TCON=0x40; }

void send(uchar idata *d) //发送函数

{

uchar i;

do{

P2=0xaa;

SBUF=0xaa; //发送联络信号

while(TI==0){}TI=0;

while(RI==0){}RI=0;

}while((SBUF^0xbb)!=0); //乙机未准备好,继续联络P2=SBUF;time(500);

/*发送0x20,0x21....0x29*/

for(i=0;i<10;i++) {

P2=d[i]; time(500);

SBUF=d[i]; //发送一个数据

while(TI==0){}TI=0;

}

}

void receive(uchar idata *d) //接收函数

{

uchar i;

do{

while(RI==0){}RI=0;

P2=SBUF; time(500);

}while((SBUF^0xaa)!=0); //判断甲机请求否

P2=0xbb;time(500);

SBUF=0xbb; //发应答信号

while(TI==0){}TI=0;

while(1){

for(i=0;i<10;i++){

while(RI==0){}RI=0;

d[i]=SBUF; //接收一个数据

P2=d[i]; //显示数据

}

}

}

void delay_5us(void) //延时5us,晶振改变时只改变这一个函数{

_nop_();

_nop_();

//_nop_();

// _nop_();

}

/*delay_50us*/

void delay_50us(void) //延时50us

{

unsigned char i;

for(i=0;i<4;i++)

{

delay_5us();

}

}

/******************延时100us********************/

void delay_100us(void) //延时100us

{

delay_50us();

delay_50us();

}

/*延时单位:ms*/

void time(unsigned int ucMs)

{

unsigned char j;

while(ucMs>0)

{

for(j=0;j<10;j++)

delay_100us();

ucMs--;

}

}

相关文档
最新文档