⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于MSP430单片机的测温系统及无线通信程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------------
//  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 + -