打印
[国产单片机]

液晶1602显示18b20采集的温度程序——找错误

[复制链接]
1267|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
守一不移|  楼主 | 2014-5-14 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stc12.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code digit[10]={"0123456789"};                          //定义字符数组显示数字
unsigned char code Temp[]={"Temp:"};             //说明显示的是温度
unsigned char code Cent[]={"Cent"};              //温度单位

sbit DS=P1^1;
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
uchar TH,TL,TN,TD;


void delay(uint sum)                //延时函数
{
        uint i;
        for(i=sum;i>0;i--)
        _nop_();
}

void begin(void)                        //初始化
{
        uint i=4;
        DS=0;
        delay(720);
        DS=1;
        while(i>0) i--;
}

void write(uchar dat)                //写数据
{
        uint i=0;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat&0x01;
                dat=dat>>1;
                if(testb)
                {
                        DS=0;
                        i++;i++;
                        DS=1;
                        delay(50);
                }
                else
                {
                        DS=0;
                        delay(60);
                        DS=1;
                        i++;i++;
                }
        }
}

bit readbit(void)      //读取一位
{
        uint i;
        bit dat;
        DS=0;
        i++;
        DS=1;
        i++;i++;
        dat=DS;
        delay(50);
        return(dat);        
}

uchar read(void)             //读取一个字节
{
        uint i;
        uchar j,dat=0;
        for(i=1;i<=8;i++)
        {
                j=readbit();
            dat=(j<<7)|(dat>>1);  
        }
        return(dat);
}

void wenduchange()           //温度转换
{
        begin();
        delay(1);
        write(0xcc);
        write(0x44);
        delay(100);
}

wendu()                 //读取温度数值
{
//        float tempp;
        begin();
        delay(1);
        write(0xcc);
        write(0xbe);
//        TL=read();
//        TH=read();
//        temp=TH;
//        temp<<=8;
//        temp=temp|TL;
//        tempp=temp*0.0625;
//         temp=tempp*10+0.5;
//        return temp;         
}

void write_date(uchar date)                           //对液晶写入数据
{
        rs=1;
        rw=0;
        P0=date;
        delay(1000);
        en=1;
        delay(1000);
        en=0;
}

void write_com(uint com)                        //对液晶写入指令
{
        rs=0;
        rw=0;
        P0=com;
        delay(1000);
        en=1;
        delay(1000);
        en=0;
}

void init()                                           //1602初始化
{
        en=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
//        write_com(0x80+0x10);
}

void display_symbol(void)                   //显示温度字符
{
        uint num;
        write_com(0x80);
        for(num=0;num<4;num++)
        {
                write_date(Temp[num]);        
        }
}

void display_cent(void)                        //显示温度单位
{
        uint num;
        write_com(0x80+0x0b);
        for(num=0;num<4;num++)
        {
                write_date(Cent[num]);
        }
}

void display_dot()                   //显示温度小数点
{
        write_com(0x80+0x08);
        write_date('.');
}

void display_temp1(uchar x)                  //显示温度整数部分
{
        uchar j,k,l;
        j=x/100;
        k=(x%100)/10;
        l=x%10;
        write_com(0x80+0x05);
        write_date(digit[j]);
        write_date(digit[k]);
        write_date(digit[l]);
        delay(50000);        
}

void display_temp2(uchar x)                   //显示温度小数部分
{
        write_com(0x80+0x09);
        write_date(digit[x]);
        delay(1000);        
}

void main()
{
//        uchar TH,TL,TN,TD;
        init();
        delay(5000);
        display_symbol();
        display_dot();
        display_cent();
        while(1)
        {
                 wenduchange();
                wendu();
                TL=read();
                TH=read();
                TN=TH*16+TL/16;
                TD=(TL%16)*10/16;
                display_temp1(TN);    //显示温度的整数部分
                   display_temp2(TD);    //显示温度的小数部分
                   delay(1000);
        }

}
温度显示为255,9而且不变,不知道原因在哪?求解

相关帖子

沙发
wangch_sh| | 2014-8-29 15:03 | 只看该作者
时序问题

使用特权

评论回复
板凳
一往直前| | 2014-8-31 21:28 | 只看该作者
错了啊、时序自己检查,你这种写法很有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