找回密码
 立即注册

QQ登录

只需一步,快速开始

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

仿制单片机+LCD19264+ds3231大数字电子钟 Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主


19264 加3231电子钟程序整合自论坛大神


以下粘贴部分代码
*系统头文件--------------------------------------------------------------------*/
#include <reg52.h>
#include <absacc.h>
#include "MODEL.h"
#include "LCM19264.h"
#include "ds3231.h"
#include "DS18B20.h"
#include "nongli.h"
//#include "ds1302.h"
/*定义按键----------------------------------------------------------------------*/
sbit K1  = P3^2;  //按键K1-设置
sbit K2  = P3^3;  //按键K2-确认、返回
sbit K3  = P3^4;  //按键K3-加
sbit K4  = P3^5;  //按键K4-减
//sbit K5  = P1^3;
/************************函数声明***********************************************/
void DelayM(uint);
//void ds_w(void);
uchar m,date,month,year,hour,minute,second;
void Conver_week(bit c,uchar year,uchar month,uchar day);
/*-----------------------------定义全局变量------------------------------*/
bit q=0, w=0;    //调时标志位
unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)


uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;




void displaytime(void)
{
        
   /* year=read_time(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中
        ShowChar(0,0,'2');
        ShowChar(0,1,'0');
        ShowChar(0,2,(year/16+0x30));        
        ShowChar(0,3,(year%16+0x30));
        ShowHZ(0,2,10);                 //年
        
        month=read_time(0x89);//调用1302时钟数据中的月数据,从地址0x89中
        ShowChar(0,6,(month/16+0x30));         
        ShowChar(0,7,(month%16)+0x30);
        //ShowChar(0,4,(Time[6]/16));
        //ShowChar(0,5,(Time[6]%16));
        ShowHZ(0,4,11);                 //月
        
        date=read_time(0x87);//从1302芯片中读取日数据,从地址0x87中
        ShowChar(0,10,(date/16+0x30));
        ShowChar(0,11,(date%16+0x30));
        //ShowChar(0,8,(Time[6]/16));
        //ShowChar(0,9,(Time[6]%16));
        ShowHZ(0,6,12);                 //日


        //小时
        hour = read_time(0x85);
        //if((hour/16)==0){Show1632(1,0,11);}
        //        else        {Show1632(1,0,(hour/16));}        //小时十位
        Show1632(1,0,(hour/16));
        Show1632(1,1,(hour%16));                                        //小时个位
        Show1632(1,2,10);                                                //时钟分隔符号":"
        //分钟
        minute = read_time(0x83);
        Show1632(1,3,(minute/16));                                        //分钟十位
        Show1632(1,4,(minute%16));                                        //分钟个位
        ShowSZ(2,5,10);                                                //时钟分隔符号":"        
        //秒钟
        second = read_time(0x81);
        ShowSZ(2,6,(second/16));                                        //秒钟十位
        ShowSZ(2,7,(second%16));                                        //秒钟个位
        
        ShowHZ(1,5,13);//星
        ShowHZ(1,6,14);//期
        
        dd = read_time(0x87);//日
        mo = read_time(0x89);//月
        yy = read_time(0x8d);//年
        Conver_week(0,yy,mo,dd);//调用公历换算星期子函数
    //sel=week;//week是公历转换星期子函数的运行结果,结果为0-6,0是星期日
        ShowHZ(1,7,((week)-1));//显示位置
           if(week==0)
           ShowHZ(1,7,12);    //0=星期日 */        
    year=read_random(DS3231_YEAR);//调用3231时钟数据中的年数据,从地址0x8d中
        ShowChar(0,0,'2');
        ShowChar(0,1,'0');
        ShowChar(0,2,(year/10+0x30));        
        ShowChar(0,3,(year%10+0x30));
        ShowHZ(0,2,10);                 //年        
        
        month=read_random(DS3231_MONTH);//调用3231时钟数据中的月数据,从地址0x05中
        ShowChar(0,6,(month/10+0x30));         
        ShowChar(0,7,(month%10)+0x30);
        
        ShowHZ(0,4,11);                 //月
        
        date=read_random(DS3231_DAY);//从3231芯片中读取日数据,从地址0x04中
        ShowChar(0,10,(date/10+0x30));
        ShowChar(0,11,(date%10+0x30));
        
        ShowHZ(0,6,12);                 //日


    //小时
        hour =read_random(DS3231_HOUR);        //从3231芯片中读取小时数据,从地址0x02中
        Show1632(1,0,(hour/10));
        Show1632(1,1,(hour%10));                                        //小时个位
        Show1632(1,2,10);                                                //时钟分隔符号":"
        //分钟
        minute= read_random(DS3231_MINUTE); //从3231芯片中读取分钟数据,从地址0x01中
        Show1632(1,3,(minute/10));                                        //分钟十位
        Show1632(1,4,(minute%10));                                        //分钟个位
        ShowSZ(2,5,10);                                                //时钟分隔符号":"        
        //秒钟
        second =read_random(DS3231_SECOND); //从3231芯片中读取秒钟数据,从地址0x01中
        ShowSZ(2,6,(second/10));                                        //秒钟十位
        ShowSZ(2,7,(second%10));                                        //秒钟个位
        
        ShowHZ(1,9,13);//星
        ShowHZ(1,10,14);//期
        
        dd = read_random(DS3231_DAY);//日
        mo = read_random(DS3231_MONTH);//月
        yy = read_random(DS3231_YEAR);//年
        Conver_week(0,yy,mo,dd);//调用公历换算星期子函数
    //sel=week;//week是公历转换星期子函数的运行结果,结果为0-6,0是星期日
        ShowHZ(1,11,((week)-1));//显示位置
           if(week==0)
           ShowHZ(1,11,12);    //0=星期日
}
void displaynl(void)
{
        Conversion(century,year,month,date);        //公历转农历


        
        ShowHZ(3,0,(month_moon));  //显示农历月
        
        if(month_moon==1)  {ShowHZ(3,0,35);}    //正
        if(month_moon==2)  {ShowHZ(3,0,1);}     //二
        if(month_moon==3)  {ShowHZ(3,0,2);}     //三
        if(month_moon==4)  {ShowHZ(3,0,3);}     //四
        if(month_moon==5)  {ShowHZ(3,0,4);}     //五
        if(month_moon==6)  {ShowHZ(3,0,5);}     //六
        if(month_moon==7)  {ShowHZ(3,0,6);}     //七
        if(month_moon==8)  {ShowHZ(3,0,7);}     //八
        if(month_moon==9)  {ShowHZ(3,0,8);}     //九
        if(month_moon==10) {ShowHZ(3,0,9);}     //十
        if(month_moon==11) {ShowHZ(3,0,15);}    //冬
        if(month_moon==12) {ShowHZ(3,0,16);}    //腊


    ShowHZ(3,1,11);//显示月
        
        ShowHZ(3,2,(day_moon));  //显示农历月
        if (day_moon==1)  {ShowHZ(3,2,17); ShowHZ(3,3,0);}//  {lcm_w_word("初一");}
        if (day_moon==2)  {ShowHZ(3,2,17); ShowHZ(3,3,1);}//  {lcm_w_word("初二");}
        if (day_moon==3)  {ShowHZ(3,2,17); ShowHZ(3,3,2);}//  {lcm_w_word("初三");}
        if (day_moon==4)  {ShowHZ(3,2,17); ShowHZ(3,3,3);}//  {lcm_w_word("初四");}
        if (day_moon==5)  {ShowHZ(3,2,17); ShowHZ(3,3,4);}//  {lcm_w_word("初五");}
        if (day_moon==6)  {ShowHZ(3,2,17); ShowHZ(3,3,5);}//  {lcm_w_word("初六");}
        if (day_moon==7)  {ShowHZ(3,2,17); ShowHZ(3,3,6);}//  {lcm_w_word("初七");}
        if (day_moon==8)  {ShowHZ(3,2,17); ShowHZ(3,3,7);}//  {lcm_w_word("初八");}
        if (day_moon==9)  {ShowHZ(3,2,17); ShowHZ(3,3,8);}//  {lcm_w_word("初九");}
        if (day_moon==10) {ShowHZ(3,2,17); ShowHZ(3,3,9);}//  {lcm_w_word("初十");}
        if (day_moon==11) {ShowHZ(3,2,9);  ShowHZ(3,3,0);}//  {lcm_w_word("十一");}
        if (day_moon==12) {ShowHZ(3,2,9);  ShowHZ(3,3,1);}//  {lcm_w_word("十二");}
        if (day_moon==13) {ShowHZ(3,2,9);  ShowHZ(3,3,2);}//  {lcm_w_word("十三");}
        if (day_moon==14) {ShowHZ(3,2,9);  ShowHZ(3,3,3);}//  {lcm_w_word("十四");}
        if (day_moon==15) {ShowHZ(3,2,9);  ShowHZ(3,3,4);}//  {lcm_w_word("十五");}
        if (day_moon==16) {ShowHZ(3,2,9);  ShowHZ(3,3,5);}//  {lcm_w_word("十六");}
        if (day_moon==17) {ShowHZ(3,2,9);  ShowHZ(3,3,6);}//  {lcm_w_word("十七");}
        if (day_moon==18) {ShowHZ(3,2,9);  ShowHZ(3,3,7);}//  {lcm_w_word("十八");}
        if (day_moon==19) {ShowHZ(3,2,9);  ShowHZ(3,3,8);}//  {lcm_w_word("十九");}
        if (day_moon==20) {ShowHZ(3,2,1);  ShowHZ(3,3,9);}//  {lcm_w_word("二十");}
        if (day_moon==21) {ShowHZ(3,2,18); ShowHZ(3,3,0);}//  {lcm_w_word("廿一");}
        if (day_moon==22) {ShowHZ(3,2,18); ShowHZ(3,3,1);}//  {lcm_w_word("廿二");}
        if (day_moon==23) {ShowHZ(3,2,18); ShowHZ(3,3,2);}//  {lcm_w_word("廿三");}
        if (day_moon==24) {ShowHZ(3,2,18); ShowHZ(3,3,3);}//  {lcm_w_word("廿四");}
        if (day_moon==25) {ShowHZ(3,2,18); ShowHZ(3,3,4);}//  {lcm_w_word("廿五");}
        if (day_moon==26) {ShowHZ(3,2,18); ShowHZ(3,3,5);}//  {lcm_w_word("廿六");}
        if (day_moon==27) {ShowHZ(3,2,18); ShowHZ(3,3,6);}//  {lcm_w_word("廿七");}
        if (day_moon==28) {ShowHZ(3,2,18); ShowHZ(3,3,7);}//  {lcm_w_word("廿八");}
        if (day_moon==29) {ShowHZ(3,2,18); ShowHZ(3,3,8);}//  {lcm_w_word("廿九");}
        if (day_moon==30) {ShowHZ(3,2,2);  ShowHZ(3,3,9);}//  {lcm_w_test("三十");}


}
void displaysx(void){
        unsigned char LunarYearD,ReYear;//农历年份的十进制数  和取模后的余数


        //LunarYearD=(year_moon/16)*10+year_moon%16;        //农历年转换成10进制数
        ReYear=LunarYearD%12;                             //农历年模12,取余运算
        


        switch(ReYear)        //生肖
        {
                case 0: ShowHZ(0,10,23);break;//write_com(0x9a);lcm_w_word("龙年");break;   //余0即整除 农历 龙年
                case 1: ShowHZ(0,10,24);break;//write_com(0x9a);lcm_w_word("蛇年");break;   //蛇年
                case 2: ShowHZ(0,10,25);break;//write_com(0x9a);lcm_w_word("马年");break;
                case 3: ShowHZ(0,10,26);break;//write_com(0x9a);lcm_w_word("羊年");break;
                case 4: ShowHZ(0,10,27);break;//write_com(0x9a);lcm_w_word("猴年");break;
                case 5: ShowHZ(0,10,28);break;//write_com(0x9a);lcm_w_word("鸡年");break;
                case 6: ShowHZ(0,10,29);break;//write_com(0x9a);lcm_w_word("狗年");break;
                case 7: ShowHZ(0,10,30);break;//write_com(0x9a);lcm_w_word("猪年");break;
                case 8: ShowHZ(0,10,19);break;//write_com(0x9a);lcm_w_word("鼠年");break;
                case 9: ShowHZ(0,10,20);break;//write_com(0x9a);lcm_w_word("牛年");break;
                case 10:ShowHZ(0,10,21);break;//write_com(0x9a);lcm_w_word("虎年");break;
                case 11:ShowHZ(0,10,22);break;//write_com(0x9a);lcm_w_word("兔年");break;
        }
}


