最近調好了DS1802溫度傳感器,用的是430G2553單片機,溫度保留兩位小數。把源代碼分享給大家。 /***************************************** msp430g2553實(shí)現1602溫度顯示 來(lái)源:汪中原的博客 ******************************************/ #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數據端高電平輸入(P2.3端口) #define ds_0 P2OUT &=~BIT3 //DS18B20數據端低電平輸入(P2.3端口) #define lcdrs_1 P2OUT |=BIT1; //1602 RS寫(xiě)數據(P2.1端口) #define lcdrs_0 P2OUT &=~BIT1; //1602 RS寫(xiě)指令(P2.1端口) #define lcden_1 P2OUT |=BIT0; //1602使能信號開(kāi)(P2.0端口) #define lcden_0 P2OUT &=~BIT0; //1602使能信號關(guān)(P2.0端口) uchar table[]="wzy,come on"; //開(kāi)機第一行顯示 uchar table1[]="believe yourself"; //開(kāi)機第二行顯示 uint temp,T; float temp_f; uchar shi,ge,dian1,dian2,num; //定義溫度十位、各位、小數點(diǎn)后一位、后二位 /************************************************************* * 名 稱(chēng):void init(void) * 功 能:1602顯示配置端口初始化 * 入口參數:無(wú) * 出口參數:無(wú) * 說(shuō) 明: P1、P2端口設為輸出低電平 *************************************************************/ void init(void) { WDTCTL=WDTPW + WDTHOLD; P1DIR=0xff; P2DIR=0x1f; P1OUT=0x00; P2OUT=0x00; } /************************************************************* * 名 稱(chēng):void delay(uint a) * 功 能:簡(jiǎn)單的延時(shí) * 入口參數:uint a * 出口參數:無(wú) * 說(shuō) 明: 可作為1602顯示簡(jiǎn)單的延時(shí) *************************************************************/ void delay(uint a) { uint i,j; for(i=a;i>0;i--) for(j=110;j>0;j--); } /************************************************************* * 名 稱(chēng):void write_date(uchar date) * 功 能:1602寫(xiě)數據 * 入口參數:date * 出口參數:無(wú) * 說(shuō) 明: 用P1口輸入數據 *************************************************************/ void write_date(uchar date) { lcdrs_1; P1OUT=date; delay(5); lcden_1; delay(5); lcden_0; } /************************************************************* * 名 稱(chēng):void write_com(uchar com) * 功 能:1602寫(xiě)指令 * 入口參數:com * 出口參數:無(wú) * 說(shuō) 明: 用P1口輸入指令 *************************************************************/ void write_com(uchar com) { lcdrs_0; P1OUT=com; delay(5); lcden_1; delay(5); lcden_0; } /************************************************************* * 名 稱(chēng):void uinit() * 功 能:初始化及其他顯示設置指令 * 入口參數:無(wú) * 出口參數:無(wú) * 說(shuō) 明: 1602初始化設置 *************************************************************/ void uinit() { lcden_0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } /************************************************************* * 名 稱(chēng):void LCD_display() * 功 能:1602顯示 * 入口參數:無(wú) * 出口參數:無(wú) * 說(shuō) 明: 將前幾個(gè)函數綜合起來(lái),顯示字符內容及區域 *************************************************************/ void LCD_display() { init(); uinit(); write_com(0x80); for(num=0;num>= 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; } /************************************************************* * 名 稱(chēng):void write_temp(uchar data) * 功 能:DS18B20寫(xiě)入數據 * 入口參數:data * 出口參數:無(wú) * 說(shuō) 明: 寫(xiě)入一個(gè)字節 *************************************************************/ void write_temp(uchar data) { uchar i; for(i = 0; i >= 1; ds_1; delay_us(10); } } /************************************************************* * 名 稱(chēng):void temp_change(void) * 功 能:DS18B20溫度轉化指令 * 入口參數:無(wú) * 出口參數:無(wú) * 說(shuō) 明: 跳過(guò)rom并溫度轉化 *************************************************************/ void temp_change(void) { write_temp(0xcc); write_temp(0x44); } /************************************************************* * 名 稱(chēng):uint temp_get() * 功 能:DS18B20溫度獲取 * 入口參數:無(wú) * 出口參數:T * 說(shuō) 明: 獲取溫度并四舍五入為保留兩位小數 *************************************************************/ 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 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); } } 效果圖:上面的數字即為當前溫度 |