1、基本实现方案:
主机:单片机模拟单总线协议与DS18B20通信采集温度值,并通过串口将数据发送给zigbee模块。
从机:单片机通过串口接收zigbee接收到的温度值,然后将温度值送到模拟iic协议的数据区,并在显示器上显示出来。
2、使用到元件;
Stc89c52单片机、11.0592Mhz晶振、22pf瓷片电容、10k电阻、10uf电解电容、按键。
Zigbee 通信模块E18_MS1_PCB
DS18B20温度传感器
Oled12864显示器 0.96寸iic通信
蜂鸣器+9013三极管
TM16374位数码管显示模块
3、电路原理图:
4、电路方案:
主机电路由单片机最小系统、DS18B20数字温度传感器、zigbee无线通信模块、数码管显示模块组成。
从机电路由单片机最小系统、zigbee无线通信模块、oled显示模块、蜂鸣器报警电路组成。
注意事项:51单片机只有一个串口(P3.0,P3.1),下载程序端口与zigbee通信端口复用,会导致zigbee连接失败,在打开电源之前将串口引脚上的跳线帽拔掉,在单片机完成初始化后再将跳线帽插回。(我估计是这个问题,但也没有好的解决办法,希望各路大师提提意见)
制作出来的实物图如下:
部分源码:完整源码见附件
- #include <REG52.H>
- #include <stdio.h>
- #include "oled.h"
- #include "bmp.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit AT_MODE = P2^3; //zigbee通信模式选择
- sbit REST = P1^7; //zigbee复位引脚
- sbit PBB = P2^4; //蜂鸣器
- uchar flag = 0;
- uchar index = 0;
- uchar data c[4] ="0000";
- uchar code str[]="123789";
- uchar num_10,num_1,num_0;
- void Send_string(uchar *c)
- {
- while(*c != '!')
- {
- SBUF=*c;
- c++;
- while(TI==0);
- TI=0;
- }
- }
- void Send_data(uchar str)
- {
- SBUF=str;
- while(TI==0);
- TI=0;
- }
- void Send_str(uchar *s)
- {
- while(*s)
- {
- Send_data(*s++);
- }
- }
- void Send_init()
- {
- EA=1;ES=1; //开总中断和串行口中断
- TMOD = 0x20; //设置定时计数器位方式2
- TH1 = 0xfd; // 设置波特率为9600
- TL1 = 0xfd;
- TR1 = 1; //启动定时计数器
- SCON = 0x50; //设置串口为方式2
- PCON = 0x00; //波特率不加倍 AT+MODE=?
- // TI=1;
- }
- void zigbee_init()
- {
- AT_MODE = 1; //AT指令模式
- Send_str("AT+UART=2"); //设置波特率9600
- Delay_1ms(1000);
- Send_str("AT+DEVE=E"); //终端 模式
- Delay_1ms(1000);
- Send_str("AT+MODE=3"); //协议模式
- Delay_1ms(1000);
- Send_str("AT+PANID=55AA");//设置ID号
- Delay_1ms(1000);
- Send_str("AT+RESET"); //复位
- Delay_1ms(5000);
- }
- void main(void)
- {
- u8 t,temp;
- t=' ';
- REST = 0;
- Delay_1ms(100);
-
- OLED_Init(); //初始化OLED
- Send_init();
- zigbee_init();
- REST = 1;
- //显示图片
- OLED_DrawBMP(0,0,128,8,BMP1); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
- Delay_1ms(2000);
- OLED_Clear();
-
- while(1)
- {
- num_10= c[0];
- num_1 = c[1];
- num_0 = c[2];
-
- OLED_ShowString(0,0,"DS18B20 zigbee",16);
- OLED_ShowString(0,3,"TEMP:",16);
- OLED_ShowChar(50,3,num_10,16);
- OLED_ShowChar(58,3,num_1,16);
- OLED_ShowChar(68,3,'.',16);
- OLED_ShowChar(76,3,num_0,16);
- //temp = ((num_10-31)*10)+(num_1-31);
- if(num_10 >= '3')PBB=1; //温度大于30 开蜂鸣器
- else PBB=0;
-
- }
- }
- //串口接收中断函数
- void Serial_INT() interrupt 4
- {
- if(RI==0) return;
- ES=0; //关闭串口中断
- RI=0; //清接收中断标志
- c[index++]=SBUF;
- if(SBUF == '!')
- {
- flag = 1;
- index= 0;
- }
- ES=1;
- }
复制代码 完整源码:
51zigbee程序代码.zip
(165.38 KB, 售价: 2 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|