- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
测控仪器课程设计报告书
题目:双机通信的设计
双机通讯
设计目的
基于单片机实现双机通信
设计要求
单片机要发送信息到另外一个单片机,另外一个单片机要反馈信息给发送者。实现两个单片机的通信。
三、设计器材
STC89C52芯片(2个)
LED七段显示数码管(2个)
晶振(2个)
发光二极管(4个)
复位开关(2个)
5V电源(1个)
导线(若干)
四、设计方案及分析
主机发送从机接收方式的主机工作流程:
主机设置数据传送方法控制位DIR位0,以表示主机有数据发送到从机;
主机STB端口产生一个负脉冲,以使从机进入中断,并准备接收数据;
主机将数据送8位数据端口,再设定ACK信号表示数据有效:
主机检查CHK端口,等待从机8位端口取走数据;
数据发送完成返回。
主机接收从机发送方式的主机工作流程:
进入中断服务程序;
检查数据传送的方向
如果DIR为0.。则等待CHK信号有效,再从8位端读取数据,读完后设定ACK信号有效
如果DIR为1,从机将数据送到8位端上,再设定ACK 位有喜爱哦,并等待主机取走数据(即CHK信号有效);
推出中断服务程序。
程序:
#include reg52.h
#define unchar unsigned char
#define unint unsigned int
sbit Key = P1^1;
sbit Led = P1^0;
unchar code SEG7[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x02,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unchar temp = 0;
unchar count = 0;
void Uartsend(unchar k) //串口发送子函数
{
SBUF = k;
while(!TI); //待待发送结束
TI=0; //添加发送中断(仿真时不需要)
}
void delay(int t){
int n,m;
for (n=t;n0;n--){}
for (m=t;m0;m--){}
}
void main()
{
Led = 1;
TMOD = 0x20; //定时器1工作方式2
TH1 = 0xfa;
TL1 = 0xfa; //装入定时器初值11.0592M晶振,波特率4800
PCON = 0; //波特率不倍增
ET1 = 0; //定时器1中断允许
EA = 1; //总中断允许
ES = 1; //串口中断允许
TR1 = 1; //定时器0开始计时
SCON = 0x50; //串口工作方工1,准备接收
while(1) //死循环
{
if(!Key) //判断是否有键按下
delay(50);
while(!Key)
{
Led = 0;
count += 1;
//delay(100);
Uartsend(count);//用串口发送0xaa
while(!Key);//等待键释放
delay(20);
while(!Key);//等待键释放
}
Led = 1;
if(count == 15) count = 0;
P0 = SEG7[temp];
}
}
void uart() interrupt 4
{
EA=0;
if(RI) //判断是否为接收中断
{
temp = SBUF; //读数据
if(temp != count)
Uartsend(temp);
count = temp;
RI = 0; //清除中断标志
}
TI = 0; //清除中断标志
EA=1;
}
仿真图:
五、问题分析与解决方法
仿真没有问题,但焊好板子后,所实现的功能并非预期的结果。因为仿真正确,所以我们认为应该是板子焊接的问题,但经过再三检测,发现板子焊接完全没有问题。问题究竟在哪,一时我们没有找出来。最后请教别人后,从硬件开始入手,用万用表全部检测了两遍,板子没问题。接着只能推出是软件,是程序的问题。仿真没问题的,可是那只是仿真。我们仔细研究了一下程序,对串口通信,主要从RI,TI串口中断入手,发现程序处理太快,出现了死循环。我们就加了延时进去。但是还是没有解决,延时有了,还是会进入到死区的。请了一位大四的学长,又研究了一下,最后我们把问题归结到串口那两个终端上。最后经过检查,发现在等待
文档评论(0)