弄了個簡單的19264液晶時鐘,采用大數字顯示,用DS1302和ds12cr887時鐘芯片,分別兩個對應程序。只有時、分、秒和溫度顯示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1302.JPG.thumb.jpg (123.69 KB, 下載次數: 115)
下載附件
2019-6-27 15:37 上傳
Snap1.jpg.thumb.jpg (137.55 KB, 下載次數: 110)
下載附件
2019-6-27 15:37 上傳
0.png (12.53 KB, 下載次數: 108)
下載附件
2019-6-27 18:03 上傳
單片機源程序如下:
- /*系統頭文件--------------------------------------------------------------------*/
- #include <reg52.h>
- #include <absacc.h>
- /*包含的文件--------------------------------------------------------------------*/
- #include "MODEL.h"
- #include "LCD19264.h"
- #include "DS12CR887.h"
- #include "DS18B20.h"
- /*定義變量名--------------------------------------------------------------------*/
- #define uchar unsigned char
- #define uint unsigned int
- /*定義變量----------------------------------------------------------------------*/
- bit q=0,w=0; //調時標志位
- /*定義時間變量——————————————————————————————————————————————————————————————————*/
- uchar sec,min,hour;
- /*定義按鍵----------------------------------------------------------------------*/
- sbit K1 = P1^7; //按鍵K1-設置
- sbit K2 = P1^4; //按鍵K2-確認、返回
- sbit K3 = P1^6; //按鍵K3-加
- sbit K4 = P1^5; //按鍵K4-減
- sbit K5 = P1^3; //液晶背光控制按鍵,按一下亮,再按一下滅
- sbit BEEP= P1^2; //蜂鳴器
- sbit BLA = P1^0; //液晶背光控制輸出,低電平有效,PNP三極管控制。
- /*顯示時、分、秒————————————————————————————————————————————————————————————————*/
- void displaytime(void)
- {
- //往液晶屏填寫"小時"數據-----------------------------------------------
- hour=ds_read(4); //讀取DS12CR887的小時數據
- if((hour/10)==0){Show3264(0,0,11);}
- else {Show3264(0,0,(hour/10));} //小時十位
- Show3264(0,1,(hour%10)); //小時個位
- Show3264(0,2,10); //時鐘分隔符":"
- //往液晶屏填寫"分鐘"數據-----------------------------------------------
- min=ds_read(2); //讀取DS12CR887的分數據
- Show3264(0,3,(min/10)); //分鐘十位
- Show3264(0,4,(min%10)); //分鐘個位
- //往液晶屏填寫"秒"數據-------------------------------------------------
- sec=ds_read(0); //讀取DS12CR887的秒數據
- Show1632(2,10,(sec/10)); //秒鐘十位
- Show1632(2,11,(sec%10)); //秒鐘個位
- }
- /*設置日期、時間函數------------------------------------------------------------*/
- void Set_time(uchar sel)
- {
- signed char address,item;
- signed char max,mini;
- ds_write(0x0a,0x00); //開始調時,DS12CR887關閉時鐘振蕩器
- ShowHZ(0,10,0); //顯示"設"
- ShowHZ(0,11,1); //顯示"置"
- if(sel==2) {ShowHZ(1,10,6);ShowHZ(1,11,3);address=0; max=59;mini=0;}//秒鐘
- if(sel==1) {ShowHZ(1,10,2);ShowHZ(1,11,3);address=2; max=59;mini=0;}//分鐘
- if(sel==0) {ShowHZ(1,10,4);ShowHZ(1,11,5);address=4; max=23;mini=0;}//小時
- item=ds_read(address); //讀取DS12CR887某地址上的數值賦給item
- if(K3 == 0) {item++;} //K3-加數:1
- if(K4 == 0) {item--;} //K4-減數:1
- if(item>max) item=mini; //限制數值最大有效范圍
- if(item<mini) item=max; //限制數值最小有效范圍
- ds_write(address,item); //將調整好的item值寫入DS12CR887
- displaytime(); //顯示時間
- }
- /*主函數------------------------------------------------------------------------*/
- void main()
- {
- uchar e=0;
- K1=1;K2=1;K3=1;K4=1;K5=1; //按健復位
- BLA=0; //打開液晶、按鍵背光
- BEEP=0; //蜂鳴器響50毫秒
- DelayM(50);
- BEEP=1;
- ds_int(); //DS12CR887初始化
- InitLCD(); //液晶屏初始化
- while(1)
- {
- if(w==0)
- {
- displaytime();
- read_temp(); //讀取溫度
- ds1820disp(); //顯示溫度
- } //正常走時
- else {} //否則啟動調時
- //設置鍵------------------------------------------------------------------------
- if (K1 == 0) // 設置時間
- {
- DelayM(20); //按鍵消抖
- if(K1 == 0 && w == 1) //當是調時狀態 本鍵用于調整下一項
- {
- e++;
- if (e >= 3 ){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); //清除左中右屏顯示
- ds_write(0x0a,0x20); //調時完成,DS12CR887開啟時鐘振蕩器
- 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){BLA = BLA | 1;}
- else {BLA = BLA & 0;}
- while(K5 == 0);
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.gif (108.14 KB, 下載次數: 63)
下載附件
2022-10-9 04:23 上傳
所有資料51hei下載:
1302的版本(只能用Proteus7.5 不然屏幕會顯示空白 需要自行安裝幾個庫):
LCM19264_DS1302.rar
(243.19 KB, 下載次數: 202)
2019-6-27 15:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
887版本 同上只能用Proteus7.5打開 其他版本測試是空白顯示:
19264液晶時鐘.rar
(259.69 KB, 下載次數: 208)
2019-6-27 15:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|