找回密码
 立即注册

QQ登录

只需一步,快速开始

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

lcd1602显示DS1302的时间,咋在47秒和57秒的时候就显示3.14的符号

[复制链接]
跳转到指定楼层
楼主
ID:250781 发表于 2017-11-21 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要是再加个18B20的话,温度只显示4个0,单独显示温度又没问题,不知哪位能指点我这棵小白菜

#include <reg52.H>
#include <lcd1602.H>
#include <ds1302.H>                                                         
/*******************************************************************************
* 函数名         :LCDWriteData()
* 函数功能                 :1602显示与时间温度函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void LCDWriteData()
{         LCD1602WriteCom(0x80);
         LCD1602WriteData('2');                                  //2
         LCD1602WriteData('0');                                  //0
         LCD1602WriteData('0'+TIME[6]/16);          //1
         LCD1602WriteData('0'+(TIME[6]&0x0f));//7年
         LCD1602WriteData('-');                                  //-
         LCD1602WriteData('0'+TIME[4]/16);          //0
         LCD1602WriteData('0'+(TIME[4]&0x0f));//5月
         LCD1602WriteData('-');                                  //-
         LCD1602WriteData('0'+TIME[3]/16);          //0
         LCD1602WriteData('0'+(TIME[3]&0x0f));//7号

         LCD1602WriteCom(0x8b);
         LCD1602WriteData('0'+(TIME[5]&0x0f));//星期6

         LCD1602WriteCom(0xc0);
         LCD1602WriteData('0'+TIME[2]/16);           //时
         LCD1602WriteData('0'+(TIME[2]&0x0f));
         LCD1602WriteData(':');
         LCD1602WriteData('0'+TIME[1]/16);           //分
         LCD1602WriteData('0'+(TIME[1]&0x0f));
         LCD1602WriteData(':');
         LCD1602WriteData('0'+TIME[0]/16);           //秒
         LCD1602WriteData('0'+(TIME[0]&0x0f));         
                                                                                          
       

}

void main()
{
          Ds1302Init();           //1302初始化
          LCD1602Init();   //1602初始化
         while(1)
         {          Ds1302ReadTime();        //读取时钟信息
          LCDWriteData();        //1602显示与时间温度函数

         }
}
#include <ds1302.H>

//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x25, 0x11, 0x06, 0x16};                         
                                                                                                                       
/*******************************************************************************
* 函 数 名         : Ds1302Write
* 函数功能                   : 向DS1302命令(地址+数据)
* 输    入         : addr,dat
* 输    出         : 无
*******************************************************************************/
                                                                                                               
void Ds1302Write(uchar addr, uchar dat)
{
                uchar i;
                DS1302_RST=0;
                _nop_();

                DS1302_LCDK=0;
                _nop_();

                DS1302_RST=1;
                _nop_();

                for(i=0;i<8;i++)
                {
                  DS1302_IO=addr&0x01;
                  addr>>=1;
                  DS1302_LCDK=1;
                  _nop_();
                  DS1302_LCDK=0;
                  _nop_();
               
                }

                for(i=0;i<8;i++)
                {
                  DS1302_IO=dat&0x01;
                  dat>>=1;
                  DS1302_LCDK=1;
                  _nop_();
                  DS1302_LCDK=0;
                  _nop_();
               
                }
          DS1302_RST=0;
                  _nop_();

}                                                                                                                  

/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能        : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/
                                                                                                                  
uchar Ds1302Read(uchar addr)
{
                uchar i,dat ,dat1;
                DS1302_RST=0;
                _nop_();

                DS1302_LCDK=0;
                _nop_();

                DS1302_RST=1;
                _nop_();

                for(i=0;i<8;i++)
                {
                  DS1302_IO=addr&0x01;
                  addr>>=1;
                  DS1302_LCDK=1;
                  _nop_();
                  DS1302_LCDK=0;
                  _nop_();
               
                }
                  _nop_();

                for(i=0;i<8;i++)
                {
                   dat1=DS1302_IO;
                   dat=(dat>>1)|(dat1<<7);
                   DS1302_LCDK=1;
                   _nop_();
                   DS1302_LCDK=0;
                   _nop_();

                }
                DS1302_RST=0;
                _nop_();
                DS1302_LCDK=1;
                _nop_();
                DS1302_IO=0;
                _nop_();
                DS1302_IO=1;
                _nop_();

                return dat;
}
                                                                                                                  
/*******************************************************************************
* 函 数 名         : Ds1302Init
* 函数功能                   : 初始化DS1302.
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
                                                                                                                 
void Ds1302Init()
{
           uchar i;
           Ds1302Write(0x8e, 0x00);
           for(i=0;i<7;i++)
           {
                   Ds1302Write(WRITE[i], TIME[i]);
           }
           Ds1302Write(0x8e, 0x80);
}
                                                                                                                  
/*******************************************************************************
* 函 数 名         : Ds1302ReadTime
* 函数功能                   : 读取时钟信息
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
                                                                                                               
void Ds1302ReadTime()
{
           uchar i;
           for(i=0;i<7;i++)
           {
                   TIME[i]=Ds1302Read(READ[i]);
           }
}                                                                                                                         

                                                                                                       










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

使用道具 举报

沙发
ID:96682 发表于 2017-11-22 00:19 | 只看该作者
就粘贴出来的源代码根本与 DS18B20 温度探头没有半毛钱关系。
回复

使用道具 举报

板凳
ID:164602 发表于 2017-11-22 08:28 | 只看该作者
很老的问题了。
1602同时显示1302和18B20的数据,如果仅仅是两个程序合并,那是不行的。
看这个:
问题终于解决了,虽然不知道为什么,现在总算实现了同时显示温度和时间了。
关键点是写地址读数据函数,多添加几条指令,加粗红色字体代码,如下:

uint8 read_1302(uint8 addr)//先向1302写地址,再读数据
{
uint8  dat;
RST=0;
_nop_();
CLCK=0;
_nop_();
RST=1;
_nop_();
DS1302WriteByte(addr);//写地址
dat=DS1302RradByte();//读数据
CLCK=1;
_nop_();
CLCK=0;
_nop_();

RST=0;
_nop_();
RST=1;
_nop_();
  _nop_();
IO = 0;
_nop_();
IO = 1;
_nop_();

return dat;

}
这是别人费了功夫找出来的方法。

这是我做的:

同学们,我只需要修改一个地方就可以了!!!!
首先,要感谢你,试验出了正确的结果!
在你的结果基础之上,我反复阅读程序,注意到,你的红色部分程序,其实就是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;        
}

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

究其原因,可能是两器件使能冲突。
解决此问题是今年3月的事儿。我在此论坛至少发了两次了。

评分

参与人数 1黑币 +5 收起 理由
dpjwang + 5 很给力!

查看全部评分

回复

使用道具 举报

地板
ID:250781 发表于 2017-11-22 18:06 来自手机 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-22 08:28
很老的问题了。
1602同时显示1302和18B20的数据,如果仅仅是两个程序合并,那是不行的。
看这个:

非常感谢,你能在百忙之中帮我从中找到不足之处,按照上面的方法除掉了哪条语句,现在温度能显示了,只是,现在温度的度号和3.14的符号还未能解决,真的非常感谢!我的1602是4位总线型
回复

使用道具 举报

5#
ID:252387 发表于 2017-11-22 19:28 | 只看该作者
可能是两器件使能冲突。
解决此问题是今年3月的事儿。我在此论坛至少发了两次了。
评分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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