找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5529|回复: 3
打印 上一主题 下一主题
收起左侧

单片机+LCD1602上怎么同时实时显示温度和时间问题求救

[复制链接]
跳转到指定楼层
楼主
把两个程序合在一起温度就只显示00.00了,按键是设置时间的,这是主函数,大家看看

void main()
{
        unsigned char i;
        Int0Configuration();
        LcdInit();
        Ds1302Init();
        while(1)
        {        
                if(SetState==0)
                {
                        Ds1302ReadTime();
                }
                else
                {
                        if(K1==0)
                        {
                                Delay10ms();  
                                if(K1==0)
                                {
                                        SetPlace++;
                                        if(SetPlace>=7)
                                                SetPlace=0;                                       
                                }

                                while((i<50)&&(K1==0))
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                        }
                        if(K2==0)
                        {
                                Delay10ms();   
                                if(K2==0)
                                {
                                        TIME[SetPlace]++;
                                        if((TIME[SetPlace]&0x0f)>9)
                                        {
                                                TIME[SetPlace]=TIME[SetPlace]+6;
                                        }
                                        if((TIME[SetPlace]>=0x60)&&(SetPlace<2))
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x24)&&(SetPlace==2))
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x32)&&(SetPlace==3))  
                                        {
                                                TIME[SetPlace]=0;        
                                        }
                                        if((TIME[SetPlace]>=0x13)&&(SetPlace==4))
                                        {
                                                TIME[SetPlace]=0;
                                        }        
                                        if((TIME[SetPlace]>=0x7)&&(SetPlace==5))  
                                        {
                                                TIME[SetPlace]=1;
                                        }               
//                                        if(SetPlace==5)   
//                                        {
//                                                TIME[SetPlace]=;
//                                        }        
                                }
                                
                                while((i<50)&&(K2==0))
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                                
                        }                                                
                }
                LcdTimeDisplay();        
                LcdTempDisplay(Ds18b20ReadTemp());
        }
        
}
void LcdTimeDisplay()
{
        LcdWriteCom(0x80+0X40);
        LcdWriteData('0'+TIME[2]/16);  
        LcdWriteData('0'+(TIME[2]&0x0f));                                 
        LcdWriteData('-');
        LcdWriteData('0'+TIME[1]/16);  
        LcdWriteData('0'+(TIME[1]&0x0f));        
        LcdWriteData('-');
        LcdWriteData('0'+TIME[0]/16);  
        LcdWriteData('0'+(TIME[0]&0x0f));

        LcdWriteCom(0x80);
        LcdWriteData('2');
        LcdWriteData('0');
        LcdWriteData('0'+TIME[6]/16);
        LcdWriteData('0'+(TIME[6]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[4]/16);  
        LcdWriteData('0'+(TIME[4]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[3]/16);
        LcdWriteData('0'+(TIME[3]&0x0f));
        LcdWriteCom(0x8D);
        LcdWriteData('0'+(TIME[5]&0x07));                     
}
void LcdTempDisplay(int temp)
{

          unsigned char i, datas[] = {0, 0, 0, 0, 0};
        float tp;  
        if(temp< 0)  
          {
                  LcdWriteCom(0x80);   
                SBUF='-';
                while(!TI);
                TI=0;      
            LcdWriteData('-');   
         
                temp=temp-1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;        

          }
         else
          {                        
                  LcdWriteCom(0x4a+0x80);   
            LcdWriteData('+');  
                SBUF='+';
                while(!TI);      
                TI=0;  
                tp=temp;
                temp=tp*0.0625*100+0.5;        

        }
        datas[0] = temp / 10000;
        datas[1] = temp % 10000 / 1000;
        datas[2] = temp % 1000 / 100;
        datas[3] = temp % 100 / 10;
        datas[4] = temp % 10;


        LcdWriteCom(0x4b+0x80);
        LcdWriteData('0'+datas[1]);
        SBUF = '0'+datas[1];
        while (!TI);
        TI = 0;

        LcdWriteCom(0x4c+0x80);
        LcdWriteData('0'+datas[2]);
        SBUF = '0'+datas[2];
        while (!TI);  
        TI = 0;

        LcdWriteCom(0x4d+0x80);
        LcdWriteData('.');
        SBUF = '.';
        while (!TI);  
        TI = 0;

        LcdWriteCom(0x4e+0x80);  
        LcdWriteData('0'+datas[3]);
        SBUF = '0'+datas[3];
        while (!TI);  
        TI = 0;

        LcdWriteCom(0x4f+0x80);   
        LcdWriteData('0'+datas[4]);
        SBUF = '0'+datas[4];
        while (!TI);  
        TI = 0;
        for(i=0; i<6; i++)
        {
                 SBUF = CNCHAR[ i];
                while (!TI);  
                TI = 0;
        }

}

IMG20190211111357.jpg (3.36 MB, 下载次数: 51)

IMG20190211111357.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2019-2-11 12:45 | 只看该作者
前面我回复过,因为有其它论坛的链接,没有通过!今天直接给你结果:


同学们,我只需要修改一个地方就可以了!!!!
首先,要感谢你,试验出了正确的结果!
在你的结果基础之上,我反复阅读程序,注意到,你的红色部分程序,其实就是1302的使能为高电平。
所以,最终的结果是:
在1302读数据之后,将原程序中的使能为低电平去掉,就可以了。
即:
原程序:
unsigned char Ds1302Read(unsigned char addr)//从DS1302读单字节数据
{
        unsigned char n,dat,dat1;//n为8位计数,dat为最终返回的数据
                                                        //dat1为接收的一位数据
        CE = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        CE = 1;//然后将CE置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);//此处可以用595的方法判断是0或是1
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

//        CE = 0;
        _nop_();//以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();

        return dat;        
}

红色那一条语句,原来有,现在我将它去掉,就好了。其它的什么都不用改。

究其原因,可能是两器件使能冲突。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:277550 发表于 2019-2-11 12:59 | 只看该作者
温度采集的部分,有问题

~~~~~~~~~~
回复

使用道具 举报

地板
ID:719762 发表于 2020-4-13 17:45 | 只看该作者
HC6800-ES-V2.0 发表于 2019-2-11 12:45
前面我回复过,因为有其它论坛的链接,没有通过!今天直接给你结果:

老哥,太感谢了,我也是被这个问题困惑了好久,按你的方法试了一下问题就解决了,感谢感谢。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表