多机通信下位机程序


广播中断:

流程图


程序v0.0:(工程文件:http://download.csdn.net/detail/kangear/4633496

/********************************************************************
函数名称: AM2301多机通信从机2
主控芯片: STC89c52
功	  能: 采集温湿度数据然后传给主机,并接受主机发送过来的控制信号
创建日期: 2011.5.25
修改日志: 2011.5.27加了看门狗
*******************************************************************/
#include <reg52.h>
#include "AM2301.h"
#define uchar unsigned char
#define uint  unsigned int
#define slaveadr 0x02  //从机地址
#define num 8  //数据缓冲的长度
#define stoping 0xf0
#define adding  0xf1

//sfr WDT_CONTR=0XE1;//看门狗地址
//sbit  RDE = P3^2;  //485输入输出控制
//sbit  JDQ = P2^7;   //继电器端口定义
uchar  tab1[10];
uchar  tab2[]={0x02,0x21,0x00,0x92,0x09,0x29,0x09,0x04,0x05,0x06,0x07,0x08,0x09,0xc0,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0xc8,0x25,0x26,0x27,0x28,0x29,130};
//0xf7,为数据开始帧,0xf3,位数据结束帧。设置开始结束帧,以保证数据能被主机正确接收。
uchar request_flag = 0;
sbit LED=P3^7;
/延时函数///	 
void Delayus(int t)
{
 while(t--);
}

//发送一个字节函数///
void send_byte(unsigned char dat) //send one byte 
{
    //RDE = 1;//485为发送
	SBUF = dat;
	while(!TI);//等待发送结束
	TI=0;//发送完毕后标志位清零
	//RDE = 0;//485为接收	
}


//串口初始化
void UartInit()
{
   //RDE=0;/*保持为接收状态*/
  
   TMOD=0X21; //定时器T1设为方式2
 
   TH1= 0xfd; //波特率设为9600
   TL1= 0xfd;  //
 
   SCON=0xd0; //方式3允许接收
   SM2 = 1;
   TR1=1;
   EA=1;
   ES=1;
 
}
/主函数///
void main()
{
	uchar i=0,k = 0;
	//uchar len;
	UartInit();
	//Delayus(1000);  //热机时间
	//send_byte(0x52);//用于串口调试助手测试,板子上电时串口调试助手接受区会接收到52
	
	while(1)
	{
	//WDT_CONTR=0X36;//启动看门狗
	//0011.0110---WDT_FLAG=0,EN_WDT=1,CLR_WDT=1,IDLE_WDT=0,PS2=1,PS1=1,PS0=0
	//IDLE_WDT=1时,看门狗定时器在"空闲模式"计数,IDLE_WDT=0时"空闲模式"不计数
	//RH();	//获取温湿度数据 
	//Delay(20000);//获取温湿度数据周期不宜少于2S
	
		if(request_flag == 1)
		{
			SM2=0;//转为一对一通信
			for(i=0;i<3;i++)
			{	
				//send_byte(i);    
				while(!RI);     
				tab1[i] = SBUF;
				RI = 0;  
			} 
			if(tab1[2]==0x05)
			{
				for(k=0; k<33; k++)
				{
					LED=~LED;
					send_byte(tab2[k]);//发送一数据
					
					Delayus(30); 
				}
				
			}
			SM2=1; 
			request_flag = 0;
		}
	
	}

}
串口中断服务子程序
void uart() interrupt 4
{

    unsigned char rc; 
	unsigned char i = 0;

	if(RI==1)//接到数据置标志位
	{  

       RI=0;//接收完毕标志位置0
	   rc=SBUF;//保存缓存数据
	   
          if(slaveadr == rc)
          {  
			  
             //if(request_flag ==0)         
             //{ 
               request_flag = 1;  
            // } 
		 	//ES=1;
          }//end of slaveadr=rc
//          else if(adding==rc)
//		  {
// 			JDQ=0;
//		  }
//		  else if(stoping==rc)
//		  {
//  			JDQ=1;
//		  }
     }//end of RI=1		  		 
	
}
/end/

总结:依次发 0x02(addr),0x05,0x05,0x05即可让LED明亮状态改变一次!(这个也可以做为下位机上传数据的频率检测)

====================================================================================================================================

v0.1:
/********************************************************************
函数名称: AM2301多机通信从机2
主控芯片: STC89c52
功	  能: 采集温湿度数据然后传给主机,并接受主机发送过来的控制信号
创建日期: 2011.5.25
修改日志: 2011.5.27加了看门狗
*******************************************************************/
#include <reg52.h>
#include "AM2301.h"
#define uchar unsigned char
#define uint  unsigned int
#define slaveaddr 0x02  //从机地址
#define radioaddr 0xff
#define num 8  //数据缓冲的长度
#define stoping 0xf0
#define adding  0xf1

uchar  tab1[10];
uchar  tab2[]={0x02,0x21,0x00,0x92,0x09,0x29,0x09,0x04,0x05,0x06,0x07,0x08,0x09,0xc0,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0xc8,0x25,0x26,0x27,0x28,0x29,130};
uchar request_flag = 0;
uchar radio_flag = 0;
sbit LED=P3^7;
/延时函数///	 
void Delayus(int t)
{
 while(t--);
}

//发送一个字节函数///
void send_byte(unsigned char dat) //send one byte 
{
    //RDE = 1;//485为发送
	SBUF = dat;
	while(!TI);//等待发送结束
	TI=0;//发送完毕后标志位清零
	//RDE = 0;//485为接收	
}


//串口初始化
void UartInit()
{
   //RDE=0;/*保持为接收状态*/
  
   TMOD=0X21; //定时器T1设为方式2
 
   TH1= 0xfd; //波特率设为9600
   TL1= 0xfd;  //
 
   SCON=0xd0; //方式3允许接收
   SM2 = 1;
   TR1=1;
   EA=1;
   ES=1;
 
}
/主函数///
void main()
{
	uchar i=0,k = 0;
	UartInit();	
	while(1)
	{
	
		if(request_flag == 1)
		{
			SM2=0;//转为一对一通信
			for(i=0;i<3;i++)
			{	
				//send_byte(i);    
				while(!RI);     
				tab1[i] = SBUF;
				RI = 0;  
			} 
			if(tab1[2]==0x05)
			{
				for(k=0; k<33; k++)
				{
					
					send_byte(tab2[k]);//发送一数据					
					Delayus(30); 
				}
				
			}
			SM2=1; 
			request_flag = 0;
		}
		else if(radio_flag == 1)
			{
				LED=~LED;
				radio_flag = 0;
			}
	
	}

}
串口中断服务子程序
void uart() interrupt 4
{
	uchar rc; 
	if(RI==1)//接到数据置标志位
	{  

		RI=0;//接收完毕标志位置0
		rc=SBUF;//保存缓存数据
	   
		if(slaveaddr == rc)
		{  
			request_flag = 1;  
    <span style="white-space:pre">		</span>}
		else if(radioaddr == rc)
		{
			radio_flag = 1;
		}
	}
}
/end/

====================================================================================================================================

2012年10月21日0:02:06:

v0.2

#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define slaveaddr 0x02  //从机地址
#define radioaddr 0xff
#define num 8  //数据缓冲的长度
#define stoping 0xf0
#define adding  0xf1

uchar  tab1[10];
uchar  tab2[]={0x02,0x21,0x00,0x92,0x09,0x29,0x09,0x04,0x05,0x06,0x07,0x08,0x09,0xc0,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0xc8,0x25,0x26,0x27,0x28,0x29,130};
uchar request_flag = 0;
uchar radio_flag = 0;
sbit LED=P3^7;
/延时函数///	 
void Delayus(int t)
{
 while(t--);
}

//发送一个字节函数///
void send_byte(unsigned char dat) //send one byte 
{
    //RDE = 1;//485为发送
	SBUF = dat;
	while(!TI);//等待发送结束
	TI=0;//发送完毕后标志位清零
	//RDE = 0;//485为接收	
}


//串口初始化
void UartInit()
{
   //RDE=0;/*保持为接收状态*/
  
   TMOD=0X21; //定时器T1设为方式2
 
   TH1= 0xfd; //波特率设为9600
   TL1= 0xfd;  //
 
   SCON=0xd0; //方式3允许接收
   SM2 = 1;
   TR1=1;
   EA=1;
   ES=1;
 
}
/主函数///
void main()
{
	uchar i=0,k = 0;
	UartInit();	
	while(1)
	{
	
		if(request_flag == 1)
		{
			SM2=0;//转为一对一通信
			for(i=0;i<3;i++)
			{	
				//send_byte(i);    
				while(!RI);     
				tab1[i] = SBUF;
				RI = 0;  
			} 
			if((tab1[0]==0x02)&&(tab1[1]==0x01)&&(tab1[2]==0x05))
			{
				for(k=0; k<33; k++)
				{
					
					send_byte(tab2[k]);//发送一数据					
					Delayus(30); 
				}
				
			}
			SM2=1; 
			request_flag = 0;
		}
		else if(radio_flag == 1)
			{
				LED=~LED;
				radio_flag = 0;
			}
	
	}

}
串口中断服务子程序
void uart() interrupt 4
{
	uchar rc; 
	if(RI==1)//接到数据置标志位
	{  

		RI=0;//接收完毕标志位置0
		rc=SBUF;//保存缓存数据
	   
		if(slaveaddr == rc)
		{  
			request_flag = 1;  
		}
		else if(radioaddr == rc)
		{
			radio_flag = 1;
		}
	}
}
/end/
/****************************************************************

这样发:


****************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值