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

📄 msp430f2121.c

📁 msp430f413和prt6000程序c语言
💻 C
字号:
#include<stdio.h>
#include"math.h"
#include"PTR6000.H"
extern unsigned int t_cishu=0;
extern unsigned int remin_cishu=0;
extern unsigned int putong_cishu=0;
float renminwendu=0;
uchar flag=0;   //判断DS18B20是否存在
uchar CRC_result=1;         //CRC校验的结果,为0则正确。
unsigned int zhengshu,xiaoshu;
signed char fuhao;
uint baiwei,shiwei,gewei,xiao1,xiao2;
unsigned char temp_buff[9];         //DS18B20读出的9位数值数组
unsigned char DS18B20Temp[6];
void Delay(void);
void Delay_us(uint len);
void led_light(void);
void RF_sent(void);
void RF_recive(void);
void Init_CLK(void);
void DS18B20_ReadTemp(void);
void Measuring_voltage(void);     //测电压
void Thermistor_tem(void);        //热敏测温度
uchar DS18B20_Init(void);      //DS18B20的初始化程序
void DS18B20_WriteByte(uchar oww_dat);  //写字节
void DS18B20_ReadByte(void);            //读9位数据
uchar DS18B20_CRC(void);          //DS18B20的CRC校验
void get_temp(void);              //将温度转换成十进制
void temp_ASCII(void);            //将温度转换成ASCII码,并放在DS18B20Temp[6]里
void  w_txaddr(uchar addr,uchar *com)
{
  uchar i;
  sck_Low();
  csn_Low();
  write(addr);
  for(i=0;i<addr_wd+2;i++)
  {
    write(com[i]);
  }
  csn_High();
}
void r_rxaddr(uchar addr)
{
  uchar i;
  sck_Low();
  csn_Low();
  write(addr);
  for(i=0;i<addr_wd+2;i++)
  {
    receive_date[i]=read();
  }
  csn_High();
}
//////////////////////////////////////////////////////////////////**/**********
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
  _DINT();            //关闭中断
  Init_CLK();         //时钟初始化
  Init_Port();



  P2DIR |= BIT1;
  //TACTL = TASSEL_2+MC_1;//TACTL=0x0210,比较模式,增计数到CCR0并从0开始
 // CCR0 = 50000;               //50ms,0xC350
  //CCTL0 |= CCIE;              //0x0010
  _EINT(); 
  while(1)
  {
    
          _DINT();
          seconds=0;
          P2OUT |= BIT1;
          Delay_us(50000);    //17ms
          Delay_us(50000);
          Delay_us(50000);
          P2OUT &= ~BIT1;
          _EINT();
  
  
  
  
  
  
  
  
  
  //TACTL &= ~MC1;      //停止计数
  //TACTL &= ~MC0;
  //nn = TAR;
  //TAR = 0;
  //TACTL |= MC_2;

   
 // RF_recive();
  _NOP();
  RF_sent();
   _NOP();
   
  
  
  
  
  //*Thermistor_tem();         //热敏电阻求温度
     // P2SEL &= ~BIT5;     //p2.5脚设置成普通的I/O口。DS18B20管脚
     // P2DIR &= ~BIT5;      //P2.5脚设置成输入方向
    //  DS18B20_ReadTemp();         //采集18b20
    //  CRC_result=DS18B20_CRC();
    //  DS18B20_ReadTemp();         //采集18b20
    //  CRC_result=DS18B20_CRC();
    //  get_temp();
     // temp_ASCII();
    //  _NOP();
    //  Measuring_voltage();      //测量电压

  //Init_Port();        //端口初始化
   //RF_recive();         //接收
   //RF_sent();           //发送 */
  }
}
////////////////////////////////////////////////////////////////////**//*******
void Delay(void)
{
  unsigned int i;
  for (i=0; i<60000; i++);
}
void Delay_us(uint len)
{
  uint i;
  for(i=0;i<len;i++)
  {
     _NOP();
  }
}
void Init_CLK(void)
{
  DCOCTL = CALDCO_8MHZ;
  BCSCTL1 = CALBC1_8MHZ;
  BCSCTL2 = 0x16;         //MCLK=4MHZ,SMCLK=1MHZ;
}
void led_light(void)
{
    P1OUT |= BIT3;      //点亮发光二极管
    Delay();
    P1OUT &= ~BIT3;     //输出低电平
}
void RF_recive(void)
{
       uchar read_data;
       ce_Low();
       w_register(0x23,addr_wd);      //5ge wd
       w_txaddr(0x2a,recive_addr);     //接收地址
       w_register(0x21,0x00);      //EN_AA   关自动应答
       w_register(0x22,0x01);      //EN_RXADDR  接收数据通道0允许
       w_register(0x24,0x00);       //
       w_register(0x31,0x10);      //rx_pw_p0  32字节有效数据
       w_register(0x26,0x07);     //RF_SETUP   传输速率1Mbps,发射功率0dbm
       w_register(0x20,0x0b);     //设为接收机      //CONFIG
       
       ce_High();
       while((P1IN&0x01)==0x01);
       ce_Low();
       read_data=r_register(0x07);
       w_register(0x27,read_data);  //清中断
       switch(read_data&0xf0)       //判断中断信号屏蔽低字节
            {case max_rt:while(1);
             case rx_dr :r_rx();break;
             case tx_ds :clr_tx();break;
             default: while(1);
            }
}
void RF_sent(void)
{
  while(1)
  {
        uchar read_data=0;
       ce_Low();
       w_register(0x23,addr_wd);      //5ge wd
       w_txaddr(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,send_date_width);      //rx_pw_p0  32字节有效数据
       w_register(0x26,0x07);     //RF_SETUP   传输速率1Mbps,发射功率0dbm
       w_register(0x20,0x0a);     //设为发射机      //CONFIG
       w_tx();

       ce_High();
       while((P1IN&0x01)==0x01);          //IRQ P1.0
       ce_Low();
       read_data=r_register(0x07);
       w_register(0x27,read_data);  //清中断
       switch(read_data&0xf0)       //判断中断信号屏蔽低字节
            {case max_rt:while(1);
             case rx_dr :r_rx();break;
             case tx_ds :clr_tx();break;
             default: while(1);
            }
  }   
}
//***************************测量电压的程序***************/////////////////
void Measuring_voltage(void)
{
  P2SEL &= ~BIT2;         //P2.2设置成普通I/O口
  P2SEL &= ~BIT3;
  P2SEL &= ~BIT4;
  P2DIR &= ~BIT3;         //P2.3设置成输入方向(高阻态) 热敏电阻的管脚 50K
  P2DIR &= ~BIT4;         //模拟比较器的输入端
  P2DIR |= BIT2;          //普通电阻的连接管脚  10K
    CACTL1 = CAIES+CAON+CAREF_3+CARSEL;
    CACTL1 &= ~CAEX;
    CACTL2 |= CAF;
    CACTL2 |= P2CA0;

    TACTL = TASSEL_2+TACLR+ID_1;    //时钟源SMCLK,TAR清0,1/2分频  1/2MHZ
    TACTL |= MC_2;                  //连续计数模式
    TACTL &= ~TAIE;                 //关闭中断允许
    TACTL &= ~TAIFG;                //中断标志位清0
    while(1)
    {
    
      P2OUT |= BIT2;      //拉高
      Delay_us(800);     //延时   
      TACTL &= ~MC1;      //停止计数
      TACTL &= ~MC0;
      TAR=0;            //将TAR的内容清0
      TACTL |= MC_2;    //连续计数模式
      P2OUT &= ~BIT2;    //拉低,放电
      while(1)
      {
        if((CACTL2&CAOUT)==0)
          {
            t_cishu = TAR;
            TACTL &= ~MC1;      //停止计数
            TACTL &= ~MC0;
            break;
          }
      }
    }
}
//****************热敏电阻测量温度的程序******************////
void Thermistor_tem(void)
{
     uint Rsen,duishu;
     P2OUT = 0x00;
     P2DIR = 0xff;
     P2DIR &= ~BIT4;        //模拟比较器的输入端,高阻态
     CAPD |= BIT4;      //输入缓冲关闭
     
     P2SEL &= ~BIT2;        //普通电阻端,普通I/O口
     P2SEL &= ~BIT3;        //热敏电阻端,普通I/O口

     Delay_us(400);                   //延时放电  0.55ms
        CACTL1 = CARSEL + CAREF_2+ CAON;   // 0.5 Vcc = -comp, on
        CACTL1 &= ~CAIE;
        CACTL1 &= ~CAIFG;
        CACTL1 &= ~CAEX;
        CACTL1 &= ~CAIES;           //上升沿使CAIFG置位
        CACTL2 |= CAF;
        CACTL2 |= P2CA0;              //外部引脚信号连接到比较器A

        TACTL = TASSEL_2+TACLR+ID_1;    //时钟源SMCLK,TAR清0,1/2分频  1/2MHZ
        TACTL &= ~TAIE;                 //关闭中断允许
        TACTL &= ~TAIFG;                //中断标志位清0
        P2DIR &= ~BIT3;          //热敏电阻端改成高阻态    
        TAR=0;
        TACTL |= MC_2;                  //连续计数模式
    P2OUT |= BIT2;            // //普通电阻充电          
    while(1)
     { 
         if((CACTL2&CAOUT)==1)
          {
             putong_cishu = TAR;
             TACTL &= ~MC1;      //停止计数
             TACTL &= ~MC0;
             break;
          }
      }
      P2OUT &= ~BIT2;       //放电
      Delay_us(400);                   //延时放电
      
      CAPD |= BIT2;
      P2DIR |= BIT3;
      P2OUT &= ~BIT3;
      P2DIR &= ~BIT2;       //普通电阻端改成高阻态,用热敏电阻充电

      TAR=0;            //将TAR的内容清0
      TACTL |= MC_2;    //连续计数模式
      P2OUT |= BIT3;    //充电
       while(1)
     { 
         if((CACTL2&CAOUT)==1)
          { 
             remin_cishu = TAR;
             TACTL &= ~MC1;      //停止计数
             TACTL &= ~MC0;
             break;
          }
      } 
   P2OUT &= ~BIT3;            //放电
   Delay_us(200);                   //放电延时  
   
   Rsen = (10*remin_cishu)/putong_cishu;      //求热敏电阻值
   duishu = log(10/Rsen);
  renminwendu =(3950*298.5)/(3950- duishu * 298.5)-273.5;
  _NOP();
}
///*****************DS18B20的程序***************************/////////
void DS18B20_ReadTemp(void)
{
  DS18B20_Init();                             //初始化
  if(flag)
    {
      flag=0;
      DS18B20_WriteByte(SkipRom);                 //跳过ROM匹配  0xcc
      DS18B20_WriteByte(ConvertTemperature);      //温度转换命令  0x44
      Delay_us(558);                               //等待温度转换750us
      DS18B20_Init();
      flag=0;
      DS18B20_WriteByte(SkipRom);                 //跳过ROM匹配  0xcc
      DS18B20_WriteByte(ReadScratchpad);          //读温度命令   0xbe
      DS18B20_ReadByte();                         //读出温度数据到数组temp_buff[9]里 
    }
  _NOP();
}
uchar DS18B20_Init(void)
{
  unsigned char result;
  uint j;
     _NOP();
  DS18B20_DIR |= DS18B20_DQ;       // 输出方向
  _NOP();
  DS18B20_OUT &= ~DS18B20_DQ;      // 拉低
  Delay_us(360);                   // 持续〉480us 次数=(t-5us)*3/4          
   DS18B20_DIR &= ~DS18B20_DQ;      // 输入方向
  Delay_us(41);               //等待60us
  result = DS18B20_IN & DS18B20_DQ;
  result = result&0x20;
  for(j=0;j<75;j++)
  {
    if(result==0x00)
    {
      flag=1;
      break;
    }
    else
    {
      flag=0;
    }
  }
    Delay_us(1000);       // > 480us
    return(flag);
}
void DS18B20_WriteByte(uchar oww_dat)////////////********************/////写字节
{
   uchar i,temp;
   _NOP();
  for(i = 0; i < 8; i++)
  {
    DS18B20_DIR |= DS18B20_DQ;       //输出方向 
    //DS18B20_OUT |= DS18B20_DQ;       // 输出高电平
    _NOP();
    DS18B20_OUT &= ~DS18B20_DQ;      // ;拉低,写时间隙,15us内把所写的位送到总线上
    _NOP();
    temp = oww_dat >> i;
    temp &= 0x01;
    if (temp == 1)
  {
    DS18B20_OUT |= DS18B20_DQ;       // 输出高电平
    Delay_us(41);       // 60us
   }
  else
  {
    DS18B20_OUT &= ~DS18B20_DQ;      // 输出低电平
    Delay_us(41);       // 60us
    DS18B20_OUT |= DS18B20_DQ;
   }
   DS18B20_DIR &= ~DS18B20_DQ;      // 输入方向,释放总线
  }
   _NOP(); _NOP();_NOP();_NOP();    // 1us
}
void DS18B20_ReadByte(void)////////////////************///////////////////读字节
{
  uchar i,j,temp=0,result;
  for(i=0;i<9;i++)
  {
     temp=0;
     for(j=0;j<8;j++)
     {
        DS18B20_DIR |= DS18B20_DQ;          //输出方向
        _NOP();
        DS18B20_OUT &= ~DS18B20_DQ;      // 输出低电平
        _NOP();_NOP();_NOP();_NOP();     //2us
        _NOP();_NOP();_NOP();_NOP();
        DS18B20_OUT |= DS18B20_DQ;       // 拉高
        _NOP();
        DS18B20_DIR &= ~DS18B20_DQ;      // 输入方向
        Delay_us(4);    //12us
        result = DS18B20_IN & DS18B20_DQ;       //读出那一位
        Delay_us(30);           //45us
        result = result&0x20;
        if(result==0x20)
        {
            temp |= 0x01<<j;
        }
     }
     temp_buff[i]=temp;
  }
}
uchar DS18B20_CRC(void)
{
  unsigned char i;
    uchar CRC_data=0;
    for(i=0;i<9;i++)
    {
      CRC_data=tal8[CRC_data ^ temp_buff[i]];
    }
    return (CRC_data);
}
void get_temp(void)
{
  uchar gao,di;
  
  gao = temp_buff[1];
  di  = temp_buff[0];
  fuhao = gao&0xf8;
  if(fuhao==0x00)
  {
    fuhao='+';
    gao = gao<<4;
    gao = gao&0xf0;
    xiaoshu=di&0x0f;
    di = di>>4;
    di = di&0x0f;
    zhengshu = gao+di;
  }
  else
  {
    fuhao='-';
    di = di-0x01;
    di = ~di;
    gao = ~gao;
    gao = gao<<4;
    gao = gao&0xf0;
    xiaoshu=di&0x0f;
    di = di>>4;
    di = di&0x0f;
    zhengshu = gao+di;
  }
}
void temp_ASCII(void)
{
    uchar gao,di;
  
  gao = temp_buff[1];
  di  = temp_buff[0];
  fuhao = gao&0xf8;
  if(fuhao==0x00)
  {
    fuhao='+';
    gao = gao<<4;
    gao = gao&0xf0;
    xiaoshu=di&0x0f;
    di = di>>4;
    di = di&0x0f;
    zhengshu = gao+di;
  }
  else
  {
    fuhao='-';
    di = di-0x01;
    di = ~di;
    gao = ~gao;
    gao = gao<<4;
    gao = gao&0xf0;
    xiaoshu=di&0x0f;
    di = di>>4;
    di = di&0x0f;
    zhengshu = gao+di;
  }
  
    baiwei = zhengshu/100;
    shiwei = (zhengshu%100)/10;
    gewei = zhengshu%10;
    xiao1 = xiaoshu/10;
    xiao2 = xiaoshu%10;
  DS18B20Temp[0]=fuhao;
  DS18B20Temp[1]=baiwei+0x30;
  DS18B20Temp[2]=shiwei+0x30;
  DS18B20Temp[3]=gewei+0x30;
  DS18B20Temp[4]=xiao1+0x30;
  DS18B20Temp[5]=xiao2+0x30;
  
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA0_INT(void)    //FFF2H
{
  LPM1_EXIT;
  seconds++;
}

⌨️ 快捷键说明

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