代码问题 求助 g2553+ds18b20+LCD1602

2019-07-15 16:46发布

问什么 温度不能刷新,显示不出当前温度。。。求大神解答,坐等回复...

#include <msp430g2553.h>
#include <intrinsics.h>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
#define RS P2OUT                //设置P2.0--rs
#define RW P2OUT                //设置P2.1--rw
#define EN P2OUT                //设置P2.2--en
#define  DQ_OUT P2DIR|=BIT3
#define  DQ_IN P2DIR&=~BIT3
#define  DQ_H P2OUT|=BIT3
#define  DQ_L P2OUT&=~BIT3
uchar datas[] ={"0123456789"};
uchar table1[]=" 21.0 32.0 43.0         ";
uchar table2[]="    Tem_C  ";
uchar table3[]="    HX_0_532  ";

void delayus(unsigned int z)
{
    unsigned int i,j;
    for(i = 0;i<20;i++)
      for(j=0;j<z;j++)
      {;;};
}
void delayMs(uint a)
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}

void DelayUs2x(unsigned char t)
{
        while(--t);
}

void writeComm(uchar comm)//写命令
{
        RS&=~BIT0;
        EN&=~BIT2;
        P1OUT&=0X00;
        P1OUT|=comm;
        delayMs(5);
        EN|=BIT2;
        EN&=~BIT2;
}


void writeData(uchar dat)//写数据
{
        RS|=BIT0;
        EN&=~BIT2;
        P1OUT&=0X00;
        P1OUT|=dat;
        delayMs(5);
        EN|=BIT2;
        EN&=~BIT2;
}

void init()//1602初始化
{
         uchar num;

         RW&=~BIT1;
         EN&=~BIT2;
          writeComm(0x38);
          writeComm(0x0c);
          writeComm(0x06);
          writeComm(0x01);

  writeComm(0x80);
        for(num=0;num<9;num++)
        {
                writeData(table2[num]);
                delayMs(100);
        }

        writeComm(0x80+0x40);
        for(num=0;num<12;num++)
        {
                writeData(table3[num]);
                delayMs(100);
        }

        delayMs(420);
        delayMs(300);
}
void writeString(uchar * str, uchar length)
{
     uchar i;
    for(i = 0; i < length; i++)
    {
         writeData(str[i]);
                        delayMs(100);
     }
}

void Init_DS18B20()  //18b20初始化函数
{
  DQ_OUT;
  _NOP();
  DQ_H;    //DQ复位
  delayus(2);  //稍做延时40us
  DQ_L;    //将DQ拉低
  delayus(25); //精确延时 大于 500us
  DQ_H;    //拉高总线
  delayus(3);//延时60us
         DQ_IN;
         _NOP();
        // if(P1IN&BIT6)
         //  error=1;
        // else error=0;
         DQ_OUT;
  DQ_H;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delayus(10);//延时200us
}
//读一个字节
uchar read_DS18B20(void)
{
        uchar i=0;
                uchar dt=0;
   DQ_OUT;
for(i=8;i>0;i--)
  {
   DQ_L; // 给脉冲信号
   dt>>=1;
          _NOP();
   DQ_H; // 给脉冲信号
          _NOP();
          DQ_IN;
   if(P1IN&BIT6)
    dt|=0x80;
   delayus(2);
          DQ_OUT;
          DQ_H;
          delayus(1);
  }
  return(dt);
}
//写一个字节
void writeByte(uchar dat)
{
   uchar i=0;
    DQ_OUT;
   for (i=8; i>0; i--)
   {
      DQ_L;
      if(dat&0x01)
        DQ_H;
      else
        DQ_L;
      delayus(2);
      DQ_H;
      dat>>=1;
   }
}

void sendChangeCmd()
{
    Init_DS18B20();
    delayMs(1);
    writeByte(0xcc);
    writeByte(0x44);
}
void sendReadCmd()
{
    Init_DS18B20();
    delayMs(1);
    writeByte(0xcc);
    writeByte(0xbe);
}

int getTmpValue()
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;


sendChangeCmd();
sendReadCmd();
a=read_DS18B20();//低四位
b=read_DS18B20();//高四位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625; //精确到0.0625
t= tt*10; //放大100倍输出
    return(t);
}

void display(int v)
{        uchar bai,shi,ge,xiao1;
        uint temp;
        sendChangeCmd();
    temp = abs(v);
        if(v < 0)
    writeData('-');
    else
        writeData('+');
        bai = temp / 1000;
    shi = temp % 1000 / 100;
    ge = temp % 100 / 10;
    xiao1 = temp % 10 ;
    if(bai!= 0)
    writeData(datas[bai]);
        if(shi!=0)
        writeData(datas[shi]);
        if(ge!=0)
        writeData(datas[ge]) ;
        else
        writeData('0');
         _NOP();
        writeData('.');
        writeData(datas[xiao1]);
}
/*void write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;

        writeComm(0x80+0x40+add);
        writeData(0x30+shi);
        writeData(0x30+ge);
}*/

void wrining()
{
        uchar num;
        writeComm(0x80+0x40);
for(num=0;num<16;num++)
                {
                        writeData(table1[num]);
                        delayMs(100);
                }
}

void main()
{
  uchar table[] = "   NOW_T:.....";
  WDTCTL=WDTPW+WDTHOLD;         //关闭看门狗
  BCSCTL1=CALBC1_1MHZ;          //BCSCTL1 Calibration Data for 1MHz
  DCOCTL=CALDCO_1MHZ;           //DCOCTL  Calibration Data for 1MHz
  BCSCTL2=SELM_1+DIVM_0;        //设置MCLK为1MHZ

  P1SEL&=0X00;                  //设置P1口为I/O模式
  P2SEL&=0X00;                  //设置P2口为I/O模式
  P1DIR|=0XFF;                  //设置P1口为输出模式
  P2DIR|=0XFF;                  //设置P2口为输出模式
  P1OUT&=0X00;
  P2OUT&=0X00;

  init();
  writeComm(0x80);
  writeString(table,14);
  wrining();
  sendChangeCmd();
  while(1)
  {

          delayMs(100);
          writeComm(0x80+9);
          display(getTmpValue());
          sendChangeCmd();
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。