12864+DS1302 +DS18B20 大字符時鐘供大家學習。
電子智能時鐘程序
單 片 機:STC89C52RC
晶 振:12MHz
時鐘芯片:DS1302
液 晶 屏:LCM-12864-ST7920
時 間:2019年11月26修改完成
LCM12864使用并口連接方式,PSB、RST接高電平
制作出來的實物圖如下:
電路原理圖如下:
單片機源程序如下:
- /*---------------------------------------------------------------------------
- 電子智能時鐘程序
- 單 片 機:STC89C52RC
- 晶 振:12MHz
- 時鐘芯片:DS1302
- 液 晶 屏:LCM-12864-ST7920
- 時 間:2019年11月26修改完成
- LCM12864使用并口連接方式,PSB、RST接高電平
- ------------------------------------------------------------------------------*/
- /*-------------------------------頭文件---------------------------------------*/
- #include <reg52.h>
- #include <intrins.h>
- #include "LCD12864.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "nongli.h"
- #include "displaytime.h"
- //#include "jieqi.h"
- #define uint unsigned int
- #define uchar unsigned char
- /*----------------------------定義按鍵---------------------------------------*/
- sbit K1 = P2^3; //K1-設置
- sbit K2 = P2^2; //K2-確認、返回
- sbit K3 = P2^1; //K3-加
- sbit K4 = P2^0; //K4-減
- //sbit K5 = P3^7; //液晶背光控制按鍵,按一下亮,再按一下滅
- //sbit BLK = P3^7; //液晶背光控制輸出,低電平有效,PNP三極管控制。
- /*---------------------函數聲明------------------------------*/
- void DelayM(uint);
- void ds_w(void);
- 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,tiangan,dizhi,moontemp1,moontemp2;//定義時間映射全局變量(專用寄存器)
- signed char address,item,max,mini;
- /*-----------------------------延時函數 1MS/次-------------------------------*/
- void DelayM(uint a)
- {
- uchar i;
- while( --a != 0) { for(i = 0; i < 125; i++); }
- }
- /*-----------------------------日期、時間設置函數-----------------------------*/
- void tiaozheng(void){
- yy = read_clock(0x8d);//調用1302時鐘數據中的年數據,從地址0x8d中
- mo = read_clock(0x89);//調用1302時鐘數據中的月數據,從地址0x89中
- dd = read_clock(0x87);//從1302芯片中讀取日數據,從地址0x87中
- week = read_clock(0x8b);//從1302芯片中讀取星期數據,從地址0x8b中
- lcm_w_test(0,0x80);
- lcm_w_word("20");//顯示內容字符20
- write_data(yy/16+0x30);//函數參數1,代表本行寫數據,YY/16+0X30得出年十位數字的顯示碼地址,送顯示
- write_data(yy%16+0x30);//函數?
- lcm_w_word("年");
- write_data(mo/16+0x30);
- write_data(mo%16+0x30);//與16取余數,得到月份的個位數,加0x30得到該數字的液晶內定顯示碼送顯示
- lcm_w_word("月"); //調用字符顯示函數,顯示文字 月
- write_data(dd/16+0x30);
- write_data(dd%16+0x30);//第一個1參數,表示本行寫數據,日數據與16取余得個位數,加0x30得到顯示碼
- lcm_w_word("日");//顯示字符 日
- if(read_clock(0x85) != hh){ //如果程序中的小時與1302芯片中的不同,
- hh = read_clock(0x85); //刷新程序中的小時數據
- }
- lcm_w_test(0,0x91);//第一個參數0,表示本行寫入LCM的是指令,指定顯示位置91H(第三行左端)
- write_data(hh/16+0x30); //顯示十位
-
- write_data(hh%16+0x30); //顯示個位
- lcm_w_word("時");
- if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數據與程序中的分鐘變量不相等
- mm = read_clock(0x83);//刷新程序中的分鐘數據
- }
- write_data(mm/16+0x30);//向液晶寫數據,顯示分鐘的十位數
- write_data(mm%16+0x30);//向液晶寫數據,顯示分鐘的個位數
- lcm_w_word("分");
- if(read_clock(0x81) != ss){//如果1302芯片中的分鐘數據與程序中的秒鐘變量不相等
- ss = read_clock(0x81);//刷新程序中的秒鐘數據
- }
- write_data(ss/16+0x30);//向液晶寫數據,顯示分鐘的十位數
- write_data(ss%16+0x30);//向液晶寫數據,顯示分鐘的個位數
- lcm_w_word("秒");
- }
- /**********************************************************************************************************/
- //調整時間子函數,設置鍵、數據范圍、上調加一,下調減一功能。
- void Set_time(unsigned char sel){ //根據選擇調整的相應項目加1并寫入DS1302,函數參數是按動設置鍵的次數
-
- write_com(0x30); write_com(0x06);
- lcm_w_test(0,0x98);//第一參數0表示本行寫入指令,指定下面行的 調整 顯示起始位置為98H
- lcm_w_word("★調整");//調用字符顯示函數,顯示 調整字樣
-
- /* if(sel==6) {lcm_w_word("星期");address=0x8a; max=7;mini=1;
- tiaozheng();
- ds_w();
- tiaozheng();
- }
- */
- //////////////////////////////////////////////////////////////
- if(sel==5) {lcm_w_word("秒鐘");address=0x80; max=59;mini=0;
- tiaozheng(); //調用日期、時間調整函數
- ds_w(); //被調數據加一或減一函數
- tiaozheng();
-
- } //秒7,按動7次顯示 調整秒鐘
- //并指定秒鐘數據寫入1302芯片的地址是0x82,秒鐘數據的最大值是59,最小值是0
- /////////////////////////////////////////////////////////////////////////
- if(sel==4) {lcm_w_word("分鐘");address=0x82; max=59;mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
-
- } //分鐘6,按動6次顯示 調整分鐘
- //并指定分鐘數據寫入1302芯片的地址是0x82,分鐘數據的最大值是59,最小值是0
- if(sel==3) {lcm_w_word("小時");address=0x84; max=23;mini=0;
- /***********************************************************/
- if(address > 12){
- address = address-12; }
- /********************************************************/
- tiaozheng();
- ds_w();
- tiaozheng();
-
- } //小時5,按動5次顯示 調整小時
- //規定小時數據寫入1302芯片的位置是0x84,小時數據最大值23,最小值是0
-
- if(sel==2) {lcm_w_word("日期");
- address=0x86;
- mo = read_clock(0x89);//讀月數據
- moontemp1=mo/16;
- moontemp2=mo%16;
- mo=moontemp1*10+moontemp2;//轉換成10進制月份數據
- yy = read_clock(0x8d);//讀年數據
- moontemp1=yy/16;
- moontemp2=yy%16;
- yy=moontemp1*10+moontemp2;//轉換成10進制年份數據
- if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
- if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
- if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
- if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
- tiaozheng();
- ds_w();
- tiaozheng(); //調用日期、時間調整函數
-
- } //日3,按動3次顯示 調整日期
- //規定日期數據寫入1302的位置地址是0x86,日期最大值31,最小值是1
- if(sel==1) {lcm_w_word("月份");address=0x88; max=12;mini=1;
- tiaozheng();
- ds_w();
- tiaozheng();
-
- } //月2,按動2次顯示 調整月份
- //規定月份寫入1302的位置地址是0x88,月份最大值12,最小值1
- if(sel==0) {lcm_w_word("年份");address=0x8c; max=99; mini=0;
- tiaozheng();
- ds_w(); //被調數據加一或減一函數
- tiaozheng(); //調用日期、時間調整函數
- } //年1,按動1次顯示 調整年份,
- //規定年份寫入1302的地址是0x8c,年份的最大值99,最小值0
- }
- /*****************************************************************************/
- //被調數據加一或減一,并檢查數據范圍,寫入1302指定地址保存
- void ds_w(void){
- item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
- if(K3 == 0){ //如果按動上調鍵
- item++; //數加 1
- }
- if(K4 == 0){ //如果按動下調鍵
- item--; //數減 1
- }
- if(item>max) item=mini;//查看數值是否在有效范圍之內
- if(item<mini) item=max;//如果數值小于最小值,則自動等于最大值
- write_clock(0x8e,0x00);//允許寫1302芯片操作
- write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- }
- /****可參考***********可參考**************可參考***************以上是調試********
- /*主函數---------------------------------------------------------------------*/
- void main()
- {
- uchar e=0;
- K1=1;K2=1;K3=1;K4=1;//BLK=0;//K5=1;
- Init_1302(); //時鐘芯片初始化
- lcm_init(); //液晶初始化
- welcome(); //調用歡迎信息
- DelayM(4000); //歡迎信息 延時時間
- lcm_clr(); //清屏
- Clean_12864_GDRAM(); //清屏
- while(1)
- {
- if (w == 0) //正常走時
- {
- displaydate(); //顯示日期
- // displaynl(); //顯示農歷
- nongli(); //顯示農歷
- // displayjieqi(); //顯示節氣
- displaytime(); //顯示時間
- read_temp(); //讀取溫度
- ds1820disp(); //顯示溫度
- displayxq(); //顯示星期
- }
- else {} //否則啟動調時
- /*----------------------------設置時間--------------------------------------*/
- if (K1 == 0)
- {
- DelayM(20); //按鍵消抖
- if(K1 == 0 && w == 1) //當是調時狀態 本鍵用于調整下一項
- {
- e++;
- if (e >= 7 ) {e = 0;}
- while(! K1 ); //等待鍵松開
- Set_time(e); //調整
- }
- if(K1 == 0 && w == 0) //當是正常狀態時就進入調時狀態
- {
- lcm_clr();
- Clean_12864_GDRAM(); //清屏
- 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)
- {
- lcm_clr(); Clean_12864_GDRAM();
- write_com(0x30); write_com(0x06);
- welcome();
- while(K2 == 0);
- }
- lcm_clr(); Clean_12864_GDRAM();
- displaydate();
- displayxq();
- displaynl();
- 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);
- while(! K3 );
- }
- /*減調整--------------------------------------------------------------------*/
- if (K4 == 0 && w == 1)
- {
- DelayM(20);
- if(K4 == 0 && w == 1) { Set_time(e); }
- while(K4 == 0);
- while(! K4 );
- }
- /*液晶背光控制,按一下亮,再按一下滅----------------------------------------*/
- /* if(K5 == 0)
- {
- DelayM(20); q = ~q; //標志位取反
- if(q){BLK = BLK | 1;}
- else {BLK = BLK & 0;}
- while(K5 == 0);
- } */
- }
- }
- /*結束----------------------------------------------------------------------*/
復制代碼
所有資料51hei提供下載:
12864大字符時鐘原理圖.rar
(16.91 KB, 下載次數: 80)
2019-12-22 10:42 上傳
點擊文件名下載附件
12864+DS1302 +DS18B20 大字符時鐘.rar
(126.78 KB, 下載次數: 100)
2019-12-22 10:39 上傳
點擊文件名下載附件
12864+DS1302 +DS18B20 大字符時鐘原理圖.pdf
(377.31 KB, 下載次數: 67)
2019-12-21 14:05 上傳
點擊文件名下載附件
|