• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于msp430單片機1602 DS1802溫度顯示

    基于msp430單片機1602 DS1802溫度顯示

    作者: 時間:2016-08-25 來源:網絡 收藏

      最近調好了DS1802溫度傳感器,用的是430G2553單片機,溫度保留兩位小數。把源代碼分享給大家。

    本文引用地址:http://www.czjhyjcfj.com/article/201608/296038.htm

      /*****************************************

      g2553實現1602溫度顯示

      來源:汪中原的博客

      ******************************************/

      #include

      #define uchar unsigned char

      #define uint unsigned int

      #define CPU_F ((double)1000000)

      #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延時x us

      #define ds_1 P2OUT |=BIT3 //DS18B20數據端高電平輸入(P2.3端口)

      #define ds_0 P2OUT &=~BIT3 //DS18B20數據端低電平輸入(P2.3端口)

      #define lcdrs_1 P2OUT |=BIT1; //RS寫數據(P2.1端口)

      #define lcdrs_0 P2OUT &=~BIT1; //RS寫指令(P2.1端口)

      #define lcden_1 P2OUT |=BIT0; //1602使能信號開(P2.0端口)

      #define lcden_0 P2OUT &=~BIT0; //1602使能信號關(P2.0端口)

      uchar table[]="wzy,come on"; //開機第一行顯示

      uchar table1[]="believe yourself"; //開機第二行顯示

      uint temp,T;

      float temp_f;

      uchar shi,ge,dian1,dian2,num; //定義溫度十位、各位、小數點后一位、后二位

      /*************************************************************

      * 名 稱:void init(void)

      * 功 能:1602顯示配置端口初始化

      * 入口參數:無

      * 出口參數:無

      * 說 明: P1、P2端口設為輸出低電平

      *************************************************************/

      void init(void)

      {

      WDTCTL=WDTPW + WDTHOLD;

      P1DIR=0xff;

      P2DIR=0x1f;

      P1OUT=0x00;

      P2OUT=0x00;

      }

      /*************************************************************

      * 名 稱:void delay(uint a)

      * 功 能:簡單的延時

      * 入口參數:uint a

      * 出口參數:無

      * 說 明: 可作為1602顯示簡單的延時

      *************************************************************/

      void delay(uint a)

      {

      uint i,j;

      for(i=a;i>0;i--)

      for(j=110;j>0;j--);

      }

      /*************************************************************

      * 名 稱:void write_date(uchar date)

      * 功 能:1602寫數據

      * 入口參數:date

      * 出口參數:無

      * 說 明: 用P1口輸入數據

      *************************************************************/

      void write_date(uchar date)

      {

      lcdrs_1;

      P1OUT=date;

      delay(5);

      lcden_1;

      delay(5);

      lcden_0;

      }

      /*************************************************************

      * 名 稱:void write_com(uchar com)

      * 功 能:1602寫指令

      * 入口參數:com

      * 出口參數:無

      * 說 明: 用P1口輸入指令

      *************************************************************/

      void write_com(uchar com)

      {

      lcdrs_0;

      P1OUT=com;

      delay(5);

      lcden_1;

      delay(5);

      lcden_0;

      }

      /*************************************************************

      * 名 稱:void uinit()

      * 功 能:初始化及其他顯示設置指令

      * 入口參數:無

      * 出口參數:無

      * 說 明: 1602初始化設置

      *************************************************************/

      void uinit()

      {

      lcden_0;

      write_com(0x38);

      write_com(0x0c);

      write_com(0x06);

      write_com(0x01);

      }

      /*************************************************************

      * 名 稱:void LCD_display()

      * 功 能:1602顯示

      * 入口參數:無

      * 出口參數:無

      * 說 明: 將前幾個函數綜合起來,顯示字符內容及區域

      *************************************************************/

      void LCD_display()

      {

      init();

      uinit();

      write_com(0x80);

      for(num=0;num<11;num++)

      {

      write_date(table[num]);

      delay(5);

      }

      write_com(0x80+0x40);

      for(num=0;num<16;num++)

      {

      write_date(table1[num]);

      delay(5);

      }

      }

      /*************************************************************

      * 名 稱:uchar DS18B20_init(void)

      * 功 能:DS18B20初始化

      * 入口參數:無

      * 出口參數:error

      * 說 明: DS18B20初始化,返回參數用于判斷是否完成初始化

      *************************************************************/

      uchar DS18B20_init(void)

      {

      uchar error;

      ds_0;

      delay_us(500);

      ds_1;

      delay_us(55);

      P2DIR &=~BIT3;

      _NOP();

      if(P2IN & BIT3)

      {

      error=1;

      P2DIR |= BIT3;

      }

      else

      {

      error=0;

      P2DIR |= BIT3;

      ds_1;

      }

      delay_us(400);

      return error;

      }

      /*************************************************************

      * 名 稱:uint read_temp(void)

      * 功 能:讀取DS18B20數據

      * 入口參數:無

      * 出口參數:temp

      * 說 明: 讀取一個字節

      *************************************************************/

      uint read_temp(void)

      {

      uchar i;

      uchar temp = 0;

      for(i=0;i<8;i++)

      {

      temp >>= 1;

      ds_0;

      delay_us(6);

      ds_1;

      delay_us(8);

      P2DIR &= ~BIT3;

      _NOP();

      if(P2IN & BIT3)

      temp |= 0x80;

      delay_us(45);

      P2DIR |=BIT3;

      ds_1;

      delay_us(10);

      }

      return temp;

      }

      /*************************************************************

      * 名 稱:void write_temp(uchar data)

      * 功 能:DS18B20寫入數據

      * 入口參數:data

      * 出口參數:無

      * 說 明: 寫入一個字節

      *************************************************************/

      void write_temp(uchar data)

      {

      uchar i;

      for(i = 0; i < 8;i++)

      {

      ds_0;

      delay_us(15);

      if(data & 0x01)

      {

      ds_1;

      delay_us(60);

      }

      else

      {

      ds_0;

      delay_us(60);

      }

      data >>= 1;

      ds_1;

      delay_us(10);

      }

      }

      /*************************************************************

      * 名 稱:void temp_change(void)

      * 功 能:DS18B20溫度轉化指令

      * 入口參數:無

      * 出口參數:無

      * 說 明: 跳過rom并溫度轉化

      *************************************************************/

      void temp_change(void)

      {

      write_temp(0xcc);

      write_temp(0x44);

      }

      /*************************************************************

      * 名 稱:uint temp_get()

      * 功 能:DS18B20溫度獲取

      * 入口參數:無

      * 出口參數:T

      * 說 明: 獲取溫度并四舍五入為保留兩位小數

      *************************************************************/

      uint temp_get()

      {

      uchar a,b;

      DS18B20_init();

      delay(1);

      write_temp(0xcc);

      write_temp(0xbe);

      a=read_temp(); //讀低8位

      b=read_temp(); //讀高8位

      T=b;

      T<<=8;

      T=T |a;

      temp_f=T*0.0625; //乘以分辨率為實際溫度值

      T=(uint)(temp_f*100+0.5);

      return T;

      }

      /*************************************************************

      * 名 稱:void dis_temp(uint t)

      * 功 能:分出十位、個位等

      * 入口參數:t

      * 出口參數:無

      * 說 明: 送到1602顯示

      *************************************************************/

      void dis_temp(uint t)

      {

      shi=t/1000;

      ge=t%1000/100;

      dian1=t%1000%100/10;

      dian2=t%1000%100%10;

      }

      /*************************************************************

      * 名 稱:

      * 功 能:

      * 入口參數:

      * 出口參數:

      * 說 明:

      *************************************************************/

      void main(void)

      {

      uchar a;

      WDTCTL=WDTPW + WDTHOLD;

      LCD_display();

      while(1)

      {

      do

      {

      a =DS18B20_init();

      }

      while(a); //判斷初始化是否完成

      temp_change();

      for(a = 20;a > 0;a--)

      delay_us(60000);

      do

      {

      a = DS18B20_init();

      }

      while(a);

      dis_temp(temp_get());

      init();

      uinit();

      write_com(0x80+0x0b);

      write_date('0'+shi);

      delay(5);

      write_date('0'+ge);

      delay(5);

      write_date('.');

      delay(5);

      write_date('0'+dian1);

      delay(5);

      write_date('0'+dian2);

      delay(5);

      }

      }

      效果圖:上面的數字即為當前溫度

      



    關鍵詞: msp430 1602

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 漳平市| 诏安县| 宽甸| 大名县| 探索| 清水县| 集安市| 巴里| 临泽县| 蒲城县| 松江区| 宝山区| 萍乡市| 花垣县| 高青县| 夏河县| 阜阳市| 巩义市| 麟游县| 宜城市| 宣武区| 湟源县| 乐亭县| 双江| 峨山| 洛扎县| 务川| 琼海市| 盐山县| 偏关县| 登封市| 调兵山市| 房产| 南涧| 临城县| 桐庐县| 五常市| 竹北市| 加查县| 岳池县| 金华市|