找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51万年历+温度在1602上显示

[复制链接]
跳转到指定楼层
楼主
ID:210546 发表于 2017-6-12 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 18772299932 于 2017-6-12 18:27 编辑

我用的是普中科技51单片机的开发板,我参照别人的程序,再加上自己的想法在LCD1602上显示日历和温度,但温度不能在1602上正常显示,只是显示000.00,日历可以正常显示。我把日历和温度分开在1602上可以正常显示,是什么问题呢?求大神指教
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-6-12 18:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:34643 发表于 2017-6-12 19:35 | 只看该作者
把程序贴出来才好进行分析的啊。
回复

使用道具 举报

地板
ID:207302 发表于 2017-6-12 19:48 | 只看该作者
#include<reg52.h>  #include<intrins.h> #define uchar unsigned char #define uint unsigned int                                                     //定义的的4个键盘 sbit s1=P3^0;                                   //时钟功能键 sbit s2=P3^1;                                  //加键 sbit s3=P3^2;                                   //减键 sbit s4=P3^6;                                   //确认键 sbit s5=P3^3;                                   //闹钟功能键  sbit dula=P2^6;                                           //数码管操作 sbit wela=P2^7;  sbit lcden=P2^5;                          //液晶操作 sbit lcdrs=P1^0; sbit lcdrw=P1^1;  sbit rd=P3^7;                                 //为了分离出3个独立键盘  sbit FM=P2^3;         //蜂鸣器口  sbit ACC0=ACC^0;                                   //累加器喂ACC    这是位定义 sbit ACC7=ACC^7;   sbit sclk=P2^1;                                 //DS1302操作 sbit data1=P2^0; sbit rst=P2^4;  uchar s1num,flag1,flag2,s5num; int miao,shi,fen,nian,yue,ri,week,afen,ashi; int x1,x2;  uchar code table1[]="SUN";//星期字表 uchar code table2[]="MON"; uchar code table3[]="TUE"; uchar code table4[]="WED"; uchar code table5[]="THU";  uchar code table6[]="FRI"; uchar code table7[]="SAT";  void delayms(uint xms)                                 //延时函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); }  void di()                          //蜂鸣器函数 { FM=0; delayms(100); FM=1; }  void cmg88()          //关数码管函数 { dula=1; P0=0x00; dula=0; }  void write_com(uchar com)                        //液晶写命令函数 { lcdrs=0; lcden=0; P0=com; delayms(5); lcden=1; delayms(5); lcden=0; }  void write_date(uchar date)                         //液晶写数据函数 { lcdrs=1; lcden=0; P0=date; delayms(5); lcden=1; delayms(5); lcden=0; }  void Write1302(uchar dat)                           //向1302写一个字节数据 {   uchar i; ACC=dat; for(i=8;i>0;i--)  {  data1=ACC0;  sclk=1;  sclk=0;  ACC=ACC>>1;  }  }   void WriteSet1302(uchar Cmd,uchar dat)           //根据命令,向1302写一个字节数据  {                   rst=0;                 _nop_();                    sclk=0;                 _nop_();                      rst=1;                       delayms(2);                  Write1302(Cmd);               Write1302(dat);                 sclk=1;                       rst=0;             }  uchar Read1302()                                        //向1302读一个字节数据  { uchar i;  for(i=8;i>0;i--)  { ACC=ACC>>1; ACC7=data1; sclk=1;  sclk=0; } return(ACC);  }    uchar  ReadSet1302(uchar Cmd)                  //根据命令,向1302读一个字节数据  {   uchar dat;   rst=0;                   sclk=0;                   rst=1;                    Write1302(Cmd);         dat=Read1302();          sclk=1;                rst=0;                return(dat);          }   void inital_1302()                                                   //                初始化DS1302函数 {  WriteSet1302(0x8e,0x00);                                         //禁止写保护 WriteSet1302(0x90,0xaa);                                                        //定义充电 WriteSet1302(0x80,0x45);                                          //秒 WriteSet1302(0x84,0x18);                                           // 时 WriteSet1302(0x82,0x47);                                           // 分 WriteSet1302(0x8c,0x16);                                                //年 WriteSet1302(0x88,0x05);                                                 //月 WriteSet1302(0x86,0x23);                                                //日 WriteSet1302(0x8a,0x01);                                                 //星期 WriteSet1302(0xc0,0x07);                          //闹钟小时初始化 WriteSet1302(0xfc,0x30);                           //闹钟分钟初始化 WriteSet1302(0x8e,0x80);                                        //开写保护 }  void write_sfm(uchar add,uchar dat)                                           //时分秒函数 { uchar gw,sw; gw=dat%16; sw=dat/16; write_com(0x80+0x40+add); write_date(sw+0x30); write_date(gw+0x30); }  void write_nyr(uchar add,uchar dat)                                  //年月日函数 { uchar gw,sw; gw=dat%16; sw=dat/16; write_com(0x80+add); write_date(sw+0x30); write_date(gw+0x30); }  void write_week(uchar xq)                                  //写星期函数 { uchar x; write_com(0x80+12); switch(xq) { case 1: for(x=0;x<3;x++) { write_date(table1[x]); } break; case 2: for(x=0;x<3;x++) { write_date(table2[x]); } break; case 3: for(x=0;x<3;x++) { write_date(table3[x]); } break; case 4: for(x=0;x<3;x++) { write_date(table4[x]); } break; case 5: for(x=0;x<3;x++) { write_date(table5[x]); } break; case 6: for(x=0;x<3;x++) { write_date(table6[x]); } break; case 7: for(x=0;x<3;x++) { write_date(table7[x]); } break; } write_com(0x80+12); }  void init()                                        //初始化操作 { flag1=0; flag2=0; rd=0; dula=0; wela=0; lcdrw=0; lcden=0; fen=0; miao=0; shi=0; week=0; nian=0; yue=0; ri=0; s1num=0; s5num=0;  write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);  write_com(0x80+1);                 //在液晶上写一些固定的数 write_date('2'); write_date('0'); delayms(5);                   write_com(0x80+5);                   //在液晶上写一些固定的数 write_date('-'); delayms(5); write_com(0x80+8); write_date('-'); delayms(5);  write_com(0x80+0x40+3);           //时间部分的两个冒号 write_date(':'); delayms(5); write_com(0x80+0x40+6); write_date(':'); delayms(5); write_com(0x80+0x40+12); write_date(':'); delayms(5); }  void keyscan()                          //键盘扫描操作 { if(s1==0&&s5num==0)                                                  //时钟功能键  并且闹钟不处于调整状态 { delayms(5); if(s1==0&&s5num==0) { s1num++; flag1=1; while(!s1); di(); switch(s1num) { case 1: write_com(0x80+0x40+8); write_com(0x0f);                          //光标闪烁 break;  case 2: write_com(0x80+0x40+5);  break;  case 3: write_com(0x80+0x40+2); break;  case 4: write_com(0x80+14); break;  case 5: write_com(0x80+10); break;  case 6: write_com(0x80+7); break;  case 7: write_com(0x80+4); break;  case 8: flag1=0; s1num=0; write_com(0x0c); WriteSet1302(0x8e,0x00);  //第八次按时钟功能键后,把调整了的所有数据当前状态存入到DS1302中 WriteSet1302(0x80,miao);  WriteSet1302(0x84,shi); WriteSet1302(0x82,fen);  WriteSet1302(0x8a,week);  WriteSet1302(0x8c,nian);  WriteSet1302(0x88,yue); WriteSet1302(0x86,ri);  WriteSet1302(0x8e,0x80);  break; } } }  if(s1num!=0&&s5num==0)                                 //时钟加键 { if(s2==0) { delayms(5); if(s2==0) { while(!s2); di(); switch(s1num) { case 1:  x1=miao%16; x2=miao/16;  x1++; if(x1==10)  {  x1=0; x2++;  if(x2>=6) x2=0; } miao=x1+x2*16;  write_sfm(7,miao); write_com(0x80+0x40+8); break;  case 2: x1=fen%16; x2=fen/16;  x1++; if(x1==10)  {  x1=0; x2++;  if(x2>=6) x2=0; } fen=x1+x2*16;  write_sfm(4,fen); write_com(0x80+0x40+5); break;  case 3: x1=shi%16; x2=shi/16;  x1++; if(x1==10)  {  x1=0; x2++; } if(x2>=2&&x1>=4) { x1=0; x2=0; } shi=x1+x2*16;  write_sfm(1,shi); write_com(0x80+0x40+2); break;  case 4: x1=(week)%10; x2=(week)/10; x1++; if(x1==8) x1=1; week=x2*16+x1; write_week(week);    write_com(0x80+14); break;  case 5: x1=ri%16; x2=ri/16;  x1++; if(x1==10)  {  x1=0; x2++; }  if(x2==3&&x1==2) { x1=0; x2=0; } ri=x1+x2*16;  write_nyr(9,ri); write_com(0x80+10); break;  case 6: x1=yue%16; x2=yue/16;  x1++; if(x2==1&&x1==3)  {  x1=1; x2=0; }  if(x1==10) { x1=0; x2++; } yue=x1+x2*16;  write_nyr(6,yue); write_com(0x80+7); break;  case 7: x1=nian%16; x2=nian/16;  x1++; if((x2==9)&&(x1==10))  { x1=0; x2=0; } if(x1==10) { x2++; x1=0; } nian=x1+x2*16;  write_nyr(3,nian); write_com(0x80+4); break; } } }  if(s3==0)                                        //时钟减键 { delayms(5); if(s3==0)         { while(!s3); di(); switch(s1num) { case 1: x1=miao%16; x2=miao/16;  x1--; if(x1==-1)  {  x1=9; x2--;  if(x2==-1) x2=5; } miao=x1+x2*16;  write_sfm(7,miao); write_com(0x80+0x40+8); break;  case 2: x1=fen%16; x2=fen/16;  x1--; if(x1==-1)  {  x1=9; x2--;  if(x2==-1) x2=5; } fen=x1+x2*16;  write_sfm(4,fen); write_com(0x80+0x40+5); break;  case 3: x1=shi%16; x2=shi/16;  x1--; if(x1==-1)  {  x1=9; x2--; if(x2==-1) { x1=3; x2=2; } } shi=x1+x2*16;  write_sfm(1,shi); write_com(0x80+0x40+2); break;  case 4: x1=(week)%10; x2=(week)/10; x1--; if(x1==0) x1=7; week=x2*16+x1; write_week(week);    write_com(0x80+14); break;  case 5: x1=ri%16; x2=ri/16;  x1--; if(x1==-1)  {  x1=9; x2--;  if(x2==-1) { x1=1; x2=3; } } ri=x1+x2*16;  write_nyr(9,ri); write_com(0x80+10); break;  case 6: x1=yue%16; x2=yue/16;  x1--; if((x2==1)&&(x1==-1))  {  x1=9; x2--;  } if((x2==0)&&(x1==0)) { x1=2; x2=1; } yue=x1+x2*16;  write_nyr(6,yue); write_com(0x80+7); break;  case 7: x1=nian%16; x2=nian/16;  x1--; if(x1==-1)  {  x1=9; x2--;  if(x2==-1) { x1=9; x2=9; } } nian=x1+x2*16;  write_nyr(3,nian); write_com(0x80+4); break; } } } }  if(s1num!=0||s5num!=0)                                         //表示时钟或者闹钟处于调整状态 { if(s4==0)                                                                //确定状态的按键 { delayms(5); if(s4==0) { if(s1num!=0)                                                         //表示时钟处于调整状态 { while(!s4);                                   //确定键被按下 di(); WriteSet1302(0x8e,0x00);  //按了确认键后,把调整了的所有数据当前状态存入到DS1302中 WriteSet1302(0x80,miao);  WriteSet1302(0x84,shi); WriteSet1302(0x82,fen);  WriteSet1302(0x8a,week);  WriteSet1302(0x8c,nian);  WriteSet1302(0x88,yue); WriteSet1302(0x86,ri);  WriteSet1302(0x8e,0x80);  flag1=0; write_com(0x0c); s1num=0; } if(s5num!=0)                                           //表示闹钟处于调整状态 { while(!s4); di(); WriteSet1302(0x8e,0x00);  //调整闹钟,不能让时钟暂停,故没把时钟数据写入DS1302中 WriteSet1302(0xc0,ashi);           //把闹钟数据写入DS1302中 WriteSet1302(0xfc,afen);  WriteSet1302(0x8e,0x80); flag2=0; s5num=0; write_com(0x0c);  } } } }   if(s5==0&&s1num==0)                                           //闹钟功能键  并且时钟不处于调整状态 { delayms(5); if(s5==0&&s1num==0) { s5num++; flag2=1; while(!s5); di(); if(s5num==1) { write_com(0x80+0x40+14); write_com(0x0f); } if(s5num==2) { write_com(0x80+0x40+11);  } if(s5num==3) { s5num=0; flag2=0; WriteSet1302(0x8e,0x00); WriteSet1302(0xfc,afen); WriteSet1302(0xc0,ashi); WriteSet1302(0x8e,0x80); write_com(0x0c); } } } if(s5num!=0&&s1num==0)                                 //只有闹钟处于调整状态 { if(s2==0)                                           //闹钟加键 { delayms(5); if(s2==0) { while(!s2); di(); if(s5num==1) { x1=afen%16; x2=afen/16; x1++; if(x1==10) { x1=0; x2++; if(x2>=6) x2=0; } afen=x1+x2*16; write_sfm(13,afen); write_com(0x80+0x40+14); } if(s5num==2) { x1=ashi%16; x2=ashi/16; x1++; if(x2>=2&&x1>=4) { x1=0; x2=0; } if(x1==10) { x1=0; x2++; } ashi=x1+x2*16; write_sfm(10,ashi); write_com(0x80+0x40+11); } } } } if(s3==0)                                           //闹钟减键 { delayms(5); if(s3==0) { while(!s3); di(); if(s5num==1) { x1=afen%16; x2=afen/16;  x1--; if(x1==-1)  {  x1=9; x2--;  if(x2==-1) x2=5; } afen=x1+x2*16;  write_sfm(13,afen); write_com(0x80+0x40+14); } if(s5num==2) { x1=ashi%16; x2=ashi/16;  x1--; if(x1==-1)  {  x1=9; x2--; if(x2==-1) { x1=3; x2=2; } } ashi=x1+x2*16;  write_sfm(10,ashi); write_com(0x80+0x40+11); } } } } void laba() { if((shi==ashi)&&(fen==afen)&&(miao<=60&&miao>=0)) { di(); } } void main()                                                  //主函数 { init();                                                                        //大初始化 cmg88();                                                                //关数码管函数 inital_1302();                                                         //DS1302赋初值的初始化 ashi=ReadSet1302(0xc1);                                           //从DS1302读出数据 afen=ReadSet1302(0xfd); write_sfm(10,ashi);                                                //读出数据送给液晶显示 write_sfm(13,afen); while(1) {  keyscan(); laba(); if(flag1==0&&flag2==0)         //经过一系列调整后,最终继续满足这个条件 {                                                                          //从DS1302读数据 miao=ReadSet1302(0x81);                                 //秒 fen=ReadSet1302(0x83);                                  //分 shi=ReadSet1302(0x85);                                  //时 ri=ReadSet1302(0x87);                                   //日 yue=ReadSet1302(0x89);                                        //月 week=ReadSet1302(0x8b);                                         //星期 nian=ReadSet1302(0x8d);                                         //年 write_sfm(7,miao);                                   //把它们送液晶显示 write_sfm(4,fen); write_sfm(1,shi); write_nyr(9,ri); write_nyr(6,yue); write_nyr(3,nian); write_week(week);  } }  }
回复

使用道具 举报

5#
ID:164602 发表于 2017-6-13 08:21 | 只看该作者

我也有块普中的板子,正如我的名字。
你有板子,当然也有例程了,且你已经将它们结合在一起了,只需修改一个地方就可以了。如下:
/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能                   : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(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);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

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

对照一下你的原来的程序,就会发现,这个部分程序中的(红色部分),被我去掉了(其它任何地方都不修改)。两样都能正常工作了。
回复

使用道具 举报

6#
ID:211258 发表于 2017-6-15 11:29 | 只看该作者
非常好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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