注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

W_中原的博客笔记

通知:新博客日志将更新到个人站点:http://www.zhgyuan.cn/

 
 
 

日志

 
 

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

2013-08-04 20:29:29|  分类: 嵌入式 |  标签: |举报 |字号 订阅

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


/*****************************************
msp430g2553实现1602温度显示
来源:汪中原的博客
******************************************/

#include <msp430G2553.H>
#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 DS1802温度显示 - W_中原 - 汪中原的博客

关注更多代码更新
 
  评论这张
 
阅读(428)| 评论(8)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017