基于msp430單片機1602 DS1802溫度顯示
最近調(diào)好了DS1802溫度傳感器,用的是430G2553單片機,溫度保留兩位小數(shù)。把源代碼分享給大家。
本文引用地址:http://2s4d.com/article/201608/296038.htm/*****************************************
msp430g2553實現(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)) //延時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; //1602 RS寫數(shù)據(jù)(P2.1端口)
#define lcdrs_0 P2OUT &=~BIT1; //1602 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"; //開機第一行顯示
uchar table1[]="believe yourself"; //開機第二行顯示
uint temp,T;
float temp_f;
uchar shi,ge,dian1,dian2,num; //定義溫度十位、各位、小數(shù)點后一位、后二位
/*************************************************************
* 名 稱: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ù):uint a
* 出口參數(shù):無
* 說 明: 可作為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寫數(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ù):無
* 說 明: 將前幾個函數(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
* 說 明: 讀取一個字節(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ù):無
* 說 明: 寫入一個字節(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; //乘以分辨率為實際溫度值
T=(uint)(temp_f*100+0.5);
return T;
}
/*************************************************************
* 名 稱:void dis_temp(uint t)
* 功 能:分出十位、個位等
* 入口參數(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)前溫度
評論