2081|4

69

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用msp430为什么显示不出温度 [复制链接]

#include



#define uchar unsigned char

#define uint  unsigned int

//#include
#define SID_1 P1OUT |= BIT4    //    r/w
#define SID_0 P1OUT &= ~BIT4
#define SCLK_1 P1OUT |= BIT2   //    en
#define SCLK_0 P1OUT &= ~BIT2
#define CS_1 P1OUT |= BIT3     //    rs
#define CS_0 P1OUT &= ~BIT3
#define DQ P1IN&BIT6
#define DQ_1 P1OUT |=BIT6;    //20sbit  DQ = P3^2;                       //数据口define interface
#define DQ_0 P1OUT &=~BIT6;
uint temp;                           //温度值 variable of temperature

void delay(uchar t)             //延时函数

{

uint x,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}



uchar CMDAddress;
//
//sbit RS=P2^5;
//
//sbit RW=P2^1;
//
//sbit EN=P2^2;





void sendbyte(unsigned char zdata)
{
        unsigned int i;
        for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)
                        SID_1;
                else
                        SID_0;
                SCLK_0;
                SCLK_1;
        }
}

void write_cmd(uchar cmdcode)
{
        CS_1;
        sendbyte(0xf8);
        sendbyte(cmdcode & 0xf0);
        sendbyte((cmdcode << 4) & 0xf0);
        delay(2);
}

void write_date(uchar Dispdata)
{
        CS_1;
        sendbyte(0xfa);
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        delay(2);
}

void init()                       //初始化

{

delay(100);

write_cmd(0x30);      //Extended Function Set(功能设定控制字)基本指令集 ,8位

delay(1);

write_cmd(0x30);       //Function Set 基本指令集

delay(1);

write_cmd(0x0c);       //(显示开关控制字),全部显示ON,游标OFF,闪烁OFF

delay(1);

write_cmd(0x01);      //清屏控制字

delay(15);

write_cmd(0x06);   //Entry Mode (进入设定点控制字)光标从左向右加一位移动

delay(1);

}

void SetAddress(uchar x,uchar y)             //设置输入数据位置

{

switch(y)

{

  case 0:CMDAddress=0x80+x;break;

  case 1:CMDAddress=0x90+x;break;

  case 2:CMDAddress=0x88+x;break;

  case 3:CMDAddress=0x98+x;break;

}

write_cmd(CMDAddress);

}

void putstring(uchar x,uchar y,uchar *pdate)             //该行是否完

{

SetAddress(x,y);

while(*pdate!='\0')

{

   write_date(*pdate++);

}

}

void show()                               //显示“温度”

{

putstring(0,0,"温度:");              //第一排首位子显示“温度”两字

    putstring(0,3,"液晶温度显示");        //第三排首位子显示“液晶温度显示”

}

void display(uint Temp )                 // 显示温度值

{

uint t1,t2,t3 ;    //,t0,t1,t2

t1=Temp/100%10;

t2=Temp/10%10;

t3=Temp%10;

write_cmd(0x93);

write_date(0x30+t1);

write_date(0x30+t2);

write_date('.');

write_date(0x30+t3);

write_date(0xA1);

write_date(0xE6);

}



void delay2(unsigned char i)           //延时函数

{

while(--i);

}

void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command

{

DQ_1;                     //DQ复位,不要也可行。

delay2(1);                  //稍做延时

DQ_0;                    //单片机拉低总线

delay2(480);                //精确延时,维持至少480us

DQ_1;                    //释放总线,即拉高了总线

delay2(100);                //此处延时有足够,确保能让DS18B20发出存在脉冲。

}

uchar Read_One_Byte()       //读取一个字节的数据read a byte date

                            //读数据时,数据以字节的最低有效位先从总线移出

{

uchar i   = 0;

uchar dat = 0;

for(i=8;i>0;i--)

{

    DQ_0;                 //将总线拉低,要在1us之后释放总线
    _NOP();
                            //单片机要在此下降沿后的15us内读数据才会有效。

    _NOP();                 //至少维持了1us,表示读时序开始

    dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。

    DQ_1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上

    delay2(5);                 //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
    P1DIR &=~BIT6;
    if((DQ&BIT6)==1)                   //控制器进行采样

    {

     dat |= 0x80;    //总线为1, DQ为1,那就把dat的最高位置1;若为0,不处理,保持0

    }

    delay2(60);               //此延时不能少,确保读时序的长度60us。

}

return (dat);

}

void Write_One_Byte(uchar dat)

{

uchar i = 0;

for(i=8;i>0;i--)

{

    DQ_0;                        //拉低总线

    _NOP();
    _NOP(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始

   if(dat&0x01)                 //从字节的最低位开始传输
   {
           DQ_1;
           delay2(60);       //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
   }
   else
   {
           delay(65); DQ_1;
   }

                                  //因为15us后DS18B20会对总线采样。

                         //必须让写时序持续至少60us

                          //写完后,必须释放总线,

    dat >>= 1;

    delay2(2);

}

}

uint Get_Tmp()                   //获取温度get the temperature

{

float tt;

uchar a,b;

Init_Ds18b20();                //初始化

Write_One_Byte(0xcc);          //忽略ROM指令

Write_One_Byte(0x44);          //温度转换指令

Init_Ds18b20();                 //初始化

Write_One_Byte(0xcc);          //忽略ROM指令

Write_One_Byte(0xbe);          //读暂存器指令

a = Read_One_Byte();           //读取到的第一个字节为温度LSB

b = Read_One_Byte();           //读取到的第一个字节为温度MSB

temp = b;                      //先把高八位有效数据赋于temp

temp <<= 8;                    //把以上8位数据从temp低八位移到高八位

temp = temp|a;                //两字节合成一个整型变量

tt = temp*0.0625;           //得到真实十进制温度值,DS18B20可以精确到0.0625度

                            //所以读回数据的最低位代表的是0.0625度

temp = tt*10+0.5;   //放大十倍,目的是将小数点后第一位也转换为可显示数字

return temp;

}

void main()

{WDTCTL = WDTPW + WDTHOLD;
P1DIR = BIT4 + BIT2 + BIT3+BIT6;

delay(50);

init();

delay(10);

show();

while(1)

{

  display(Get_Tmp());

}

}










此帖出自单片机论坛

最新回复

建议楼主显示和温度采集分别编好程序,测试成功后在联调,这样容易做出来哦  详情 回复 发表于 2014-8-27 19:18
点赞 关注
 

回复
举报

4005

帖子

0

TA的资源

版主

沙发
 
具体一点
此帖出自单片机论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
想把18b20的温度采集起来,用12864显示,但温度显示总是0,
此帖出自单片机论坛
 
 
 

回复

165

帖子

2

TA的资源

一粒金砂(中级)

4
 
建议楼主显示和温度采集分别编好程序,测试成功后在联调,这样容易做出来哦
此帖出自单片机论坛
 
个人签名好好学习,天天向上
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

5
 
恩恩,谢谢
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表