仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.63 KB, 下載次數(shù): 48)
下載附件
2021-4-5 00:02 上傳
51hei.png (17.01 KB, 下載次數(shù): 46)
下載附件
2021-4-5 00:03 上傳
單片機源程序如下:
- #include <STC89C5xRC.H>
- #include "12864.h"
- #include "1302.h"
- #include "wenzi.h"
- #define uchar unsigned char
- #define uint unsigned int
- //===============接口定義===============
- sbit key1 = P3^2; //確定/設置 按鍵
- sbit key2 = P3^3; //減 鍵
- sbit key3 = P3^4; //加 鍵
- sbit key4 = P3^5; //返回鍵
- sbit LED = P2^0; //背光
- sbit beep = P2^1; //喇叭
- sbit GY=P3^7;
- //======================================
- uchar year,month,date,xq,hour,minute,second,shi,ge,ge1,shi1,ddd; //時間/鬧鐘相關
- uchar t_ss,t_ss1,t_mm,t_hh,t_dd,t_xq,t_yf,t_yy; //走時變量
- uchar idata t,danian; //農(nóng)歷 t:節(jié)日顯示跳轉(zhuǎn)時間 danian判斷12月份大小月
- bit idata f0,f1,f2,f3; //反白相關標志
- uchar idata setk,setc;
- uchar e,k,n;
- uchar idata kk,kk1,bgk,bsj,bld;
- bit idata w;
- uchar idata ta,tb;
- bit idata dinga;
-
- //==============延時函數(shù)===================
- void Delay(int num)
- {
- while(num--) ;
- }
- //============反白標志================
- void f_qc(void)
- {
- f0=f1=f2=f3=0;
- }
- void displaytime(void)
- {
- year=read_random(DS3231_YEAR);//調(diào)用3231時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中
- WRITE_STRING(3,0,0,year/10,0);
- WRITE_STRING(3,1,0,year%10,0);
- WRITE_STRING(3,1,1,8,0); //年
-
- month=read_random(DS3231_MONTH);//調(diào)用3231時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x05中
- WRITE_STRING(3,4,0,month/10,0);
- WRITE_STRING(3,5,0,month%10,0);
- WRITE_STRING(3,3,1,7,0); //月
-
- date=read_random(DS3231_DAY);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
- WRITE_STRING(3,8,0,date/10,0);
- WRITE_STRING(3,9,0,date%10,0);
- WRITE_STRING(3,5,1,6,0); //日
-
- xq=read_random(DS3231_WEEK);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
- WRITE_STRING(3,7,1,xq-1,0);
- //小時
- hour =read_random(DS3231_HOUR); //從3231芯片中讀取小時數(shù)據(jù),從地址0x02中
- WRITE_STRING(0,0,2,hour/10,0);
- WRITE_STRING(0,1,2,hour%10,0);
- WRITE_STRING(0,2,2,10,0); //時
- //分鐘
- minute= read_random(DS3231_MINUTE); //從3231芯片中讀取分鐘數(shù)據(jù),從地址0x01中
- WRITE_STRING(0,3,2,minute/10,0);
- WRITE_STRING(0,4,2,minute%10,0);
- WRITE_STRING(0,5,2,10,0); //分
- //秒鐘
- second =read_random(DS3231_SECOND); //從3231芯片中讀取秒鐘數(shù)據(jù),從地址0x01中
- WRITE_STRING(0,6,2,second/10,0);
- WRITE_STRING(0,7,2,second%10,0);
-
- //WRITE_STRING(3,7,1,xq,c);
- }
-
- void Set_time(uchar sel)
- {
- signed char address,item;
- signed char max,mini;
- if(sel==0) {WRITE_STRING(2,7,1,8,0);address=DS3231_YEAR; max=99; mini=0;} //年?????
- if(sel==1) {WRITE_STRING(2,7,1,7,0);address=DS3231_MONTH; max=12; mini=1;} //月
- if(sel==2) {WRITE_STRING(2,7,1,6,0);address=DS3231_DAY; max=31; mini=1;} //日
- if(sel==3) {WRITE_STRING(2,7,1,9,0);address=DS3231_WEEK; max=7;mini=1;}//星
- if(sel==4) {WRITE_STRING(2,7,1,11,0);address=DS3231_HOUR; max=23;mini=0;}//時
- if(sel==5) {WRITE_STRING(2,7,1,12,0);address=DS3231_MINUTE; max=59;mini=0;}//鐘
-
- //讀取3231某地址上的數(shù)值轉(zhuǎn)換成10進制賦給item
- item=(read_random(address));
- if(key3 == 0){item++;}
- if(key4 == 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);//寫保護,禁止寫操作
-
- DelayM(20);
- displaytime();
-
- }
-
- void main()
- {
- uchar e=0;
- LCD_ST7565_INIT(); //液晶初始化
- Lcd12864_ClearScreen(); //清屏
- while(1)
- {
- if(w==0)
- {
- displaytime();//顯示時間
- } //正常走時
- else {} //否則啟動調(diào)時
- //設置鍵------------------------------------------------------------------------
- if (key1 == 0) // 設置時間
- {
- DelayM(20); //按鍵消抖
- if(key1 == 0 && w == 1) //當是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
- {
- e++;
- if (e >= 6 ){e = 0;}
- Set_time(e); //調(diào)整
- }
- if(key1 == 0 && w == 0) //當是正常狀態(tài)時就進入調(diào)時狀態(tài)
- {
- Lcd12864_ClearScreen(); //清屏
- w=1; //進入調(diào)時
- Set_time(e); //調(diào)整
- }
- while(key1 == 0); //等待鍵松開
- }
- //確認,返回鍵-------------------------------------------------------------------
- if (key2 == 0) //在調(diào)時狀態(tài)時就退出調(diào)時
- {
- DelayM(20); //按鍵消抖
- if(key2 == 0 && w == 1)
- {
- w = 0; //退出調(diào)時
- e = 0; //"下一項"計數(shù)器清0
- }
- if(key2 == 0 && w == 0)
- {
- Lcd12864_ClearScreen(); //清屏
- while(key2 == 0);
- }
- Lcd12864_ClearScreen(); //清屏
- displaytime(); //顯示時間
- while(key2 == 0);
- }
- //加調(diào)整------------------------------------------------------------------------
- if (key3 == 0 && w == 1)
- {
- DelayM(20);
- if(key3 == 0 && w == 1) { Set_time(e); }
- while(key3 == 0);
- }
- //減調(diào)整------------------------------------------------------------------------
- if (key4 == 0 && w == 1)
- {
- DelayM(20);
- if(key4 == 0 && w == 1) { Set_time(e); }
- while(key4 == 0);
- }
- }
- /*液晶背光控制,按一下亮,再按一下滅----------------------------------------
- if(K5 == 0)
- {
- DelayM(20); q = ~q; //標志位取反
- if(q){BLK = BLK | 1;}
- else {BLK = BLK & 0;}
- while(K5 == 0);
- } */
- }
復制代碼
51hei.png (29.07 KB, 下載次數(shù): 38)
下載附件
2021-4-5 00:05 上傳
所有資料51hei提供下載:
st12864電子鐘+ds3232 -成功顯示可調(diào)時鐘.7z
(125.97 KB, 下載次數(shù): 105)
2021-4-5 00:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|