基于51单片机的多机通信系统设计
- 格式:doc
- 大小:239.50 KB
- 文档页数:13
mcs51串行多机通讯的工作原理以mcs51串行多机通讯的工作原理为标题,我们来探讨一下其详细内容。
让我们了解一下什么是mcs51。
MCS-51是英特尔公司(Intel)开发的一款8位单片机系列,它广泛应用于各种嵌入式系统中。
MCS-51具有丰富的外设接口和强大的功能,因此被广泛应用于各种应用领域,包括串行多机通讯。
串行多机通讯是指在多台计算机之间通过串行通讯接口进行数据传输和通信。
在mcs51系列单片机中,串行多机通讯是通过UART (通用异步收发传输器)来实现的。
UART是一种串行通讯接口,它可以将并行数据转换为串行数据进行传输,并将接收到的串行数据转换为并行数据。
在mcs51中,串行多机通讯的工作原理如下:1. 首先,需要配置UART的工作模式。
mcs51系列单片机通常具有多个UART接口,每个接口都有自己的控制寄存器和数据寄存器。
通过配置这些寄存器的值,可以设置UART的工作模式、波特率和其他参数。
2. 在发送数据之前,首先需要将要发送的数据存储在数据寄存器中。
mcs51通过写入数据寄存器来发送数据。
当数据写入数据寄存器后,UART将自动将其转换为串行数据,并通过串行通讯线路发送出去。
3. 接收数据时,mcs51将从串行通讯线路接收到的串行数据存储在数据寄存器中。
通过读取数据寄存器,可以获取接收到的数据。
当数据被读取后,数据寄存器将被清空,以接收下一次接收到的数据。
4. 在串行多机通讯中,需要为每个参与通讯的设备分配唯一的地址。
通过地址,可以确定数据的发送和接收方。
在mcs51中,地址通常通过配置UART的控制寄存器来实现。
通过设置控制寄存器的地址位,可以选择发送或接收特定地址的数据。
5. 数据的传输可以是单向的,也可以是双向的。
对于单向传输,一台设备将数据发送到另一台设备,而另一台设备只负责接收数据。
对于双向传输,两台设备既可以发送数据,也可以接收数据。
在mcs51中,可以通过配置UART的工作模式来选择单向传输还是双向传输。
51单片机双机串行通信设计51单片机是一款广泛应用于嵌入式系统中的微控制器,具有高性能和低功耗的特点。
在一些场景中,需要使用51单片机之间进行双机串行通信,以实现数据传输和协同工作。
本文将介绍51单片机双机串行通信的设计,包括硬件连接和软件编程。
一、硬件连接1.串行通信口选择:51单片机具有多个串行通信口,如UART、SPI 和I2C等。
在双机串行通信中,可以选择其中一个串行通信口作为数据传输的接口。
一般来说,UART是最常用的串行通信口之一,因为它的硬件接口简单且易于使用。
2.引脚连接:选定UART口作为串行通信口后,需要将两个单片机之间的TX(发送)和RX(接收)引脚相连。
具体的引脚连接方式取决于所使用的单片机和外设,但一般原则上是将两个单片机的TX和RX引脚交叉连接。
二、软件编程1.串行通信初始化:首先需要通过软件编程来初始化串行通信口。
在51单片机中,可以通过设置相应的寄存器来配置波特率和其他参数。
具体的初始化代码可以使用C语言编写,并根据所使用的开发工具进行相应的配置。
2.发送数据:发送数据时,可以通过写入相应的寄存器来传输数据。
在51单片机中,通过将数据写入UART的发送寄存器,即可将数据发送出去。
发送数据的代码通常包括以下几个步骤:(1)设置发送寄存器;(2)等待数据发送完成;(3)清除数据发送完成标志位。
3.接收数据:接收数据时,需要通过读取相应的寄存器来获取接收到的数据。
在51单片机中,可以通过读取UART的接收寄存器,即可获取到接收到的数据。
接收数据的代码通常包括以下几个步骤:(1)等待数据接收完成;(2)读取接收寄存器中的数据;(3)清除数据接收完成标志位。
4.数据处理:接收到数据后,可以进行相应的数据处理。
根据具体的应用场景,可以对接收到的数据进行解析、计算或其他操作。
数据处理的代码可以根据具体的需求进行编写。
5.中断服务程序:在双机串行通信中,使用中断可以提高通信的效率。
一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON 寄存器的SM2位来实现。
当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。
在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
二、多机通信电路图此处,U1作为主机,U2为从机1,U3为从机2。
三、C语言程序(1)主机程序#include<reg51.h>#include<string.h>#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;//延时1ms函数void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化void Buff_init(){unsigned char i; //将Table里的数据放到缓冲区里for(i=0;i<9;i++){Buff[i]= Table[i];delay_1ms(100);}}//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//发送数据函数void SEND_data(unsigned char *Buff){unsigned char i;unsigned char lenth;unsigned char check;lenth=strlen(Buff); //计算数据长度check=lenth;TI=0; //发送数据长度TB8=0; //发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i<lenth;i++) //发送数据{check=check^Buff[i];TB8=0;SBUF=Buff[i];while(!TI);TI=0;}TB8=0; //发送校验字节SBUF=check;while(!TI);TI=0;}//向指定从机地址发送数据void ADDR_data(unsigned addr){while(temp!=addr) //主机等待从机返回其地址作为应答信号{TI=0; //发送从机地址TB8=1; //发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}temp=_ERR_; //主机等待从机数据接收成功信号while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}}}(2)从机1程序#include<reg51.h>#include<string.h>#define addr 0x01//从机1的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff) {unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己的地址作为应答,等待接收数据 TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1]; //查看接收到的数据}}(3)从机2程序#include<reg51.h>#include<string.h>#define addr 0x02//从机2的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2]; //查看接收到的数据}}。
51单片机的多机通信原理1. 什么是51单片机的多机通信?51单片机的多机通信是指在多个51单片机之间进行数据传输和通信的过程。
通过多机通信,可以实现不同单片机之间的数据共享和协作,从而实现更加复杂的功能。
2. 多机通信的原理是什么?多机通信的原理是通过串口进行数据传输。
在多个单片机之间,可以通过串口进行数据的发送和接收。
通过定义好的协议,可以实现数据的传输和解析,从而实现多机之间的通信。
3. 多机通信的步骤是什么?多机通信的步骤包括以下几个方面:(1)定义好通信协议:在多机通信之前,需要定义好通信协议,包括数据的格式、传输方式等。
(2)设置串口参数:在单片机中,需要设置好串口的参数,包括波特率、数据位、停止位等。
(3)发送数据:在发送数据之前,需要将数据按照协议进行格式化,然后通过串口发送出去。
(4)接收数据:在接收数据之前,需要设置好串口的中断,然后在中断中接收数据,并按照协议进行解析。
(5)处理数据:在接收到数据之后,需要对数据进行处理,包括数据的存储、显示等。
4. 多机通信的应用场景有哪些?多机通信的应用场景非常广泛,包括以下几个方面:(1)智能家居系统:通过多机通信,可以实现智能家居系统中不同设备之间的数据共享和协作。
(2)工业控制系统:在工业控制系统中,多机通信可以实现不同设备之间的数据传输和控制。
(3)智能交通系统:在智能交通系统中,多机通信可以实现不同设备之间的数据共享和协作,从而实现更加智能化的交通管理。
(4)机器人控制系统:在机器人控制系统中,多机通信可以实现不同机器人之间的数据传输和控制,从而实现更加复杂的任务。
5. 多机通信的优缺点是什么?多机通信的优点包括以下几个方面:(1)实现数据共享和协作:通过多机通信,可以实现不同设备之间的数据共享和协作,从而实现更加复杂的功能。
(2)提高系统的可靠性:通过多机通信,可以实现数据的备份和冗余,从而提高系统的可靠性。
(3)提高系统的扩展性:通过多机通信,可以实现系统的模块化设计,从而提高系统的扩展性。
基于51的MODBUS-RTU多机通信实验环境:Proteus编程语言:汇编编程环境:KEIL单片机: AT89C51,AT89C52晶振:11.0592MHz功能说明:本实验运用了MODBUS-RTU通信协议的功能码03多寄存器读和功能码10多寄存器写,其中主机首先通过03功能码读取1号从机的时,分和秒的值,并将它们用液晶LCD显示器显示出来。
然后利用10功能将读取的值送入2号从机,2号从机在接收到主机送来的数据后再将它们以与1号从机相同的方式显示出来。
为1号从机设置了按钮,可调节它的时间,同是主机和2号从机也随之显示相同的时间。
图示:部分程序源代码:1、主机ORG 000HLJMP MAINORG 000BHLJMP TMR0ORG 0023HLJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JB FLAG2.7,TXWORKJB UFLAG.7,RXWORK;AJMP HERETXWORK: AJMP TXWORK1RXWORK: CLR UFLAG.7;**********接收完成,显示操作JB UFLAG.3,RXWMB03RXWMB10: JNB UFLAG.5,HEREAJMP RXMBW101RXWMB03: CLR UFLAG.3MOV R0,#HOUR1MOV A,CND3CLR CRRC AMOV R7,AMOV R1,#CND5 RWORK1: MOV A,@R1MOV @R0,AINC R1INC R1INC R0DJNZ R7,RWORK1MOV DSPC,#8 TIMDIS: MOV A,DSPCMOV DPTR,#DISTBMOVC A,@A+DPTRMOV LCDD,AACALL LCDWPMOV A,#HOUR1ADD A,DSPCMOV R1,AMOV A,@R1MOV B,#10DIV ABACALL DISPMOV A,BACALL DISPDEC DSPCJNB DSPC.7,TIMDIS CLR RENSETB URDMOV CND1,#0A1H MOV CND2,#10H MOV CND3,#0MOV CND4,#50H MOV CND5,#0MOV CND6,#3MOV CND7,#6MOV CND8,#0MOV CND9,HOUR1 MOV CND10,#0 MOV CND11,MIN1 MOV CND12,#0 MOV CND13,SEC1MOV CND15,#0A5HMOV CNDT,#0MOV CNDT1,#15SETB TB8MOV SBUF,CND1AJMP HERE;******************************** RXMBW101: CLR UFLAG.5MOV CNDT,#0MOV CNDT1,#8AJMP HERE;************************************** TXWORK1:CLR FLAG2.7;1S定时CLR RENSETB URD/* MOV CND1,#30HMOV CND2,#31HMOV CND3,#32HMOV CND4,#33HMOV CND5,#34HMOV CND6,#35HMOV CND8,#37HMOV CND9,#38H*/MOV CND1,#0A0H;地址MOV CND2,#03H ;功能码MOV CND3,#0 ;起始地址2字节MOV CND4,#3BHMOV CND5,#0 ;数据长度MOV CND6,#3MOV CND7,#5AHMOV CND8,#0A5HMOV CNDT,#0MOV CNDT1,#8SETB TB8MOV SBUF,CND1AJMP HERE;*******************************DISTB: DB81H,84H,87H,0C1H,0C4H,0C7H,91H,94H,97H,0D1H,0D4H,0D 7H;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTMOV A,CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输TXSTP: SETB UFLAG.6;发送结束标志MOV CNDT,#0MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;********************TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0UOUT: POP ACCPOP PSWRETI;*************************RXINT: MOV RXDT,SBUFMOV A,CNDTCJNE A,#1,RXINT1MOV A,RXDTCJNE A,#03H,RXMD10MOV CNDT1,#5SETB UFLAG.3;MODBUS03功能AJMP RXSTOR;********************** RXMD10: CJNE A,#10H,RXERORMOV CNDT1,#8SETB UFLAG.5;MODBUS10功能AJMP RXSTOR;********************** RXINT1: JNB UFLAG.3,RXSTORCJNE A,#2,RXSTORMOV A,RXDTADD A,CNDT1MOV CNDT1,ARXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDT;CLR RIINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;发送来的数据变形与否的最简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16MOV CNTM_OV,#200RXEROR: MOV CNDT,#0AJMP UOUTRXOUT: MOV CNTM_OV,#200AJMP UOUT;****************************** DELA Y: MOV R2,#250DELA Y1: DJNZ R2,DELA Y1RET;***************************;**************定时器0中断处理程序TMR0: PUSH PSWPUSH ACCCLR RS1SETB RS0/*MOV A,CNTM_OVJZ TMR01DEC CNTM_OVMOV A,CNTM_OVJNZ TMR01CLR URDSETB REN*/TMR01: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100DJNZ TM0TS,RETIFMOV TM0TS,#10SETB FLAG2.7;***************** ;中断返回RETIF: CLR RS0POP ACCPOP PSWRETI;***********HD44780读写子程序BUSY: MOV P0,#0FFHCLR LCDRSSETB LCDRWSETB LCDEMOV BIT0,P0CLR LCDEJB BIT0.7,BUSYRETLCDWP: ACALL BUSYCLR LCDRSSJMP LCD1LCDWD: ACALL BUSYSETB LCDRSLCD1: CLR LCDRWSETB LCDEMOV P0,LCDDNOPCLR LCDESETB LCDRSRETLCDW: MOV A,@R0ACALL LCDWDINC R0DJNZ R2,LCDWRET;***************DISP: MOV DPTR,#TIMETBMOVC A,@A+DPTRMOV LCDD,AACALL LCDWDRETTIMETB: DB "0123456789:/abcd" ;****************初始化子程序INIT: MOV SP,#0EFHMOV R1,#TM0TCLR0: MOV @R1,#0INC R1CJNE R1,#FRAM_OV,CLR0LCDINT: MOV LCDD,#38H;LCD初始化子程序ACALL LCDWPMOV LCDD,#01HACALL LCDWPMOV LCDD,#06HACALL LCDWPMOV LCDD,#0CHACALL LCDWPMOV LCDD,#83HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#86HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0C3HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0C6HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#93HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#96HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0D3HACALL LCDWPMOV A,#10ACALL DISPMOV LCDD,#0D6HACALL LCDWPMOV A,#10ACALL DISP;***********************MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDH; SETB P3.0MOV SCON,#0D0H;串行工作方式3,9为数据传输MOV PCON,#00HSETB URDMOV CNDT,#0MOV CNDT1,#8MOV DSPC,#8MOV UFLAG,#0MOV FLAG2,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;*************************** END2、1号从机ORG 000HAJMP MAINORG 000BHAJMP TMR0ORG 0023HAJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JNB UFLAG.7,TIMDC HERE2: CLR UFLAG.7CLR RENSETB URDMOV A,CND6MOV R7,ACLR CRLC AMOV CND3,AADD A,#5MOV CNDT1,AMOV R0,CND4MOV R1,#CND4 MDBS03T:MOV @R1,#0INC R1MOV A,@R0MOV @R1,AINC R0INC R1DJNZ R7,MDBS03TMOV @R1,#5AHINC R1MOV @R1,#0A5HMOV CNDT,#0ACALL DELA YCLR TB8MOV SBUF,CND1TIMDC: JB FLAG2.7,KEYSCAN TIMEDC: MOV A,HOURMOV B,#10DIV ABJNZ TIMH1MOV DIS7,#11AJMP TIMH2;************************ TIMH1: MOV DIS7,ATIMH2: MOV DIS6,B TIMEM: MOV A,MINUTEMOV B,#10DIV ABMOV DIS4,AMOV DIS3,BTIMES: MOV A,SECONDMOV B,#10DIV ABMOV DIS1,AMOV DIS0,BAJMP HERE;*************************KEYSCAN:CLR FLAG2.7MOV A,P1ORL A,#0E0HMOV P1,ANOPNOPMOV A,P1ANL A,#0E0HXRL A,#0E0HJZ NKEYMOV KTEMP,AAJMP HERENKEY: JB KTEMP.KEY0,KSET JB KTEMP.KEY1,KADDJNB KTEMP.KEY2,KOUTAJMP KSUBKSET: JB FLAG2.0,KSET1SETB FLAG2.0AJMP KOUTKSET1: INC FLAG2SETB FLAG2.0JNB FLAG2.2,KOUTMOV FLAG2,#0 KOUT: MOV KTEMP,#0AJMP TIMEDCKADD: JNB FLAG2.0,KOUT MOV R0,#MINUTEJNB FLAG2.1,KADD1MOV R0,#HOURKADD1: INC @R0JB FLAG2.1,HOURACJNE @R0,#60,KOUT KADD2: MOV @R0,#0AJMP KOUTHOURA: CJNE @R0,#24,KOUT AJMP KADD2KSUB: JNB FLAG2.0,KOUTMOV R0,#MINUTEJNB FLAG2.1,KSUB1MOV R0,#HOURKSUB1: DEC @R0MOV A,@R0JNB ACC.7,KOUTJB FLAG2.1,KSUBH0MOV @R0,#59AJMP KOUTKSUBH0: MOV @R0,#23AJMP KOUT;****************定时器0中断处理TMR0: PUSH PSWPUSH ACCSETB RS0CLR RS1DJNZ TM0T,TIMEMOV TM0T,#20T0DIS: MOV P0,#0MOV A,P1ANL A,#0F8HORL A,DSPCMOV P1,AMOV A,#DIS0ADD A,DSPCMOV R0,AMOV A,@R0MOV DPTR,#LEDTBMOVC A,@A+DPTRMOV P0,ADEC DSPCJNB DSPC.7,TIMEMOV DSPC,#7;********************************************** TIME: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100SETB FLAG2.7DJNZ TM0TS,RETIFMOV TM0TS,#10INC SECONDMOV A,SECONDCJNE A,#60,TIMEHMOV SECOND,#00HINC MINUTEMOV A,MINUTECJNE A,#60,TIMEHMOV MINUTE,#00HINC HOURMOV A,HOURCJNE A,#24,TIMEHMOV HOUR,#00HTIMEH:RETIF: POP ACCPOP PSWRETI;*********************;***********七段共阴数码管LEDTB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H ;******************************/*TIMEH1: SETB URDSETB UFLAG.4MOV CND1,#0A0HMOV CND2,#10HMOV CND3,#0MOV CND4,#40HMOV CND5,#0MOV CND6,#3MOV CND7,#6MOV CND8,#0MOV CND9,HOURMOV CND11,MINUTEMOV CND12,0MOV CND13,SECONDMOV CND14,#5AHMOV CND15,#0A5HMOV CNDT,#0MOV CNDT1,#15SETB UFLAG.6CLR UFLAG.5AJMP RETIF;******************/;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输TXSTP: MOV CNDT,#0MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;********************TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0UOUT: POP ACCPOP PSWRETIRXAD: MOV A,RXDTCJNE A,#0A0H,RXERORCLR SM2AJMP RXSTORRXINT: MOV RXDT,SBUFJZ RXADCJNE A,#1,RXSTORMOV CNDT1,#8RXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDTINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;接收到的数据变形与否的简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16RXEROR: SETB SM2MOV CNDT,#0RXOUT: AJMP UOUT;***********************DELA Y: MOV R2,#250DELA Y1: DJNZ R2,DELA Y1RET;****************初始化子程序INIT: MOV SP,#5FHMOV R1,#DIS0MOV DSPC,#0CLR URDCLR0: MOV @R1,#0INC R1CJNE R1,#HOUR,CLR0MOV DSPC,#7MOV DIS2,#10MOV DIS5,#10MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDHMOV SCON,#0F0H;串行工作方式2,9为数据传输MOV PCON,#00HCLR URDMOV CNDT,#0MOV CNDT1,#8MOV UFLAG,#0MOV FLAG2,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;***************************END3、2号从机ORG 000HLJMP MAINORG 000BHLJMP TMR0ORG 0023HLJMP USARTORG 0040HMAIN: ACALL INITHERE: CLR RS0CLR RS1JB UFLAG.7,HERE2 AHERE: AJMP HEREHERE2: CLR RENCLR UFLAG.7;**********接收完成,显示操作MOV R0,CND4MOV R7,CND6MOV R1,#CND9HERE1: MOV A,@R1MOV @R0,AINC R1INC R1INC R0DJNZ R7,HERE1 TIMEDC: MOV A,HOURMOV B,#10DIV ABJNZ TIMH1MOV DIS7,#11AJMP TIMH2TIMH1: MOV DIS7,A TIMH2: MOV DIS6,B TIMEM: MOV A,MINMOV B,#10DIV ABMOV DIS4,AMOV DIS3,B TIMES: MOV A,SECMOV B,#10DIV ABMOV DIS1,AMOV DIS0,BSETB URD;从机接收指令后回复报文SECHO: MOV CND7,#5AHMOV CNDT,#0MOV CNDT1,#8CLR TB8MOV SBUF,CND1AJMP HERE;*******************************DISTB: DB81H,84H,87H,0C1H,0C4H,0C7H,91H,94H,97H,0D1H,0D4H,0D7H;*************USART: PUSH PSWPUSH ACCSETB RS0SETB RS1JBC RI,RXINT;发送中断,清中断标志位并转中断处理TXINT: CLR TIINC CNDTMOV A,CNDTCJNE A,CNDT1,TXGN;必须在发送前检测,若在后的话,则最后一个字节可能不能正确传输MOV CNDT1,#8CLR URDSETB RENAJMP UOUT;******************** TXGN: MOV A,#CND1ADD A,CNDTMOV R0,ACLR TB8MOV SBUF,@R0 UOUT: POP ACCPOP PSWRETIRXAD: MOV A,RXDTCJNE A,#0A1H,RXERORCLR SM2AJMP RXSTOR RXINT: MOV RXDT,SBUFMOV A,CNDTJZ RXADCJNE A,#1,RXINT1AJMP RXSTORRXINT1: CJNE A,#6,RXSTORMOV A,RXDTADD A,CNDT1MOV CNDT1,ARXSTOR: MOV A,#CND1ADD A,CNDTMOV R0,AMOV @R0,RXDTINC CNDTMOV A,CNDTCJNE A,CNDT1,RXOUTCRCCK: MOV A,@R0 ;接收到的数据变形与否的简单校验SWAP ADEC R0XRL A,@R0JNZ RXERORSETB UFLAG.7MOV CNDT1,#16RXEROR: SETB SM2RXOUT: AJMP UOUT;****************************** DELAY: MOV R2,#250DELAY1: DJNZ R2,DELAY1RET;***************************;**************定时器0中断处理程序TMR0: PUSH PSWPUSH ACCSETB RS0CLR RS1DJNZ TM0T,TIMEMOV TM0T,#20T0DIS: MOV P0,#0MOV A,P1ANL A,#0F8HORL A,DSPCMOV P1,AMOV A,#DIS0ADD A,DSPCMOV R0,AMOV DPTR,#LEDTBMOVC A,@A+DPTRMOV P0,ADEC DSPCJNB DSPC.7,TIMEMOV DSPC,#7;********************************************** TIME: DJNZ TM0T1,RETIFMOV TM0T1,#10 ;1msDJNZ TM0TB,RETIFMOV TM0TB,#100SETB FLAG2.7DJNZ TM0TS,RETIFMOV TM0TS,#10;***************** ;中断返回RETIF: CLR RS0POP ACCPOP PSWRETI;***********七段共阴数码管LEDTB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H ;****************初始化子程序INIT: MOV SP,#05FHCLR URDMOV R1,#TM0TCLR0: MOV @R1,#0INC R1CJNE R1,#RXDT,CLR0;***********************MOV TMOD,#22H;定时器0和1均工作于方式2,定时器1用于串口波特率MOV TH0, #0A3H;11.0592M,100usMOV TL0,#0A3HMOV TM0T,#1MOV TM0T1,#1MOV TM0TB,#5MOV TM0TS,#10;USART初始化MOV TH1,#0FDHMOV TL1,#0FDH; SETB P3.0MOV SCON,#0F0H;串行工作方式3,9位数据传输MOV PCON,#00HMOV CNDT,#0MOV CNDT1,#16MOV DSPC,#7MOV DIS2,#10MOV DIS5,#10MOV UFLAG,#0SETB TR0SETB ET0SETB TR1;运行定时器1,但不开中断SETB ES;开串行口中断SETB PSSETB EARET;***************************END。
51 单片机串口多机通信的实现和编程
一、51 单片机的主从模式,首先要设定工作方式3:(主从模式+波特率可变)
SCON 串口功能寄存器:SM0=1;SM1=1(工作方式3)
注:主机和从机都要为工作方式3。
【工作方式2 (SM0 SM1 :1 0):串行口为11 位异步通信接口。
发送或接收
一帧信息包括1 位起始位0、8 位数据位、1 位可编程位、1 位停止位1。
发
送数据:发送前,先根据通信协议由软件设置TB8 为奇偶校验位或数据标识位,然后将要发送的数据写入SBUF,即能启动发送器。
发送过程是由执行任何一条以SBUF 为目的寄存器的指令而启动的,把8 位数据装入SBUF,
同时还把TB8 装到发送移位寄存器的第9 位上,然后从TXD(P3.1)端口输出
一帧数据。
接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI 清0。
然后再根据SM2 的状态和所接收到的RB8 的状态决定此串行口在
信息到来后是否置R1=1,并申请中断,通知CPU 接收数据。
当SM2=0 时,
不管RB8 为0 还是为1,都置RI=1,此串行口将接收发送来的信息。
当
SM2=1 时,且RB8=1,表示在多机通信情况下,接收的信息为地址帧, 此时
置RI=1,串行口将接收发来的地址。
当SM2=1 时,且RB8=0,表示在多机通
信情况下,接收的信息为数据帧, 但不是发给本从机的,此时RI 不置为1,。
基于51单片机的多机通信系统设计多机通信系统是指通过一台主机与多台从机之间进行数据交互和通信的系统。
在本设计中,我们将使用51单片机实现一个基于串行通信的多机通信系统。
系统硬件设计如下:1.主机:使用一个51单片机作为主机,负责发送数据和接收数据。
2.从机:使用多个51单片机作为从机,每个从机负责接收数据和发送数据给主机。
3.串口:主机和从机之间通过串口进行通信。
我们可以使用RS232标准通信协议。
系统软件设计如下:1.主机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
c.接收数据:接收从机发送的数据,并存储在接收缓冲区中。
2.从机设计:a.初始化串口:设置串口参数,如波特率、数据位、停止位等。
b.接收数据:接收主机发送的数据,并存储在接收缓冲区中。
c.发送数据:将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
系统工作流程如下:1.主机启动,执行初始化操作,包括初始化串口。
2.从机启动,执行初始化操作,包括初始化串口。
3.主机发送数据给从机:主机将需要发送的数据存储在发送缓冲区中,通过串口发送给从机。
4.从机接收并处理数据:从机接收主机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
5.从机发送数据给主机:从机将需要发送的数据存储在发送缓冲区中,通过串口发送给主机。
6.主机接收并处理数据:主机接收从机发送的数据,并存储在接收缓冲区中,对接收到的数据进行处理。
7.主机和从机循环执行步骤3-6,实现多机之间的数据交互和通信。
多机通信系统的设计考虑到以下几个方面:1.硬件设计:需要合理选择单片机和串口的类型和参数,确保系统的稳定性和可靠性。
2.软件设计:需要设计适应系统需求的通信协议和数据处理提取方法,保证数据的准确性和完整性。
3.通信协议:需要定义主机和从机之间的通信协议,包括数据的格式、传输方式等,以便实现正确的数据交互。
单片机双机通信接口应用在现代电子技术领域,单片机的应用越来越广泛。
单片机之间的通信成为实现复杂系统功能的关键环节之一。
双机通信接口的应用,为各种设备之间的数据交换和协同工作提供了有效的途径。
单片机,简单来说,就是在一块芯片上集成了微处理器、存储器、输入输出接口等功能部件的微型计算机。
它具有体积小、成本低、可靠性高、控制功能强等优点,被广泛应用于工业控制、智能仪表、家用电器、通信设备等众多领域。
双机通信,指的是两个单片机之间进行数据传输和信息交换。
实现双机通信的关键在于通信接口的选择和配置。
常见的双机通信接口方式有串行通信和并行通信。
串行通信是指数据一位一位地按顺序传输。
这种方式只需要少数几根数据线,就能在两个设备之间进行通信,因此硬件成本较低,连线简单。
串行通信又分为同步串行通信和异步串行通信。
异步串行通信相对简单,不需要时钟信号进行同步,通信双方按照约定的波特率和数据格式进行通信。
例如,常见的 UART(通用异步收发器)就是一种异步串行通信接口。
并行通信则是数据的各位同时进行传输。
它的传输速度快,但需要较多的数据线,硬件成本较高,连线也较为复杂。
在实际应用中,并行通信通常用于短距离、高速的数据传输。
在选择双机通信接口时,需要考虑多种因素,如通信距离、数据传输速率、系统复杂度、成本等。
如果通信距离较远,对传输速率要求不高,串行通信是一个较好的选择;如果需要高速传输大量数据,且通信距离较短,并行通信可能更为合适。
以两个基于 51 单片机的系统为例,来探讨一下双机通信的实现。
假设我们要实现一个温度监测系统,一个单片机负责采集温度数据,另一个单片机负责接收并处理这些数据,然后进行显示或控制。
对于串行通信,我们可以使用 UART 接口。
首先,需要对两个单片机的 UART 进行初始化设置,包括波特率、数据位、停止位、校验位等参数。
然后,发送方将温度数据按照约定的格式进行封装,并通过UART 发送出去;接收方则不断监测 UART 接收缓冲区,当有数据到达时,进行读取和解析。
51单片机双机通信原理(一)51单片机双机通信简介•什么是51单片机双机通信•双机通信的作用和应用场景基本原理•单片机串口通信原理–串口通讯协议–数据帧的构成•串口通信的硬件连接–引脚连接方式–串口信号格式设置单向通信实现•主从模式–主机发送数据–从机接收数据•编程实现–主机端程序设计–从机端程序设计双向通信实现•主从模式–主机发送数据–从机接收数据–主机接收数据–从机发送数据•编程实现–主机端程序设计–从机端程序设计通信协议的设计•自定义通信协议–协议的格式–数据的解析与封装高级功能扩展•多机通信实现•数据加密与解密•异常处理与误码纠错总结•51单片机双机通信的基本原理和实现方式•可能遇到的问题及解决方案•双机通信的进一步应用展望简介51单片机双机通信是指使用51系列单片机实现两台或多台单片机之间的数据传输和通信。
双机通信可以实现在多个单片机之间传递数据、完成控制指令的下发、数据的采集和处理等功能。
在各种电子设备和嵌入式系统中,双机通信被广泛应用,可以实现设备之间的互联和协同工作,提高系统的灵活性和智能化水平。
基本原理单片机串口通信原理串口通信是一种将数据通过串行线路进行传输的通信方式。
在51单片机的串口通信中,常用的是UART(通用异步收发传输器)通信协议。
UART通信采用的是异步传输方式,数据按照固定的数据帧格式进行传输。
串口通信的硬件连接在51单片机的串口通信中,需要将主机和从机的UART引脚连接起来。
常用的连接方式是通过一对直线的串行数据线(TXD和RXD)连接主从机,其中TXD是发送数据的引脚,RXD是接收数据的引脚。
为了确保数据的正确传输,还需要进行串口信号格式的设置,包括波特率、数据位数、停止位数和校验位等。
单向通信实现主从模式在单向通信中,主机负责发送数据,从机负责接收数据。
主机通过串口发送数据帧,从机通过串口接收数据帧,并进行相应的处理。
编程实现在主机端程序设计中,需要配置串口通信的参数,并使用串口发送数据的相关函数来发送数据。
单片机多机通信系统一、引言随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。
单片机在实时数据采集和数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。
本系统是面向智能家居应用而设计的。
在初期,采用红外无线通信方式,其传输距离短,适于一般家庭应用,且成本相对较低;待方案成熟、成本允许,可以改用GSM无线通信方式。
二、系统原理及方案设计1 、系统框架介绍本系统为基于51单片机的多机红外无线通信系统,由三个51单片机模块组成。
其中一个作为主机(即上位机),负责接收来自从机1(即下位机)采集的数据信息,以及向从机2(即下位机)发送控制信息。
从机1是数据采集模块,采集温度、光强等室内数据,并将其发送给主机。
主机经分析处理,作出相应判断,并给从机2发送控制信息,使由从机2控制的电机作出相应反应,调节室内环境状况。
系统总体框图如下图1所示,图2为红外收发模块简图:图1 系统总体框图图2 红外收发模块简图2 、多机通信原理介绍在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正是为了满足这一要求而设置的。
当串行口以方式2或方式3工作时,发送或接收的每一帧信息都是11位的,其中除了包含SBUF 寄存器传送的8位数据之外,还包含一个可编程的第9位数据TB8或RB8。
主机可以通过对TB8赋予1或0,来区别发送的是数据帧还是地址帧。
根据串行口接收有效条件可知,若从机的SCON控制位SM2为1,则当接收的是地址帧时,接收数据将被装入SBUF并将RI标志置1,向CPU发送中断请求;若接收的是数据帧时,则不会产生中断标志,信息将被丢弃。
若从机的SCON控制位SM2为0,则无论主机发送的是地址帧还是数据帧,接收数据都会被装入SBUF并置1标志位RI,向CPU发出中断请求。
那么,我们规定如下通信协议:(1)置1所有从机的SM2位,使之处于只能接收地址帧的状态,并给每个从机初始化一个地址值;(2)主机发送地址帧,其中包含8位地址信息,第9位为1,进行从机寻址;(3)从机接收到地址后,将8地址信息与其自身地址值相比较,若相同则清“0“控制位SM2,若不同则保持SM2位为1;(4)主机从第二帧开始发送数据帧,其中第9位为0。
对于已经被寻址的从机,因其SM2为0,可以接收主机发送来的任何信息,而对于其他从机,因其SM2为1,将对主机发送来的数据信息不予理睬,直到发来一个新的地址帧。
(5)若主机需要要与其他从机联系,可再次发送地址帧来进行从机寻址,而先前被寻址过的从机在分析出主机发来的地址帧是对其他从机寻址时,恢复其自身的SM2为1,对主机随后发来的数据信息不予理睬。
3 、红外通信方式介绍因为本系统是面向智能家居而设计的,考虑到有线方式给用户带来的不便,我们选用无线作为各单片机间的通信方式。
且我们队员以前未做无线通信,希望在这次比赛中锻炼、提高自己。
对于无线通信方式,常见的有五种:红外通信,蓝牙通信,Zigbee通信,GSM通信,GPRS通信。
红外通信是我们在学习中接触到最多的,元件材料相对简单、容易获得,能够满足一般家庭应用,且红外通信方面的资料比较多,易学。
蓝牙设备自制不易,购买则增加系统成本。
Zigbee、GSM、GPRS 则或系统设计复杂,或成本高。
红外通信背景介绍:红外线是波长在750nm至1000nm间的电磁波,其频率高于微波而低于可见光,是一种人肉眼看不见的光线。
目前无线电波和微波已被广泛应用在长距离的无线通信中,但由于红外线的波长较短,对障碍物的衍射能力差,所以更适合应用在需要短距离无线通信场合点对点的直线数据传输。
(1)红外收发器TFDU4100介绍对于红外收发模块,我们采用TFDU4100红外收发器来实现。
TFDU4100是常用的低电压红外收发模块,以串行方式进行数据交换,遵循IrDA1.2标准,最高通信速率可以达到115.2Kbps,最大传输距离为3.0m。
TFDU4100芯片图片和管脚定义分别如图3、表1所示管脚号作用描述I/O 有效电平1 IREDAnode 红外发射的阳极,该引脚通过一个外接电阻与Vcc2相接2 IREDCathode 红外发射的阴极,该引脚在模块内部与输出驱动相连3 TXD 发送数据的输入端输入引脚高4 RXD 接收数据的输出端,不需要上拉或下拉电阻,数据发送时此脚无效输出引脚低5 NC 不用连接6 Vcc1/SD 电源/关闭引脚,当该脚为低电平时,红外传输模块关闭7 SC 灵敏度控制端输入引脚高8 GND 接地端表1 TFDU4100管脚定义除了使用TFDU4100构成红外收发模块外,还可以选用其他的方案。
比如用分立元件搭建一个红外发射、接收电路:用电阻、电容组成低步振荡器,频率调在38KHz左右,由红外发光二极管发射载波;红外接收部分采用普通的红外接收头,比如LF0038U,再用二极管、晶体管、电容、电阻构成放大、解调电路。
但此方案缺点在于电路复杂、系统稳定性不强,并且成本与采用TFDU4100设计差别不大。
(2)串行红外传输控制器TOIM3232介绍根据IrDA红外传输标准,串行红外传输采用特定的脉冲编码标准,该标准与RS232串行传输标准不同。
若两设备之间进行串行红外通讯,就需要一个传输控制器,以进行RS232编码和IrDA编码之间的转换。
TOIM3232串行红外传输控制器就是Vishay公司为配合TFD U4100而设计的。
其功能结构图如图4所示:图4 TOIM3232功能结构框图在输出模式下,TOIM3232可把RS232输出信号转变成符合IrDA 标准的信号以驱动红外发射器;在接收模式下,TOIM3232可把IrDA 输入信号转变成符合RS232标准的信号;TOIM3232的红外传输速度范围为2.4Kbit/s~115.2Kbit/s。
TOIM3232内部有一个3.6864MHz 的晶振,用以实现脉冲的扩张和压缩。
该时钟信号既可以由内部晶振产生也可用外部时钟实现。
该控制器可通过RS232口进行编程控制,其输出脉冲宽度可程控为1.627μs或3/16位长。
4 、主机模块介绍主机模块以89C52单片机为控制核心,外围主要接有4X4矩阵键盘、1602液晶显示屏、TFDU4100红外收发器、串行红外传输控制器TOIM3232。
此模块中 89C52单片机作为CPU,控制整个系统的运转。
系统启动时,默认主机与从机1建立连接。
主机以串行口中断方式接受从机1发送的数据。
数据经单片机分析,显示于1602液晶上,并判断是否向从机2发送控制信息。
本系统中我们使用4*4的非独立式矩阵键盘,如下图5所示。
将行线、列线分别连接到按键开关的两端,并且连接到单片机的I/O口。
图5 4*4矩阵键盘通过矩阵键盘,可以向主机输入要寻址的从,以控制主与哪一个从通信;并能控制与主机连接的1602液晶,显示任意一项从机1测量的数据。
下面为4*4矩阵键盘的程序设计流程图如下图6所示:图6 4*4矩阵键盘的程序设计流程图1602液晶是一种专门用于显示字母、数字、符号的点阵式LCD,它有5*10和5*7两种点阵字符显示模式可供选择,5*7点阵字符下可以显示2行共32个字符。
一般其主控制驱动电路为HD44780,模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
1602液晶在此模块内的作用,是显示从机1测量的数据,验证红外通信的可靠性;当主机要切换要与之通信的从机时,用1602显示修改后与之通信的从机名。
红外通信模块主要由TFDU4100和TOIM3232构成。
TFDU4100采用IrDA红外传输标准,即串行红外传输的脉冲编码,这个标准不能和单片机接口直接兼容。
所以用串行红外传输控制器TOIM3232进行串码和IrDA编码间的转换。
TOIM3232可把单片机输出的串码信号转换成符合IrDA标准的信号以驱动TFDU4100;它还可以将IrDA输入信号转换成串码信号送入单片机。
其电路设计原理图如下图7所示:图7 51单片机、TOIM3232、TFDU4100简易连接原理图主机负责对外围器件的调度与控制,包括红外收发模块接收数据控制、键盘扫描、1602液晶的显示、是否向从机2发送消息。
其程序流程图如下图8所示:N Y开始单片机复位默认启动时与从机1连接1602显示此时与从机1连接While(1)死循环结束串行口中断数据分析超过阀值1602显示数据返回主程序键盘设置连接从机2红外发送数据返回主程序1602显示连接机2图8 主机程序流程图5 、从机1模块介绍从机1模块以89C52单片机为控制核心,外围主要接有1602液晶显示屏、TFDU4100红外收发器、串行红外传输控制器TOIM3232、ADC0809、温度传感器、光强传感器。
室内温度的测量采用温度传感器DS18B20。
选用此传感器的原因是它价格便宜,可以降低系统成本,且对于一般家庭使用,此传感器的精度足够了。
使用简单,易控制。
DS18B20提供9位二进制温度读数,指示器件的温度信息,并通过单线接口送至CPU。
DSl820中有用于贮存测得的温度值的两个8位存贮器RAM编号为0号和1号。
将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550摄氏度--125摄氏度)。
光强传感器采用实验室现已有的,主要由可见光光敏电阻器、普通电阻等分立器件构成。
光敏电阻是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强时,电阻减小,入射光弱时,电阻增大。
所有传感器输出的数据均为模拟量,要输入单片机处理,必须经过A/D转换。
模数转换芯片采用ADC0809,主要原因是采集数据的路数较多(以后还可扩展),需要一个多通道的A/D,而我们以前做数电实验时用过的ADC0809正是8位8通道的模数转换芯片,它是逐次逼近式A/D转换器,可以和单片机直接接口。
红外收发模块,则负责将传感器采集的数据传至主机,其结构已在前面介绍过。
1602液晶在此处的作用是将单片机接收到的数据显示出来,与传到主机的数据作对比,验证红外通信的可靠性。
从机1的程序流程图如下图9所示:图9 从机1程序流程图6 、从机2模块介绍从机2模块以89C52单片机为控制核心,外围主要接有红外收发模块、电机驱动电路、直流电机和窗帘模型。
红外收发模块负责接收主机发送来的信息,经单片机处理,以控制电机运转。