新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于msp430單片機(jī)1602 DS1802溫度顯示

        基于msp430單片機(jī)1602 DS1802溫度顯示

        作者: 時(shí)間:2016-08-25 來源:網(wǎng)絡(luò) 收藏

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

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

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

          g2553實(shí)現(xiàn)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)) //延時(shí)x us

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

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

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

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

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

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

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

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

          uint temp,T;

          float temp_f;

          uchar shi,ge,dian1,dian2,num; //定義溫度十位、各位、小數(shù)點(diǎn)后一位、后二位

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

          * 名 稱:void init(void)

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

          * 入口參數(shù):無

          * 出口參數(shù):無

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

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

          void init(void)

          {

          WDTCTL=WDTPW + WDTHOLD;

          P1DIR=0xff;

          P2DIR=0x1f;

          P1OUT=0x00;

          P2OUT=0x00;

          }

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

          * 名 稱:void delay(uint a)

          * 功 能:簡單的延時(shí)

          * 入口參數(shù):uint a

          * 出口參數(shù):無

          * 說 明: 可作為1602顯示簡單的延時(shí)

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

          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寫數(shù)據(jù)

          * 入口參數(shù):date

          * 出口參數(shù):無

          * 說 明: 用P1口輸入數(shù)據(jù)

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

          void write_date(uchar date)

          {

          lcdrs_1;

          P1OUT=date;

          delay(5);

          lcden_1;

          delay(5);

          lcden_0;

          }

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

          * 名 稱:void write_com(uchar com)

          * 功 能:1602寫指令

          * 入口參數(shù):com

          * 出口參數(shù):無

          * 說 明: 用P1口輸入指令

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

          void write_com(uchar com)

          {

          lcdrs_0;

          P1OUT=com;

          delay(5);

          lcden_1;

          delay(5);

          lcden_0;

          }

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

          * 名 稱:void uinit()

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

          * 入口參數(shù):無

          * 出口參數(shù):無

          * 說 明: 1602初始化設(shè)置

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

          void uinit()

          {

          lcden_0;

          write_com(0x38);

          write_com(0x0c);

          write_com(0x06);

          write_com(0x01);

          }

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

          * 名 稱:void LCD_display()

          * 功 能:1602顯示

          * 入口參數(shù):無

          * 出口參數(shù):無

          * 說 明: 將前幾個(gè)函數(shù)綜合起來,顯示字符內(nèi)容及區(qū)域

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

          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初始化

          * 入口參數(shù):無

          * 出口參數(shù):error

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

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

          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數(shù)據(jù)

          * 入口參數(shù):無

          * 出口參數(shù):temp

          * 說 明: 讀取一個(gè)字節(jié)

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

          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寫入數(shù)據(jù)

          * 入口參數(shù):data

          * 出口參數(shù):無

          * 說 明: 寫入一個(gè)字節(jié)

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

          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溫度轉(zhuǎn)化指令

          * 入口參數(shù):無

          * 出口參數(shù):無

          * 說 明: 跳過rom并溫度轉(zhuǎn)化

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

          void temp_change(void)

          {

          write_temp(0xcc);

          write_temp(0x44);

          }

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

          * 名 稱:uint temp_get()

          * 功 能:DS18B20溫度獲取

          * 入口參數(shù):無

          * 出口參數(shù):T

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

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

          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; //乘以分辨率為實(shí)際溫度值

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

          return T;

          }

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

          * 名 稱:void dis_temp(uint t)

          * 功 能:分出十位、個(gè)位等

          * 入口參數(shù):t

          * 出口參數(shù):無

          * 說 明: 送到1602顯示

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

          void dis_temp(uint t)

          {

          shi=t/1000;

          ge=t%1000/100;

          dian1=t%1000%100/10;

          dian2=t%1000%100%10;

          }

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

          * 名 稱:

          * 功 能:

          * 入口參數(shù):

          * 出口參數(shù):

          * 說 明:

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

          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);

          }

          }

          效果圖:上面的數(shù)字即為當(dāng)前溫度

          



        關(guān)鍵詞: msp430 1602

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 淮北市| 鞍山市| 富锦市| 大理市| 韶山市| 肥西县| 开原市| 仪陇县| 双桥区| 玉山县| 永仁县| 勃利县| 普陀区| 淮阳县| 镇坪县| 独山县| 志丹县| 多伦县| 道真| 陇南市| 阿克陶县| 泗阳县| 灵石县| 彭水| 理塘县| 淮阳县| 德兴市| 承德县| 从江县| 南昌县| 武川县| 恩平市| 西乌珠穆沁旗| 台州市| 永善县| 武邑县| 石狮市| 开江县| 武山县| 松阳县| 鹤峰县|