/*void Set_time(uchar sel)
{
          signed char address,item;
          signed char max,mini;
          ShowHZ(3,6,31);          //显示"设"  
        if(sel==0) {ShowHZ(3,7,10);address=0x8c; max=99; mini=0;}  //年
        if(sel==1) {ShowHZ(3,7,11);address=0x88; max=12; mini=1;}  //月
        if(sel==2) {ShowHZ(3,7,12);address=0x86; max=31; mini=1;}  //日
        if(sel==3) {ShowHZ(3,7,33);address=0x84; max=23;mini=0;}//时
        if(sel==4) {ShowHZ(3,7,32);address=0x82; max=59;mini=0;}//钟


  //读取1302某地址上的数值转换成10进制赋给item
          item=((read_time(address+1))/16)*10 + (read_time(address+1))%16;
          if(K3 == 0){item++;}
          if(K4 == 0){item--;}
          if(item>max) item=mini;   
          if(item<mini) item=max;           
          write_time(0x8e,0x00);//允许写操作
          write_time(address,(item/10)*16+item%10);//转换成16进制写入1302
          write_time(0x8e,0x80);//写保护,禁止写操作
          displaytime();
                                          
}          */         
void Set_time(uchar sel)
{
          signed char address,item;
          signed char max,mini;
          ShowHZ(3,6,31);          //显示"调"  
        if(sel==0) {ShowHZ(3,7,10);address=DS3231_YEAR; max=99; mini=0;}  //年
        if(sel==1) {ShowHZ(3,7,11);address=DS3231_MONTH; max=12; mini=1;}  //月
        if(sel==2) {ShowHZ(3,7,12);address=DS3231_DAY; max=31; mini=1;}  //日
        if(sel==3) {ShowHZ(3,7,33);address=DS3231_HOUR; max=23;mini=0;}//时
        if(sel==4) {ShowHZ(3,7,32);address=DS3231_MINUTE; max=59;mini=0;}//钟


  //读取3231某地址上的数值转换成10进制赋给item
          item=(read_random(address));
          if(K3 == 0){item++;}
          if(K4 == 0){item--;}
          if(item>max) item=mini;   
          if(item<mini) item=max;           
          //write_byte(0, 0x98);//允许写操作
         write_byte(address,(item/10)*16+item%10);//转换成10进制写入3231
  //        write_byte(0x8e,0x80);//写保护,禁止写操作
          displaytime();
                                          
}         
void main()
{
        uchar e=0;


        InitLCD();
        while(1)
        {
                if(w==0)
                {
                        displaytime();
                        displaynl();
                        displaysx();        
                        read_temp();                  //读取温度
                    ds1820disp();                 //显示温度
                }   //正常走时
                else {}                    //否则启动调时
//设置键------------------------------------------------------------------------               
                if (K1 == 0)               // 设置时间
                {
                        DelayM(20);                   //按键消抖
                        if(K1 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
                        {
                                e++;
                                if (e >= 6 ){e = 0;}
                                Set_time(e);       //调整                                
                        }                        
                        if(K1 == 0 && w == 0)  //当是正常状态时就进入调时状态
                        {
                                ClearScreen(0);
                                ClearScreen(1);
                                ClearScreen(2);    //清除左中右屏显示
                                w=1;                   //进入调时                                
                                Set_time(e);       //调整
                        }
                           while(K1 == 0);        //等待键松开
                }
//确认,返回键-------------------------------------------------------------------               
                if (K2 == 0)               //在调时状态时就退出调时
                {
                        DelayM(20);            //按键消抖
                        if(K2 == 0 && w == 1)
                        {                                
                                w = 0;                   //退出调时
                                e = 0;                       //"下一项"计数器清0                                                               
                        }
                        if(K2 == 0 && w == 0)
                        {                                
                                ClearScreen(0);
                                ClearScreen(1);
                                ClearScreen(2);           //清除左中右屏显示                                
                                while(K2 == 0);   
                        }
                        ClearScreen(0);
                        ClearScreen(1);
                        ClearScreen(2);        //清除左中右屏显示
                        displaytime();                   //显示时间
                        read_temp();                  //读取温度
                    ds1820disp();                 //显示温度
                        while(K2 == 0);  
                }
//加调整------------------------------------------------------------------------               
                if (K3 == 0 && w == 1)
                {                                                         
                        DelayM(20);
                        if(K3 == 0 && w == 1) {        Set_time(e); }
                        while(K3 == 0);
                }
//减调整------------------------------------------------------------------------               
                if (K4 == 0 && w == 1)
                {               
                        DelayM(20);
                        if(K4 == 0 && w == 1) { Set_time(e); }
                        while(K4 == 0);
                }
        }
/*液晶背光控制,按一下亮,再按一下灭----------------------------------------
                if(K5 == 0)        
                {
                        DelayM(20); q = ~q;      //标志位取反
                         if(q){BLK = BLK | 1;}   
                                 else {BLK = BLK & 0;}   
                        while(K5 == 0);           
                }                                                                                                                                        */
}
  

全部资料51hei下载地址:
19264 3231.zip (208.93 KB, 下载次数: 253)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:79544 发表于 2020-6-13 11:06 | 只看该作者
楼主您好!怎么显示乱码?
回复

使用道具 举报

板凳
ID:16255 发表于 2020-7-13 23:00 | 只看该作者
完美运行!
回复

使用道具 举报

地板
ID:802646 发表于 2020-7-14 11:29 | 只看该作者

我的显示不出来画面是咋回事
回复

使用道具 举报

5#
ID:60263 发表于 2020-7-16 14:47 | 只看该作者
好东西,测试完美可用,谢谢!
回复

使用道具 举报

6#
ID:88256 发表于 2020-7-16 16:20 | 只看该作者
这个屏幕布局还是不够好看
回复

使用道具 举报

7#
ID:88256 发表于 2020-7-16 16:24 | 只看该作者
腾飞的龙 发表于 2020-6-13 11:06
楼主您好!怎么显示乱码?

应该又是用来对付伸手党的,端口不对或者程序稍微错误,自己判断问题所在并改一下就OK了,我经常遇到这样子。这个布局不喜欢,所以没有下载参考,无法判断是否会正常显示
回复

使用道具 举报

8#
ID:292903 发表于 2021-4-20 14:32 | 只看该作者
楼主您好,我的屏幕跟你的仿真屏为啥不一样 这样的屏幕还能做吗

1af4a809fa9716ab033b3c0c146af7c.jpg (67 KB, 下载次数: 18)

1af4a809fa9716ab033b3c0c146af7c.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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