標(biāo)題: 仿制單片機+LCD19264+ds3231大數(shù)字電子鐘 Proteus仿真程序 [打印本頁]

作者: 用戶2111155    時間: 2020-3-30 10:26
標(biāo)題: 仿制單片機+LCD19264+ds3231大數(shù)字電子鐘 Proteus仿真程序


19264 加3231電子鐘程序整合自論壇大神


以下粘貼部分代碼
*系統(tǒng)頭文件--------------------------------------------------------------------*/
#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-設(shè)置
sbit K2  = P3^3;  //按鍵K2-確認、返回
sbit K3  = P3^4;  //按鍵K3-加
sbit K4  = P3^5;  //按鍵K4-減
//sbit K5  = P1^3;
/************************函數(shù)聲明***********************************************/
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;    //調(diào)時標(biāo)志位
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);//調(diào)用1302時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址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);//調(diào)用1302時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址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芯片中讀取日數(shù)據(jù),從地址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);//調(diào)用公歷換算星期子函數(shù)
    //sel=week;//week是公歷轉(zhuǎn)換星期子函數(shù)的運行結(jié)果,結(jié)果為0-6,0是星期日
        ShowHZ(1,7,((week)-1));//顯示位置
           if(week==0)
           ShowHZ(1,7,12);    //0=星期日 */        
    year=read_random(DS3231_YEAR);//調(diào)用3231時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址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);//調(diào)用3231時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x05中
        ShowChar(0,6,(month/10+0x30));         
        ShowChar(0,7,(month%10)+0x30);
        
        ShowHZ(0,4,11);                 //月
        
        date=read_random(DS3231_DAY);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
        ShowChar(0,10,(date/10+0x30));
        ShowChar(0,11,(date%10+0x30));
        
        ShowHZ(0,6,12);                 //日


    //小時
        hour =read_random(DS3231_HOUR);        //從3231芯片中讀取小時數(shù)據(jù),從地址0x02中
        Show1632(1,0,(hour/10));
        Show1632(1,1,(hour%10));                                        //小時個位
        Show1632(1,2,10);                                                //時鐘分隔符號":"
        //分鐘
        minute= read_random(DS3231_MINUTE); //從3231芯片中讀取分鐘數(shù)據(jù),從地址0x01中
        Show1632(1,3,(minute/10));                                        //分鐘十位
        Show1632(1,4,(minute%10));                                        //分鐘個位
        ShowSZ(2,5,10);                                                //時鐘分隔符號":"        
        //秒鐘
        second =read_random(DS3231_SECOND); //從3231芯片中讀取秒鐘數(shù)據(jù),從地址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);//調(diào)用公歷換算星期子函數(shù)
    //sel=week;//week是公歷轉(zhuǎn)換星期子函數(shù)的運行結(jié)果,結(jié)果為0-6,0是星期日
        ShowHZ(1,11,((week)-1));//顯示位置
           if(week==0)
           ShowHZ(1,11,12);    //0=星期日
}
void displaynl(void)
{
        Conversion(century,year,month,date);        //公歷轉(zhuǎn)農(nóng)歷


        
        ShowHZ(3,0,(month_moon));  //顯示農(nóng)歷月
        
        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));  //顯示農(nóng)歷月
        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;//農(nóng)歷年份的十進制數(shù)  和取模后的余數(shù)


        //LunarYearD=(year_moon/16)*10+year_moon%16;        //農(nóng)歷年轉(zhuǎn)換成10進制數(shù)
        ReYear=LunarYearD%12;                             //農(nóng)歷年模12,取余運算
        


        switch(ReYear)        //生肖
        {
                case 0: ShowHZ(0,10,23);break;//write_com(0x9a);lcm_w_word("龍年");break;   //余0即整除 農(nóng)歷 龍年
                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);          //顯示"設(shè)"  
        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某地址上的數(shù)值轉(zhuǎn)換成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);//轉(zhuǎn)換成16進制寫入1302
          write_time(0x8e,0x80);//寫保護,禁止寫操作
          displaytime();
                                          
}          */         
void Set_time(uchar sel)
{
          signed char address,item;
          signed char max,mini;
          ShowHZ(3,6,31);          //顯示"調(diào)"  
        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某地址上的數(shù)值轉(zhuǎn)換成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);//轉(zhuǎn)換成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 {}                    //否則啟動調(diào)時
//設(shè)置鍵------------------------------------------------------------------------               
                if (K1 == 0)               // 設(shè)置時間
                {
                        DelayM(20);                   //按鍵消抖
                        if(K1 == 0 && w == 1)  //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
                        {
                                e++;
                                if (e >= 6 ){e = 0;}
                                Set_time(e);       //調(diào)整                                
                        }                        
                        if(K1 == 0 && w == 0)  //當(dāng)是正常狀態(tài)時就進入調(diào)時狀態(tài)
                        {
                                ClearScreen(0);
                                ClearScreen(1);
                                ClearScreen(2);    //清除左中右屏顯示
                                w=1;                   //進入調(diào)時                                
                                Set_time(e);       //調(diào)整
                        }
                           while(K1 == 0);        //等待鍵松開
                }
//確認,返回鍵-------------------------------------------------------------------               
                if (K2 == 0)               //在調(diào)時狀態(tài)時就退出調(diào)時
                {
                        DelayM(20);            //按鍵消抖
                        if(K2 == 0 && w == 1)
                        {                                
                                w = 0;                   //退出調(diào)時
                                e = 0;                       //"下一項"計數(shù)器清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);  
                }
//加調(diào)整------------------------------------------------------------------------               
                if (K3 == 0 && w == 1)
                {                                                         
                        DelayM(20);
                        if(K3 == 0 && w == 1) {        Set_time(e); }
                        while(K3 == 0);
                }
//減調(diào)整------------------------------------------------------------------------               
                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;      //標(biāo)志位取反
                         if(q){BLK = BLK | 1;}   
                                 else {BLK = BLK & 0;}   
                        while(K5 == 0);           
                }                                                                                                                                        */
}
  

全部資料51hei下載地址:
19264 3231.zip (208.93 KB, 下載次數(shù): 268)

作者: 騰飛的龍    時間: 2020-6-13 11:06
樓主您好!怎么顯示亂碼?
作者: mengsiu    時間: 2020-7-13 23:00
完美運行!
作者: PINUO    時間: 2020-7-14 11:29
mengsiu 發(fā)表于 2020-7-13 23:00
完美運行!

我的顯示不出來畫面是咋回事

作者: rsbook    時間: 2020-7-16 14:47
好東西,測試完美可用,謝謝!
作者: hhdsdy    時間: 2020-7-16 16:20
這個屏幕布局還是不夠好看
作者: hhdsdy    時間: 2020-7-16 16:24
騰飛的龍 發(fā)表于 2020-6-13 11:06
樓主您好!怎么顯示亂碼?

應(yīng)該又是用來對付伸手黨的,端口不對或者程序稍微錯誤,自己判斷問題所在并改一下就OK了,我經(jīng)常遇到這樣子。這個布局不喜歡,所以沒有下載參考,無法判斷是否會正常顯示
作者: 達達別    時間: 2021-4-20 14:32
樓主您好,我的屏幕跟你的仿真屏為啥不一樣 這樣的屏幕還能做嗎

1af4a809fa9716ab033b3c0c146af7c.jpg (67 KB, 下載次數(shù): 30)

1af4a809fa9716ab033b3c0c146af7c.jpg





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1