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

📄 zhang.c

📁 msp430f413和prt6000程序c语言
💻 C
字号:
#include<MSP430X21X1.H>
#include  "zhang.h"
#include<stdio.h>
#include"math.h"
unsigned char DS18B20_READBIT(void);
void DELAY(unsigned int len);
unsigned char DS18B20_Init(void);
void INT_CLK(void);
void DS18B20_ReadTemp(void);
void Hex2Asc(unsigned long c,char* ptr);
void ce_high(void);
void ce_low(void);
void scn_high(void);
void get_tmp(void);
void scn_low(void);
void sck_high(void);
void sck_low(void);
void mo_high(void);
void mo_low(void);
void w_tx(void);
void r_rx(void);
void clr_tx(void);
void NRF_sent(void);
unsigned char *strcat(unsigned char *dest,unsigned char *src);
void w_add(unsigned char add,unsigned char *com);
void DS18B20_WriteByte(unsigned char wwe_dat);
void w_register(unsigned char add, unsigned char com);
void write_spi(unsigned char by);
unsigned char read_spi(void);
unsigned char r_register(unsigned char add);
//参数
unsigned char sent_addr[5]={0x34,0x43,0x10,0x10,0x01};
unsigned char *p;
unsigned char addr_wd=0x03;
unsigned char flag=0;
unsigned char data;
unsigned char dat1;
unsigned char temp_buff[9];
unsigned char GetScratchpad[2];
unsigned char zhang[]={1,2,2,3,3,3,3,3};
unsigned char wang[]={4,4,4,45,5,5,5,5};
 unsigned int send_date[16]={0x07,0x0b,0x0d,0x0e,0x07,
                               0x07,0x0b,0x0d,0x0e,0x07,
                                0x07,0x0b,0x0d,0x0e,0x07,
                                0x07}; 
extern unsigned char ResultTemperature[16]=
{0x28,0x44,0x41,0x54,0x41,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x30,0x31,0x29};
 unsigned int receive_date[16]={0} ;
void main(void)
{
  
   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
  _DINT();
  INT_CLK();
    P1SEL &= ~BIT0;
        P1SEL &= ~BIT1;
        P1SEL &= ~BIT2;
        P1SEL &= ~BIT3;
	P2DIR |= BIT3;      //CE    //输出方向
        P2DIR |= BIT2;      //CSN
        P1DIR |= BIT2;      //MOSI
        P1DIR |= BIT3;      //SCK
        P1DIR &= ~BIT0;      //IRQ       //输入方向
       P1DIR &= ~BIT1;      //MISO          //输入方向
       P1OUT |= BIT2;       //MOSI        //输出高电平
       P1OUT |= BIT3;       //SCK         //
       P2OUT |= BIT3;       //CE          //
       P2OUT |= BIT2; 


 DS18B20_Init(); 
  while(1)
  {


   DS18B20_ReadTemp();
    _NOP();
   get_tmp();
   _NOP();
   NRF_sent();
   _NOP();

  }
}








//延迟程序
void DELAY(unsigned int len) 
{
  unsigned int i;
  for(i=0;i<len;i++)
  {
    _NOP();
  }
}
//时钟配置
void INT_CLK(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  DCOCTL  = CALDCO_8MHZ;
  BCSCTL1 = CALBC1_8MHZ;
  BCSCTL2 = 0x16;
}
//18b20程序B

  

  
  

void DS18B20_ReadByte(void)////////////////************///////////////////读字节
{
  unsigned char i,j,temp=0,result;
  for(i=0;i<9;i++)
  {
     temp=0;
     for(j=0;j<8;j++)
     {
        DS18B20_DIR |= DS_18B20_IOT;          
        _NOP();
        DS18B20_OUT &= ~DS_18B20_IOT;      
        _NOP();_NOP();_NOP();_NOP();     
        _NOP();_NOP();_NOP();_NOP();
        DS18B20_OUT |= DS_18B20_IOT;       
        _NOP();
        DS18B20_DIR &= ~DS_18B20_IOT;      
        DELAY(4);    
        result = DS18B20_IN & DS_18B20_IOT;       
        DELAY(30);           
        result = result&0x01;
        if(result==0x01)
        {
            temp |= 0x01<<j;
        }
     }
     temp_buff[i]=temp;
  }
}

void DS18B20_WriteByte(unsigned char wwe_dat)
{
   unsigned i,temp;
  for(i=0;i<8;i++)
  {
    DS18B20_DIR |= DS_18B20_IOT;
    _NOP();
    DS18B20_OUT &= ~DS_18B20_IOT;
    _NOP();
    temp = wwe_dat >> i;
    temp = temp&0x01;
    if(temp==1)
    {
      DS18B20_OUT |= DS_18B20_IOT;
      DELAY(40);
      
    }
    else
    {
      DS18B20_OUT &= ~DS_18B20_IOT;
      DELAY(40);
      DS18B20_OUT |= DS_18B20_IOT;
    }
    DS18B20_DIR &= ~DS_18B20_IOT;      
 
    _NOP(); _NOP();_NOP();_NOP();
  }
  
  
  
  
}

