8用串行口扩展并行输出口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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--;
}
}