新聞中心

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

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

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

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

本文引用地址:http://www.butianyuan.cn/article/201608/296038.htm

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

  g2553實(shí)現(xiàn)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數(shù)據(jù)端高電平輸入(P2.3端口)

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

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

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

  #define lcden_1 P2OUT |=BIT0; //1602使能信號(hào)開(kāi)(P2.0端口)

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

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

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

  uint temp,T;

  float temp_f;

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

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

  * 名 稱(chēng):void init(void)

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

  * 入口參數(shù):無(wú)

  * 出口參數(shù):無(wú)

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

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

  void init(void)

  {

  WDTCTL=WDTPW + WDTHOLD;

  P1DIR=0xff;

  P2DIR=0x1f;

  P1OUT=0x00;

  P2OUT=0x00;

  }

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

  * 名 稱(chēng):void delay(uint a)

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

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

  * 出口參數(shù):無(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ě)數(shù)據(jù)

  * 入口參數(shù):date

  * 出口參數(shù):無(wú)

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

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

  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ě)指令

  * 入口參數(shù):com

  * 出口參數(shù):無(wú)

  * 說(shuō) 明: 用P1口輸入指令

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

  void write_com(uchar com)

  {

  lcdrs_0;

  P1OUT=com;

  delay(5);

  lcden_1;

  delay(5);

  lcden_0;

  }

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

  * 名 稱(chēng):void uinit()

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

  * 入口參數(shù):無(wú)

  * 出口參數(shù):無(wú)

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

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

  void uinit()

  {

  lcden_0;

  write_com(0x38);

  write_com(0x0c);

  write_com(0x06);

  write_com(0x01);

  }

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

  * 名 稱(chēng):void LCD_display()

  * 功 能:1602顯示

  * 入口參數(shù):無(wú)

  * 出口參數(shù):無(wú)

  * 說(shuō) 明: 將前幾個(gè)函數(shù)綜合起來(lái),顯示字符內(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);

  }

  }

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

  * 名 稱(chēng):uchar DS18B20_init(void)

  * 功 能:DS18B20初始化

  * 入口參數(shù):無(wú)

  * 出口參數(shù):error

  * 說(shuō) 明: 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;

  }

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

  * 名 稱(chēng):uint read_temp(void)

  * 功 能:讀取DS18B20數(shù)據(jù)

  * 入口參數(shù):無(wú)

  * 出口參數(shù):temp

  * 說(shuō) 明: 讀取一個(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;

  }

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

  * 名 稱(chēng):void write_temp(uchar data)

  * 功 能:DS18B20寫(xiě)入數(shù)據(jù)

  * 入口參數(shù):data

  * 出口參數(shù):無(wú)

  * 說(shuō) 明: 寫(xiě)入一個(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);

  }

  }

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

  * 名 稱(chēng):void temp_change(void)

  * 功 能:DS18B20溫度轉(zhuǎn)化指令

  * 入口參數(shù):無(wú)

  * 出口參數(shù):無(wú)

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

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

  void temp_change(void)

  {

  write_temp(0xcc);

  write_temp(0x44);

  }

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

  * 名 稱(chēng):uint temp_get()

  * 功 能:DS18B20溫度獲取

  * 入口參數(shù):無(wú)

  * 出口參數(shù):T

  * 說(shuō) 明: 獲取溫度并四舍五入為保留兩位小數(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;

  }

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

  * 名 稱(chēng):void dis_temp(uint t)

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

  * 入口參數(shù):t

  * 出口參數(shù):無(wú)

  * 說(shuō) 明: 送到1602顯示

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

  void dis_temp(uint t)

  {

  shi=t/1000;

  ge=t%1000/100;

  dian1=t%1000%100/10;

  dian2=t%1000%100%10;

  }

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

  * 名 稱(chēng):

  * 功 能:

  * 入口參數(shù):

  * 出口參數(shù):

  * 說(shuō) 明:

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

  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

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