#include <ioCC2530.h>
#include "delay.h"
#include "led.h"
#include "uart.h"
#include "sys.h"
#include "key.h"
//发送数据
void tx_data(u8 *data,u8 len)
{
unsigned char i;
RFD=len;
for(i=0;i<len;i++)RFD=data[i];
//ISTXON
//校准之后使能TX
//描述:校准之后ISTXON指令立即使能TX。在执行下一条
RFST=0xe9; //
while(!(RFIRQF1&(1<<1)));
RFIRQF1=~(1<<1);
}
void rf_send(unsigned char *pbuf,unsigned int len)
{
RFST =0xE3; // RF接收使能 ISRXON
// 等待发送状态不活跃并且没有接收到SFD
while( FSMSTAT1&((1<<1)|(1<<5)));
RFIRQM0 &=~(1<<6); //禁止接收数据包中断
IEN2 &=~(1<<0); //清除RF全局中断
RFST =0xEE; //清除发送缓冲区 ISFLUSHTX
RFIRQF1 =~(1<<1); //清除发送完成标志
// 填充缓冲区填充过程需要增加2字节,CRC校验自动填充
RFD = len+2;
for(int i=0; i< len; i++)
{
RFD=*pbuf++;
}
RFST =0xE9; //发送数据包 ISTXON
while(!(RFIRQF1&(1<<1))); //等待发送完成
RFIRQF1 =~(1<<1); //清除发送完成标志位
RFIRQM0 |=(1<<6); // RX接收中断
IEN2 |=(1<<0);
LED2=!LED2;
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
char len;
unsigned char i;
unsigned char buf[12];
EA = 0; //关中断
if(RFIRQF0 & (0x40)) //接收帧结束
{
len = RFD; //接收帧长度
len &= 0x7f;
for(i = 0; i < len; i++) //将接收的数据写入buf中
{
buf[i] = RFD;
DelayUs(5);
}
S1CON = 0; // 清RF中断
RFIRQF0 &= ~(0x40); //清除 RXPKTDONE中断
if(buf[0]=='1') //判断是否收到有效数据
{
LED1 = !LED1;
}
buf[len]='\0';
USART0_Printf("C_RX:%s,%d\r\n",buf,len);
}
EA = 1;
}
/*********RF初始化***********/
void RF_Init(void)
{
FRMFILT0 =0x0C;//静止接收过滤,即接收所有数据包
TXPOWER =0xD5;//发射功率为1dBm
FREQCTRL =0x0B;//选择通道11
CCACTRL0 =0xF8;//推荐值 smartRF软件生成
FSCAL1 = 0x00;
TXFILTCFG =0x09;
AGCCTRL1 = 0x15;
AGCCTRL2 = 0xFE;
TXFILTCFG =0x09;
RFIRQM0 |=(1<<6);//使能RF数据包接收中断
IEN2 |=(1<<0);//使能RF中断
RFST =0xED;//清除RF接收缓冲区 ISFLUSHRX
RFST =0xE3;// RF接收使能 ISRXON
}
#define Ds18b20IO P0_6 //温度传感器引脚
void Delay_us(unsigned int k)//us延时函数
{
T1CC0L = 0x06;
T1CC0H = 0x00;
T1CTL = 0x02;
while(k)
{
while(!(T1CNTL >= 0x04));
k--;
}
T1CTL = 0x00; //关闭定时器
}
void Delay_ms(unsigned int k)
{
T1CC0L = 0xe8;
T1CC0H = 0x03;
T1CTL = 0x0a; //模模式 32分频
while(k)
{
while(!((T1CNTL >= 0xe8)&&(T1CNTH >= 0x03)));
k--;
}
T1CTL = 0x00; //关闭定时器
}
void Delay_s(unsigned int k)
{
while(k)
{
Delay_ms(1000);
k--;
}
}
//时钟频率为32M
void Ds18b20Delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<2;j++);
}
void Ds18b20InputInitial(void)//设置端口为输入
{
P0DIR &= (1<<6); //P0.7到P0.0的I/O方向 0输入 1输出
}
void Ds18b20OutputInitial(void)//设置端口为输出
{
P0DIR |= (1<<6);
}
//ds18b20初始化 初始化成功返回0x00,失败返回0x01
unsigned char Ds18b20Initial(void)
{
unsigned char Status = 0x00;
unsigned int CONT_1 = 0;
unsigned char Flag_1 = 1;
Ds18b20OutputInitial();
Ds18b20IO = 1; //DQ复位
Ds18b20Delay(260); //稍做延时
Ds18b20IO = 0; //单片机将DQ拉低
Ds18b20Delay(750); //精确延时 大于 480us 小于960us
Ds18b20IO = 1; //拉高总线
Ds18b20InputInitial();//设置IO输入
while((Ds18b20IO != 0)&&(Flag_1 == 1))//等待ds18b20响应,具有防止超时功能
{ //等待约60ms左右
CONT_1++;
Ds18b20Delay(10);
if(CONT_1 > 8000)Flag_1 = 0;
Status = Ds18b20IO;
}
Ds18b20OutputInitial();
Ds18b20IO = 1;
Ds18b20Delay(100);
return Status; //返回初始化状态
}
void Ds18b20Write(unsigned char infor)
{
unsigned int i;
Ds18b20OutputInitial();
for(i=0;i<8;i++)
{
if((infor & 0x01))
{
Ds18b20IO = 0;
Ds18b20Delay(6);
Ds18b20IO = 1;
Ds18b20Delay(50);
}
else
{
Ds18b20IO = 0;
Ds18b20Delay(50);
Ds18b20IO = 1;
Ds18b20Delay(6);
}
infor >>= 1;
}
}
unsigned char Ds18b20Read(void)
{
unsigned char Value = 0x00;
unsigned int i;
Ds18b20OutputInitial();
Ds18b20IO = 1;
Ds18b20Delay(10);
for(i=0;i<8;i++)
{
Value >>= 1;
Ds18b20OutputInitial();
Ds18b20IO = 0;// 给脉冲信号
Ds18b20Delay(3);
Ds18b20IO = 1;// 给脉冲信号
Ds18b20Delay(3);
Ds18b20InputInitial();
if(Ds18b20IO == 1) Value |= 0x80;
Ds18b20Delay(15);
}
return Value;
}
//温度读取函数 带1位小数位
float floatReadDs18B20(void)
{
unsigned char V1,V2; //定义高低8位 缓冲
unsigned int temp; //定义温度缓冲寄存器
float fValue;
Ds18b20Initial();
Ds18b20Write(0xcc); // 跳过读序号列号的操作
Ds18b20Write(0x44); // 启动温度转换
Ds18b20Initial();
Ds18b20Write(0xcc); //跳过读序号列号的操作
Ds18b20Write(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
V1 = Ds18b20Read(); //低位
V2 = Ds18b20Read(); //高位
//temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据
temp=V2*0xFF+V1;
fValue = temp*0.0625;
return fValue;
}
u8 buff[100]="10";
/*主函数*/
void main(void)
{
float ds18b20_tmp=10;
u8 time_cnt=0;
unsigned char key;
DelayMs(2000); //延时等待系统稳定
init_clk(); //配置时钟
LED_Init();//初始化LED灯控制IO口
KEY_Init();//按键初始化
Init_Uart0();//初始化串口0
RF_Init(); //RF初始化
while(1)
{
//按键检测
key=Key_Scan();
if(key)
{
//先发送一个字符串,测试串口0数据传输是否正确
USART0_Printf("我是温度节点.\r\n");
LED1 = !LED1;
}
//1秒一次
if(time_cnt>=100)
{
time_cnt=0;
//状态灯
LED1 = !LED1;
//读取温度数据
ds18b20_tmp=floatReadDs18B20();
//向A节点发送温度数据
sprintf((char*)buff,"%.1f",ds18b20_tmp);
tx_data(buff,strlen((char*)buff));
//串口0打印数据方便调试
USART0_Printf("我是B号板(DS18B20)=%s\r\n",buff);
}
time_cnt++;
DelayMs(10);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
这是基于CC2530(ZigBee)设计温度报警器。由两个CC2530开发板+一个DS18B20+一个ESP8266 WIFI再配合手机APP完成整体开发。 第一个CC2530当做节点,上面连接了DS18B20温度传感器,第二个CC2530连接了ESP8266 WIFI,用于和手机APP)之间通讯,第一个节点将DS18B20温度传感器的数据采集之后传递给协调器(也就是第2个CC2530开发板),然后协调器再通过ESP8266传递给手机APP显示,在手机APP上完成温度实时显示,并可以通过预定的温度阀值,判断温度当前范围情况,完成相应的提示。 APP分别开发了windows电脑端上位机和Android 手机APPP,源代码都在资料包里。 资料包里包含了: 1. CC2530的完整源代码,IAR打开就可以编译运行测试 2. Android 手机APP源代码,和编译好的APK文件 3. windows系统上位机源码,和编译好的windows下可执行文件 4. 设计的完整说明文档,硬件介绍手册,原理图等
资源推荐
资源详情
资源评论











收起资源包目录





































































































共 150 条
- 1
- 2
DS小龙哥
- 粉丝: 3w+
- 资源: 300

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
前往页