📄 main.c
字号:
//----------------------------------------------------------------------------
// Demo Application for MSP430/CC1100-2500 Interface Code Library v1.0
//
// K. Quiring
// Texas Instruments, Inc.
// July 2006
// IAR Embedded Workbench v3.41
//08年7月29日,弄了Lpm3中断响应,TI_CC_RF_FREQ 2400还是只能接收一次,
//TI_CC_RF_FREQ 弄了Lpm3中断响应401还是能接收多次,不能保证每时都收到东西
//10月16日
//----------------------------------------------------------------------------
#include "include.h"
//#define _TRANSMITTER
#define receive
//#define _SWOR
void CCxxx0ExitWorMode(void);
void CCxxx0EnWorMode(void);
extern char paTable[]; //功率能量
extern char paTableLen;
char txBuffer1[5] = {0x04,0x08,0x07,0x06,0x05}; //传一个温度
char txBuffer2[24] ; //传二十五个温度
unsigned char tem_buffer[20]; //存温度值缓冲
unsigned char tem_flag = 19; // 温度值缓冲计数
static char rxBuffer[8];
char next;
unsigned int ss; //ss为50ms计数
unsigned char com; //com为命令字
unsigned char pre_tem;//预警温度
unsigned char m,n;//采集温度间隔
///////////////////////////////////////////////////////
#define positive 0x08 //正温系数
unsigned char error18b20 = 0;
unsigned char symbol18b20 = 1 ; //温度正负符
unsigned char tempera;
//延时
void delay(unsigned int useconds)
{
while(useconds--){
_NOP();_NOP();_NOP();_NOP();_NOP();};///n=10,则延时10*5+6=56uS
}
//ds18b20复位
//unsigned char Ds18b20_present(void)
void Ds18b20_present(void)
{
DS18B20_OUT &= ~DS18B20; //pull DQ line low
delay(100); //延时500us
DS18B20_OUT |= DS18B20; //allow line to return high
delay(11); //延时16~60us leave it low for 600us
DS18B20_DIR &= ~DS18B20; //SET TO INPUT???
if((DS18B20_IN & DS18B20)==DS18B20)//get presence signal I am not this?? ///???
{
error18b20 = 1;
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
}
else ///???
{
error18b20 = 0;
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
DS18B20_OUT |= DS18B20;//after 60us--240us
}
} //1 //= presence, 0 = no part
//从 1-wire 总线上读取一个字节
unsigned char Ds18b20_read_byte(void)
{
unsigned char x;
unsigned char va = 0;
for(x = 8; x > 0; x--)
{
va >>= 1; ///移向下一位
DS18B20_OUT &= ~DS18B20; //pull DQ low to start timeslot
_NOP(); //延时1us
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
_NOP();_NOP();_NOP();_NOP();_NOP();//延时5us
///DS18B20_OUT |= DS18B20; //this me
DS18B20_DIR &= ~DS18B20; //SET TO INPUT
if((DS18B20_IN & DS18B20)==0)
{
va &= 0x7F; //读入DS18B20_IN为0
}
else
{
va |= 0x80; //读入DS18B20_IN为1
}
delay(7); //延时40us
DS18B20_DIR |= DS18B20;//DS18B20_OUT口设为输出
DS18B20_OUT |= DS18B20;//DS18B20_OUT输出1
/*if(DS18B20_IN & DS18B20)
value |= 0x80;
else
value &= ~0x80;
delay(8); //wait for rest of timeslot*/
}
return(va);
}
//向 1-WIRE 总线上写一个字节
void Ds18b20_write_byte(unsigned char val)
{
unsigned char i;
for(i = 8; i > 0; i--) //writes byte, one bit at a time
{
DS18B20_OUT &= ~DS18B20; //pull DQ low to start time slot
_NOP();_NOP();_NOP();_NOP();_NOP();//_NOP();_NOP();_NOP();延时5us//this me
if((val & 0x01)==0x01)
DS18B20_OUT |= DS18B20;
else
DS18B20_OUT &= ~DS18B20;
val >>= 1;
delay(9); //hold value for remainder of time slot 60us 50us以上
DS18B20_OUT |= DS18B20;
}
}
//MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
// 1- 每一次读写之前都要对DS18B20进行复位.
// 2- 完成复位后发送一条ROM命令到DS18B20.
// 3- 最后发送一条RAM命令到DS18B20.
// 以上系列动作是根据DS18B20的通讯协议所得.
//读取温度
void Ds18b20_Convert_commond(void)
{
//unsigned int tmp;
char temp1,temp2; //温度值的整数部分、小数部分
// DS18B20_R = DS18B20; //使用上拉电阻
DS18B20_SEL &= ~DS18B20; //设为I/O,默认为1
Ds18b20_present(); //复位
// delay(200); //1ms
Ds18b20_write_byte(0xCC); //Skip ROM忽略ROM匹配操作
Ds18b20_write_byte(0x44); // Start Conversion温度转换命令
delay(60000); //60000x5us=0.3s
delay(60000);
delay(60000); ////延时1s以上
Ds18b20_present(); //复位
//delay(200); //1ms
Ds18b20_write_byte(0xCC); //忽略ROM匹配操作
Ds18b20_write_byte(0xBE); //读寄存器
temp2 = Ds18b20_read_byte(); //读取第1字节 LSB
temp1 = Ds18b20_read_byte(); //读取第2字节 MSB
delay(10);
//_NOP();
tempera = (temp1<<4)|(temp2>>4);
}
///////////////////////////////////////////
void main (void)
{
char j = 0;
unsigned char x;
//char len1; //Len of pkt to be RXed (only addr
//////////////////////////////////////////
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DS18B20_DIR |= DS18B20;//DS18B20_OUT口设为输出
DS18B20_OUT |= DS18B20;
/////////////////////////////////////////
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000; //50ms
TACTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, upmode
TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN; //设GDOO为输入状
IFG1 &= ~OFIFG;
TI_CC_Wait(30);
TI_CC_SPISetup(); // Initialize SPI port -modify-
TI_CC_PowerupResetCCxxxx(); // Reset CCxxxx,TI_CC_SPI.c
writeRFSettings(); // Write RF settings to config reg
//设置功率
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//Write PATABLE memory locations:TI_CCxxx0_PATABLE=0x3f
TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN; //设置GDO0为输入;
TI_CC_GDO0_PxSEL &= ~TI_CC_GDO0_PIN; //设置P2.6脚为I/O端口;
TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN; //下降沿触发中断;
TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // 清除中断标志;
////TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; // 使能中断总允许;
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); ////设置芯片为空闲状态;
TI_CC_SPIStrobe(TI_CCxxx0_SPWD); ////设置芯片为sleep状态;
#ifdef receive
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远???
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //???
TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调???
#endif
// signal on GDO0 and wake CPU
#ifdef _SWOR
CCxxx0EnWorMode();
#endif /* _SWOR */
while(1)
{
// Len of pkt to be RXed (only addr
// plus data; size byte not incl b/c
#ifdef _TRANSMITTER
//for(len1=0;len1<50;len1++)
if(j)
{
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
RFSendPacket(txBuffer1, 9); // Send value over RF
//TI_CC_Wait(30000);
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
RFSendPacket(txBuffer1, 9); // Send value over RF
// TI_CC_Wait(30000);
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
RFSendPacket(txBuffer1, 9); // Send value over RF
// TI_CC_Wait(30000);
// TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
j = 0;
}
else
{
RFSendPacket(txBuffer1, 9); // Send value over RF
TI_CC_Wait(30000);
TI_CC_Wait(30000);
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
RFSendPacket(txBuffer1, 9); // Send value over RF
TI_CC_Wait(30000);
TI_CC_Wait(30000);
TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
RFSendPacket(txBuffer1, 9); // Send value over RF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -