- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多机通信系统
一.引言
随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集和数据处理方面,有着成本低,能满足一般要求,开发周期短等优点,其在智能家居,计算机的网络通信与数据传输,工业控制自动化等方面有着广泛的应用。
在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正是为了满足这一要求而设置的。
二.工作原理:
(1)数据的传递
主机发送信息,可以传送到各个从机或指定从机,各从机发送的信息只能被主机接收。机通信(关键是地址帧的识别)
主机发送:地址帧、数据帧的鉴别是通过第9位数据确定:
TB8=1,地址帧
TB8=0,数据帧
机接收:
各从机串行口工作在方式2、方式3下; (b)多机通信标志SM2(SCON.5)=1;
检查接收到的第9位RB8(SCON.2),当:
RB8=1:地址帧,将地址装入SBUF,置位RI,发出接收中断请求;判断主机发送地址是否与本机相符,若相符,则将从机SM2清0(变成直通方式),准备接收其后传送来的数据。
RB8=0:数据帧,对SM2=1,RB8=0的从机,接收数据丢弃,而对SM2=0的从机:直通方式,不论RB8是0还是1,都将接受到的数据送SBUF,并发出中断请求。
多机通信的过程总结如下:
(1)全部从机串行口工作方式初始化为2或3,置位SM2,允许中断;
(2)主机置位TB8,发送要寻址的从机地址;
(3)所有的从机均接收主机发送的地址,进入中断进行地址比较;
(4)确认寻址从机,自身SM2清0,向主机返回地址供主机核对;
(5)主机核对无误,向被寻址从机发送发送命令,通知从机进行一对一数据通信。 #include reg51.h
#define uchar unsigned char
#define uint unsigned int
uchar leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};
uchar Mode;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
void UART_init()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0xd0;
ES = 1;
EX0 = 1;
IT0 = 1; //INT0下跳触发
EA = 1;
TI = 0;
}
void DelayMs(int ms)
{
uchar i;
while(ms--)
for(i=0; i120; i++);
}
void putc_to_SerialPort(uchar c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void MasterControl(unsigned char Addr, unsigned char Comd)
{
TB8 = 1;
putc_to_SerialPort(Addr);
DelayMs(50);
TB8 = 0;
putc_to_SerialPort(Comd);
DelayMs(50);
}
Ex0_int(void) interrupt 0
{
while(P1==0xff);
if(P1==0xdf)
Mode=0;
else if(P1==0xbf)
Mode=1;
else
Mode=2;
P0 = leddata[Mode];
P20 = 0;
if(Mode == 0)
{ P2 = leddata[10];
P10 = 0;
P11 = 0;
DelayMs(500);
P10 = 1;
P11 = 1;
DelayMs(500);
P10 = 0;
P11 = 0;
DelayMs(500);
P10 = 1;
P11 = 1;
DelayMs(5
文档评论(0)