[求助] ds18b20温度传感器用12232液晶显示不了,不知道程序哪里错了,请大神帮忙

lkj1234lkj6789   2014-8-14 10:21 楼主
#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit          DQ         =P3^3;                       //数据口define interface
sbit          LCS        =P1^2;
sbit          LDATA        =P1^1;
sbit          LCLK        =P1^0;

uint A1;                           //温度值 variable of temperature
uchar   code table[]="0123456789";
uchar   table1[]="温度:";
uchar   table2[]=".";
uchar   table3[]="C";
uchar   table4[]="-";
uchar MSB; //温度高字节
uchar LSB; //温度低字节
int t1=0; //温度整数部分数值
uint t2=0; //温度小数部分数值
uchar flag; //负温度标志


/*************精确延时函数*****************/
/*******************************************************************************
* @function    delay 1 ms and delay 1us
*
* @param      
* @return      none
*
* @attention   The crystal is 22.1184M   Suggest range: 8-12 us
*******************************************************************************/
void Delay(uint z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void  Delay_10us(uint xms)
{
    uchar i;
        for(i=xms;i>0;i--);
}
//延时函数
void delay_us(uchar count)
{
        uchar i;
        for(i=0;i }

/*******************************************************************************
* @function    write a byte to LCD12232 (serial)
*
* @param       datx: data to LCD12232
* @return      none
*
* @attention   If the SCLK cycle is too short(e.g. 5us) or too long(e.g. 15us),
                Suggest range: 8-12 us
*******************************************************************************/
void wrbyte_12232(char datx)
{
    char i;

    for(i=0; i<8; i++)
    {                                   /* Data = Highest bit                 */
        if(datx & 0x80)                 
        {
            LDATA=1;                      /* Data = 1                           */
        }
        else
        {
            LDATA=0;                      /* Data = 0                           */
        }
        
        LCLK=1;                        
        Delay_10us(10);                /* delay 10us                         */
        LCLK=0;
        Delay_10us(10);                /* delay 10us                         */
        
        datx = datx << 1;               /* next bit                           */
    }
}

/*******************************************************************************
* @function    write command to LCD12232 (1st line = 0x80; 2nd line = 0x90)               
*
* @param       com: the command to LCD12232
* @return      none
*******************************************************************************/
void wr_com(char com)
{                                       
    LCS=1;                               /* CS = 1, start serial transfer      */                  
    wrbyte_12232(0xf8);                 /* 1 1 1 1 1 RW RS 0                  */
    wrbyte_12232(com & 0xf0);           /* D7 D6 D5 D4 0 0 0 0                */
    wrbyte_12232((com << 4) & 0xf0);    /* D3 D2 D1 D0 0 0 0 0                */
    LCS=0;                               /* CS = 0, stop serial transfer       */
    Delay_10us(100);
}

/*******************************************************************************
* @function    write data to LCD12232
*
* @param       dat: the data to LCD12232
* @return      none
*******************************************************************************/
void wr_data(char dat)
{                                       
    LCS=1;                               /* CS = 1, start serial transfer      */                  
    wrbyte_12232(0xfa);                 /* 1 1 1 1 1 RW RS 0                  */
    wrbyte_12232(dat & 0xf0);           /* D7 D6 D5 D4 0 0 0 0                */
    wrbyte_12232((dat << 4) & 0xf0);    /* D3 D2 D1 D0 0 0 0 0                */
    LCS=0;                               /* CS = 0, stop serial transfer       */
    Delay_10us(100);
}

/*******************************************************************************
* @function    Initialize LCD12232
*
* @param       none
* @return      none
*******************************************************************************/
void LCD12232_Init()
{   
   // P2DIR |= LCS+LDATA+LCLK;            /* LCD12232端口初始化                 */
    Delay(20);                    /* delay for start LCD                */
    LCLK=0;                             /* Initial SCLK                       */
   
    wr_com(0x30);                       /*8-bits interface & basic instruction*/
    wr_com(0x02);                       /* clear DDRAM                        */
    wr_com(0x06);                       /* DIR --> (right , AC++)             */
    wr_com(0x0c);                       /* display ON & cursor OFF            */
    wr_com(0x01);                       /* clear screen                       */
}

//初始化DS18B20
void DS18B20Init()
{
        uchar x=0;
        DQ = 1;      //DQ复位
        delay_us(9);    //稍做延时
        DQ = 0;      //单片机将DQ拉低
        delay_us(80);   //精确延时
        DQ = 1;      //拉高总线
        delay_us(15);
        x=DQ;       //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay_us(25);
}
//读一个字节
uchar ReadByte()
{
        uchar i;
        uchar ReadData=0;
        for(i=0;i<8;i++)
        {
                DQ=0;
                ReadData>>=1;
                DQ=1;
                if(DQ) ReadData|=0x80;
                delay_us(4);
        }
        return ReadData;
}
//写一个字节
void WriteByte(uchar WriteData)
{
        uchar i;
        uchar tmpData;
        for(i=0;i<8;i++)
        {
                tmpData=WriteData&0x01;
                WriteData>>=1;
                if(tmpData)
                {
                        DQ=0;
                        DQ=1;
                        delay_us(4);
                }
                else
                {
                        DQ=0;
                        delay_us(4);
                        DQ=1;
                }
        }
}
void GetT()
{
        uchar a;
        DS18B20Init(); //复位DS18B20
    WriteByte(0xCC); //跳过ROM配置
    WriteByte(0x44); //启动温度转换
    DS18B20Init();
    WriteByte(0xCC);
    WriteByte(0xBE); //读温度寄存器
    LSB=ReadByte(); //读温度数据低字节
    MSB=ReadByte(); //读温度数据高字节       
        MSB=MSB<<8; //得到温度整数部分
        MSB|=LSB;
        t2=MSB*625/1000; //得到温度小数部分并扩大10000倍
        //计算各位数码管要显示的数值
        wr_com(0x80);
        for(a=0;a<6;a++)
                wr_data(table1[a]);
        wr_com(0x80+4);
        A1=t2/100;
        if(A1==0)
                wr_data(' ');
        wr_data(table[t1%100/10]);
        wr_data(table2[0]);
        wr_data(table[t2%10]);
        wr_data(table3[0]);
}

void main()
{
        LCD12232_Init();
        while(1)
        {       
                GetT(); //计算温度       
        }
}

回复评论 (4)

我也不知道,你能用液晶显示别的数吗?
先要保证液晶能显示数。
点赞  2014-8-14 11:23
引用: jishuaihu 发表于 2014-8-14 11:23
我也不知道,你能用液晶显示别的数吗?
先要保证液晶能显示数。

能显示,但温度的取值没有
点赞  2014-8-14 14:53
那估计是读的不对吧,对比一下别人的18B20的程序看看,我以前用过,没有发现什么特别需要注意的地方、
点赞  2014-8-14 20:19
楼主初始化 18B20 之后进行一次 读取序列码然后检验看看
点赞  2014-8-14 23:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复