• [LaunchPad] DS18B20温度测量,串口显示


      1 #include <msp430g2553.h>
      2 #include  "stdio.h"
      3  
      4 #define uint unsigned int 
      5 #define uchar unsigned char
      6 
      7 #define DS18B20       BIT3
      8 #define DS18B20_H     P2OUT |= BIT3
      9 #define DS18B20_L     P2OUT &= ~BIT3
     10 
     11 //以下是DS18B20所需的函数定义
     12 
     13 void B20_init(void);
     14 uchar B20_readB(void);
     15 void B20_writeB(uchar wrd);
     16 uint Read_temp(void);
     17 void B20_display(void);
     18 
     19 
     20 void B20_init(void)
     21 {
     22  P2DIR |= DS18B20;                     //配置为输出
     23  P2REN &= ~DS18B20;
     24  DS18B20_L;                         //拉低
     25  //Delay_us(600);                 //等待600微秒
     26  //__delay_cycles(4800); 
     27  __delay_cycles(600);
     28  DS18B20_H;                         //释放总线
     29  //Delay_us(60);                 //等待60微秒
     30  __delay_cycles(60);
     31  //__delay_cycles(480); 
     32  P2DIR &= ~DS18B20;                     //配置为输入
     33  P2REN |=DS18B20;
     34  while((P2IN &(DS18B20)));                 //等待DS18B20拉低
     35  while(!(P2IN &(DS18B20)));                  //等待DS18B20释放总线
     36 }
     37 
     38 uchar B20_readB(void)
     39 {
     40  uchar i,retd=0;
     41  for(i=0;i<8;i++)         //位计数值
     42  {
     43   retd>>=1;            //右移,准备接受新的数据位
     44   P2DIR |=DS18B20;        //配置为输出
     45   P2REN &= ~DS18B20;
     46   DS18B20_L;                //拉低,启动读数据位
     47   DS18B20_H;            //释放总线
     48   //Delay_us(5);        //等待5微秒
     49   //__delay_cycles(40); 
     50   __delay_cycles(5);
     51   P2DIR &=~DS18B20;        //配置为输入,开始读取数据位
     52   P2REN |=DS18B20;
     53    
     54   if(P2IN&DS18B20)        //该位是否为高
     55   {
     56    retd|=0x80;            //是就将此位置高
     57   }
     58   //Delay_us(50);        //等待50微秒
     59   //__delay_cycles(400); 
     60   __delay_cycles(50);
     61  }
     62  return retd;            //将读到的一个字节返回
     63 }
     64 
     65 void B20_writeB(uchar wrd)
     66 {
     67  uchar i;
     68  for(i=0;i<8;i++)          //位计数值
     69  {
     70   P2DIR |=DS18B20;        //配置为输出
     71   P2REN &= ~DS18B20;
     72   DS18B20_L;                //拉低,启动写数据位
     73  // Delay_us(1);        //等待1微秒
     74   //__delay_cycles(8); 
     75   __delay_cycles(1);
     76   if(wrd&0x01)            //此位数据是否为高
     77   {
     78    DS18B20_H;                //是高则将单总线拉高
     79   }
     80   else
     81   {
     82    DS18B20_L;                //是低则将单总线拉低
     83   }
     84   //Delay_us(50);            //等待50微秒
     85   //__delay_cycles(400); 
     86  __delay_cycles(50); 
     87   DS18B20_H;                //释放总线
     88   wrd>>=1;            //右移,为写入新的数据位做准备
     89  }
     90  // Delay_us(50);        //等待50微秒
     91  //__delay_cycles(400); 
     92  __delay_cycles(50);
     93 }
     94 
     95 uint Read_temp(void)
     96 {
     97  uchar templ,temph;
     98  uint temp=0;
     99  B20_init();            //初始化,每次写命令都从初始化开始
    100 
    101  B20_writeB(0xcc);      //跳过ROM
    102  B20_writeB(0x44);      //启动温度转换
    103  B20_init();            //初始化,每次写命令都从初始化开始
    104  B20_writeB(0xcc);      //跳过ROM
    105  B20_writeB(0xbe);      //读寄存器
    106  templ=B20_readB();     //读温度低字节
    107  temph=B20_readB();     //读温度高字节
    108  temp=templ+temph*256;  //将温度整理成16位变量
    109   return temp;            //返回16位变量
    110 }
    111 
    112 
    113 
    114 void B20_display(void)
    115 {
    116    uint t;
    117    t=Read_temp();          //读取温度值
    118    t=(unsigned int)(t*6.25);              //显示的温度保留小数点后两位,
    119                            //要想保留一位可以乘以0.625
    120     printf("温度  : %.2f  \n",t*1.0/100);
    121 }
    122 
    123  int putchar(int ch)
    124  {
    125    while(!(IFG2&UCA0TXIFG));
    126     UCA0TXBUF=ch;
    127     return ch;
    128  }
    129  
    130   
    131   void main(void)
    132   
    133   {
    134   
    135   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    136   
    137    P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
    138    P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
    139   
    140    UCA0CTL1 |= UCSSEL_2;                     // SMCLK
    141    UCA0BR0 = 104;                            // 1MHz 9600
    142    UCA0BR1 = 0;                              // 1MHz 9600
    143    UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
    144    UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
    145    P2DIR |= BIT3;
    146   
    147   printf("\n%s\n","========温度测量=========");
    148  
    149   B20_display();
    150   
    151    while(1)
    152    {
    153    __delay_cycles(1000000);
    154    B20_display();
    155    
    156    }
    157  
    158   }
  • 相关阅读:
    Python Twisted系列教程8:使用Deferred的诗歌下载客户端
    Python Twisted系列教程7:小插曲,Deferred
    Python Twisted系列教程6:抽象地利用Twisted
    Python Twisted系列教程5:由Twisted支持的诗歌客户端
    Python Twisted系列教程4:由Twisted支持的诗歌客户端
    Python Twisted系列教程2:异步编程初探与reactor模式
    多线程--future模式初体验
    【java工具类】生成二维码
    Maven手动命令行导入ojdbc6
    【javascript】生成二维码
  • 原文地址:https://www.cnblogs.com/sky1991/p/2657036.html
Copyright © 2020-2023  润新知