流程图
程序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/
/****************************************************************
这样发:
****************************************************************/