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 #include #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();
上一篇:STC89C52+LCD12864+DS1302+DS18B20時鐘原理圖+源程序
下一篇:單片機驅動帶編碼器直流電機 源程序
推薦閱讀
史海拾趣
隨著公司產品的不斷成熟和市場的逐漸擴大,DAPAudio開始將目光投向國際市場。通過與國際知名品牌的合作和自身的市場拓展努力,DAPAudio的產品逐漸進入歐美等發達國家和地區的市場。在國際市場上,DAPAudio憑借其卓越的產品性能和優質的服務贏得了廣泛的贊譽和認可。
DAPAudio公司自成立以來,一直將技術創新作為公司發展的核心動力。在音頻處理領域,DAPAudio率先推出了基于先進算法的數字音頻處理器,其獨特的音質優化技術迅速贏得了市場的認可。隨著技術的不斷迭代和更新,DAPAudio的產品逐漸在高端音頻市場占據了一席之地。
在國內市場取得一定成績后,ACI開始尋求國際合作,以進一步拓寬市場。公司與國際知名電子企業建立了戰略合作關系,共同研發新產品,開拓新市場。這些合作不僅提升了ACI的技術水平,還為其帶來了更多的國際訂單。
通過國際合作,ACI的產品逐漸進入國際市場,公司的影響力不斷擴大。同時,ACI也積極參與國際電子行業的交流活動,與同行分享經驗,學習先進技術,不斷提升自身實力。
在國內市場取得一定成績后,ACI開始尋求國際合作,以進一步拓寬市場。公司與國際知名電子企業建立了戰略合作關系,共同研發新產品,開拓新市場。這些合作不僅提升了ACI的技術水平,還為其帶來了更多的國際訂單。
通過國際合作,ACI的產品逐漸進入國際市場,公司的影響力不斷擴大。同時,ACI也積極參與國際電子行業的交流活動,與同行分享經驗,學習先進技術,不斷提升自身實力。
為了推動公司的進一步發展,宏發公司于2008年進行了股份制改造,并成立了“廈門宏發電聲股份有限公司”。2012年,公司成功上市,通過資本市場獲得了更多的資金支持和發展動力。上市后,宏發繼續加大在技術研發、市場拓展和產能提升等方面的投入,不斷鞏固和擴大其在繼電器行業的領先地位。同時,公司還積極履行社會責任,為行業發展和地方經濟做出了積極貢獻。
為了提升產品質量和競爭力,意普(ESPE)公司開始注重品質管理,建立了嚴格的質量檢測體系。同時,公司積極申請國際認證,成功獲得了歐洲四級安全認證體系,進一步提升了產品的國際競爭力。這些努力不僅贏得了客戶的信任,也為公司打開了國際市場的大門。
學習,老師是非常關鍵的環節。對于嵌入式的學習當然也不例外。所以,在嵌入式的學習中,老師是很重要的要素之一。 嵌入式學習,挑選什么樣的老師? 雙師型老師。具體的來說,一方面,具備嵌入式的研發經驗,有獨立開發的項目和作品,在嵌入式行 ...… 查看全部問答∨ |
|
在EVC軟件中,有一個選擇SDK的框,但是沒有我要的SDK,隨后我將需要的SDK安裝完畢,但不知道怎么做,才能在這個里面選擇出來。 我想這個問題應該是很初級的問題了,但我是初學者,所以弄不明白。 謝謝解答! … 查看全部問答∨ |
|
目前在調一款rtc的芯片,通過iic進行讀寫的,目前采用的是模擬的方式。 現在的問題是,我用普通的io口進行模擬的話,讀寫都沒有問題,但是如果換成了接了上拉電阻的io口的話,讀寫都不正常了 個人感覺不可理解 希望各位幫忙分析查找原因… 查看全部問答∨ |
|
用的是stareast公司的ixp425開發板。由于光盤所帶snapgear版本稍舊,所以干脆網上下載gateworks公司為IXP425提供的avila軟件套裝。在配置中把開發平臺由avila改為ixdp425,kernel command line改為: "console=ttyS1,115200 root=/dev/ram0 initrd= ...… 查看全部問答∨ |