void DS18B20_ReadTemp(void)
{
  DS18B20_Init();                             //初始化
  if(flag)
    {
      flag=0;
      DS18B20_WriteByte(SkipRom);                 //跳过ROM匹配  0xcc
      DS18B20_WriteByte(ConvertTemperature);      //温度转换命令  0x44
      DELAY(558);                               //等待温度转换750us
      DS18B20_Init();
      flag=0;
      DS18B20_WriteByte(SkipRom);                 //跳过ROM匹配  0xcc
      DS18B20_WriteByte(ReadScratchpad);          //读温度命令   0xbe
      DS18B20_ReadByte();                         //读出温度数据到数组temp_buff[9]里 
    }
  _NOP();
}
unsigned char DS18B20_Init(void)
{
  unsigned char result;
  unsigned int j;
     _NOP();
  DS18B20_DIR |= DS_18B20_IOT;      
  _NOP();
  DS18B20_OUT &= ~DS_18B20_IOT;     
  DELAY(360);                            
   DS18B20_DIR &= ~DS_18B20_IOT;      
 DELAY(41);               
  result = DS18B20_IN & DS_18B20_IOT;
  result = result&0x01;
  for(j=0;j<75;j++)
  {
    if(result==0x00)
    {
      flag=1;
      break;
    }
    else
    {
      flag=0;
    }
  }
    DELAY(1000);       // > 480us
    return(flag);
}

void get_tmp(void)
{
  unsigned int i;
  unsigned char* ptr;
  GetScratchpad[1]=temp_buff[1];
  GetScratchpad[0]=temp_buff[0];
  ResultTemperature[6]=0x2B;
 for (i=7;i<12;i++)
 
      ResultTemperature[i]=0x30;
      i=GetScratchpad[1];
 i=(i<< 8)|GetScratchpad[0];
  if (i&0xf800)
 {
   ResultTemperature[6]=0x2D;
  i=~i+1;
 }
   i=i&0x07ff;
   ptr=ResultTemperature+7;
   Hex2Asc(i,(char*) ptr);
}

void Hex2Asc(unsigned long c,char* ptr)
{
  unsigned char i,j,k,l;
  c=((c*100)+8)/16;
   j = c/10000;
     *ptr++=j+0x30;//10000

       i=(c-j*10000)/1000;
         *ptr++ = i+0x30;//1000

           k=(c-j*10000-i*1000)/100;
            *ptr++ = k+0x30;//100

               l=(c-j*10000-i*1000-k*100)/10;
                 *ptr++ = l+0x30;//1

                   *ptr=(c-j*10000-i*1000-k*100-l*10)+0x30;//1
                      _NOP();
 }









//下面是NRF程序
void write_spi(unsigned char by)
 {      char i,j;
         for(i=0;i<8;i++)
    {
      if((by&0x80)==0x80)
      {
      mo_high();
      }
      else
      {
      mo_low();
      }
      sck_high();
      for (j=10;j>0;j--);//延迟一段时间
      sck_low();
      by<<=1;
    }
     }
unsigned char read_spi(void)
 {
  unsigned int i;
  unsigned char byte;
 for(i=0;i<8;i++)
 {
   byte = byte <<1;
   sck_high();
   _NOP();_NOP();
   if( NRFMISO_IN & NRFMISO_BIT)
   {
     byte=byte | 0x01;
 
   }
   else
   {
     byte=byte & 0xfe;
     
   }
  sck_low();
   _NOP();_NOP();
 }
 
   return byte;
}


 void w_register(unsigned char addr,unsigned char com)   //写寄存器
     {
    
      scn_low();
      write_spi(addr);
      write_spi(com);
      scn_high();
      }
 unsigned char r_register( unsigned char addr)       //读寄存器
      {
       unsigned char date;
       
       scn_low();
       write_spi(addr);
       date=read_spi();
       scn_high();
       return(date);
       }

void NRF_sent(void)
{
  unsigned char i;

  {
   ce_low();
    _NOP();
     DELAY(5);
       w_register(0x23,0x03);      //5ge wd
       w_add(0x30,sent_addr);     //发送地址
       w_register(0x21,0x00);      //EN_AA   关自动应答
       w_register(0x22,0x01);      //EN_RXADDR  接收数据通道0允许
       w_register(0x24,0x00);       //auto  10
       w_register(0x31,0x10);      //rx_pw_p0  32字节有效数据
       w_register(0x26,0x07);     //RF_SETUP   传输速率1Mbps,发射功率0dbm
       w_register(0x20,0x0a);     //设为发射机      //CONFIG
       w_tx();
   ce_high();
   
   
    for(i=0;i<15;i++);
   while((NRFIRQ_IN & 0x01)==0x01)
   
     ce_low();
     data= r_register(0x07);
    w_register(0x27,data);
     switch(data & 0xf0)
     {
       
       case 0x10:while(1);
       case 0x20: r_rx();break;
       case 0x40: clr_tx();break;
       default: while(1);
     
      }
  }
   
}

void w_tx(void)
{
  unsigned char i;
    scn_low();
    sck_low();
    write_spi(0xa0);
    for(i=0;i<16;i++)
    {
      write_spi(ResultTemperature[i]);
    }
    scn_high();
}

void clr_tx(void)
{ 
    scn_low();
    sck_low();
     write_spi(0xe1);
     scn_high();
  
}

 void r_rx(void)
   {unsigned char i;
     sck_low();
     scn_low();
    write_spi(0x61);
     for(i=0;i<16;i++)
     receive_date[i]=read_spi();
      scn_high();
   }

void w_add(unsigned char add,unsigned char *com)
{
  unsigned char i;
  sck_low();
  scn_low();
  write_spi(add);
  for(i=0;i<5;i++)
  {
    write_spi(com[i]);
  }
  scn_high();
}
void r_rxadd(unsigned char add)
{
  unsigned char i;
    sck_low();
    scn_low();
    write_spi(add);
    
    for(i=0;i< 5;i++)
    {
    receive_date[i]=read_spi();
    }
    scn_high();
}

        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -