基于msp430单片机1602 DS1802温度显示

嵌入式系统 时间:2016-08-25来源:网络

  最近调好了DS1802温度传感器,用的是430G2553单片机,温度保留两位小数。把源代码分享给大家。

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

  msp430g2553实现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; //1602 RS写数据(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使能信号关(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

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章


用户评论

请文明上网,做现代文明人
验证码:
查看电脑版