實物展示
1,開燈與關(guān)燈
小臺燈功率不大 所以沒有加入調(diào)光
需要大功率調(diào)光臺燈的則要改臺燈電路
2,背光關(guān)顯示狀態(tài)
小臺燈打開狀態(tài)下 屏背光燈常開
其他狀態(tài)下 如果大約30秒內(nèi)無操作 則自動關(guān)背光燈
3,背光燈支持自動調(diào)光
與手機一樣 弱暗光下 屏背光柔和不刺眼
4,節(jié)日節(jié)氣生肖顯示
農(nóng)歷節(jié)日 公歷節(jié)日 24節(jié)氣 生肖
若遇到節(jié)日重疊 則輪番顯示 無節(jié)日則顯示生肖
5,時鐘設(shè)置
時分秒年月日包括鬧鐘字體反白設(shè)置
6,其他 溫濕顯示 小動物輪流顯示
帶字體顯示微調(diào)與屏背光微調(diào) 調(diào)出舒服視覺
7,仿真電路圖
因為使用STC12C5A60S2 仿真溫濕顯示無數(shù)據(jù)
請勿使用89C52來做 跑得慢估計夠嗆的 反正仿真嗆的很 也不知道是不是我的電腦太菜了
提示:仿真版本8.9 低于8.9都打不開的
9,部分程序 寫得不好 請多提點
#include <STC12C5A60S2.H> //此文件中定義了單片機的一些特殊功能寄存器
#include "Delay.h" //全局通用延時頭文件
#include "19264ks0108ZK.h" //19264屏字庫
#include "19264ks0108.h" //19264屏驅(qū)動
#include "ds3231.h" //ds3231時鐘芯片驅(qū)動
#include "rqzh.h" //日期轉(zhuǎn)換
#include "dht11.h" //DHT11濕度溫度驅(qū)動
#define uchar unsigned char //宏定義無符號字符形數(shù)據(jù)類型進行聲明定義 定義名稱uchar 所占位數(shù)8位 范圍0~255
#define uint unsigned int //宏定義無符號整形數(shù)據(jù)類型進行聲明定義 定義名稱uint 所占位數(shù)16位 范圍0~65535
sbit LED_NO=P1^7; //LEDD開關(guān)按鍵
sbit SJTZ_k1=P1^6; //調(diào)整時鐘按鍵
sbit SJTZ_k2=P1^5; //調(diào)整時鐘加按鍵
sbit SJTZ_k3=P1^4; //調(diào)整時鐘減按鍵
sbit SJTZ_k4=P1^3; //調(diào)整時鐘OK按鍵
sbit fmq=P1^2; //鬧鐘蜂鳴器引腳
sbit LED=P3^7; //LEDD燈引腳
sbit pingbg=P3^6; //屏背光引腳
sbit nz_KG=P2^0; //鬧鐘開關(guān)引腳
uint pingbgjs; //用于屏背光自動控制定時計數(shù)標志
uchar SJTZ=0; //調(diào)整時鐘標志
uchar jia=0; //調(diào)整時鐘或鬧鐘加標志
uchar jian=0; //調(diào)整時鐘或鬧鐘減標志
uchar fb_nian,fb_yue,fb_ri,fb_shi,fb_fen,fb_nz1_shi,fb_nz1_fen;//調(diào)整時鐘反白標志
uchar NZ_xl=0; //鬧鐘狀態(tài)標志 NZ_xl=0不響鈴 NZ_xl=1響鈴
static uint D=0,L=0; //聲明定時器static靜態(tài)變量標志 用于某些功能計數(shù)
/*按鍵程序*/
void anjian()
{
if(LED_NO==0||SJTZ_k1==0||SJTZ_k2==0||SJTZ_k3==0||SJTZ_k4==0) //任意鍵開屏背光
{
if(pingbg==1)pingbg=0; //屏背光開
pingbgjs=0; //定時計數(shù)清零
}
if(pingbg==1||LED==0) //當背光關(guān)閉或LED臺燈打開時關(guān)閉定時器
{ //即在LED臺燈打開下屏背光常亮 直至LED臺燈關(guān)閉為止定時計數(shù)又開始重新計數(shù)
TR0 = 0;
pingbgjs=0; //定時計數(shù)清零
}
else TR0 = 1; //當背光打開時定時器開始計數(shù) 用于屏背光自動關(guān)閉控制
if(pingbg==1)SJTZ=0; //如果在屏背光關(guān)閉后 強行退出時鐘設(shè)置
if(LED==0&&(SJTZ==0||SJTZ==1))SJTZ=1;
if(LED_NO==0) //LED臺燈開關(guān)
{
Delay_ms(10); //按鍵消抖延時10微秒
if(LED_NO==0)
{
LED=~LED;
}
while(!LED_NO); //檢測按鍵是否松開
}
if(SJTZ_k1==0) //時鐘調(diào)整
{
Delay_ms(10); //按鍵消抖延時10微秒
if(SJTZ_k1==0)
{
SJTZ++;
if(SJTZ==9)SJTZ=2;
}
while(!SJTZ_k1); //檢測按鍵是否松開
}
if(SJTZ_k2==0) //時鐘調(diào)整加
{
jia=1; //設(shè)置時鐘+1
Delay_ms(150); //延時一段時間 如果還沒松開 繼續(xù)加
}
else(jia=0);
if(SJTZ_k3==0) //時鐘調(diào)整減
{
jian=1; //設(shè)置時鐘-1
Delay_ms(150); //延時一段時間 如果還沒松開 繼續(xù)減
}
else(jian=0);
if(SJTZ_k4==0&&NZ_xl==0) //完成退出
{
if(SJTZ!=0&&SJTZ!=1)
{
Disp_16x16(8,0,0,ZM_16x16[22]);
Disp_16x16(9,0,0,ZM_16x16[23]);
Disp_16x16(10,0,0,ZM_16x16[24]);
}
SJTZ=1;
}
if(SJTZ_k4==0&&NZ_xl==1||SJTZ!=0&&SJTZ!=1||nz_KG==1) //如果鬧鐘響時 此按鍵可以關(guān)閉鬧鐘響聲
{
fmq=1;
NZ_xl=0; //關(guān)閉響鈴
TR1 = 0; //關(guān)閉定時器1
D=0;
L=0;
}
}
/*時鐘設(shè)置程序*/
void SZSZ()
{
if(SJTZ==0||SJTZ==1)
{
Ds3231ReadTime(); //運行時鐘數(shù)據(jù)
}
else //如果SJTZ!=0時 證明進入了時鐘時鐘
{
Ds3231Init(); //停止時鐘 調(diào)整時鐘數(shù)據(jù)寫入ds3231
rilijis(); //讀取日歷自動計算函數(shù)
}
if(SJTZ==2)
{
fb_fen=1;
if(jia==1)if(fen<59)fen=fen+1;else(fen=0); //調(diào)整分+
if(jian==1)if(fen>0)fen=fen-1;else(fen=59); //調(diào)整分-1
}
else(fb_fen=0);
if(SJTZ==3)
{
fb_shi=1;
if(jia==1)if(shi<23)shi=shi+1;else(shi=0); //調(diào)整時+1
if(jian==1)if(shi>0)shi=shi-1;else(shi=23); //調(diào)整時-1
}
else(fb_shi=0);
if(SJTZ==4)
{
fb_ri=1;
if(yue!=2&&yue_dx==0&&jia==1)if(ri<31)ri=ri+1;else(ri=1); //調(diào)整日+1
if(yue!=2&&yue_dx==0&&jian==1)if(ri>1)ri=ri-1;else(ri=31); //調(diào)整日-1
/*4,6,9,11月只有30天 為小月*/
if(yue!=2&&yue_dx==1&&jia==1)if(ri<30)ri=ri+1;else(ri=1); //調(diào)整日+1
if(yue!=2&&yue_dx==1&&jian==1)if(ri>1)ri=ri-1;else(ri=30); //調(diào)整日-1
/*...如果是閏年只有29天.....*/
if(yue==2&&nian_r==0&&jia==1)if(ri<29)ri=ri+1;else(ri=1); //調(diào)整日+1
if(yue==2&&nian_r==0&&jian==1)if(ri>1)ri=ri-1;else(ri=29); //調(diào)整日-1
/*....如果是平年只有28天.....*/
if(yue==2&&nian_r==1&&jia==1)if(ri<28)ri=ri+1;else(ri=1); //調(diào)整日+1
if(yue==2&&nian_r==1&&jian==1)if(ri>1)ri=ri-1;else(ri=28); //調(diào)整日-1
}
else(fb_ri=0);
if(SJTZ==5)
{
fb_yue=1;
if(jia==1)if(yue<12)yue=yue+1;else(yue=1); //調(diào)整月+1
if(jian==1)if(yue>1)yue=yue-1;else(yue=12); //調(diào)整月-1
}
else(fb_yue=0);
if(SJTZ==6)
{
fb_nian=1;
if(jia==1)if(nian<99)nian=nian+1;else(nian=0); //調(diào)整年+1
if(jian==1)if(nian>0)nian=nian-1;else(nian=99); //調(diào)整年-1
}
else(fb_nian=0);
/*............以下是鬧鐘設(shè)置函數(shù)....................*/
if(SJTZ==7)
{
fb_nz1_fen=1;
if(jia==1)if(nz1_fen<59)nz1_fen=nz1_fen+1;else(nz1_fen=0); //鬧鐘1鐘分+1
if(jian==1)if(nz1_fen>0)nz1_fen=nz1_fen-1;else(nz1_fen=59); //鬧鐘鐘分-1
}
else (fb_nz1_fen=0);
if(SJTZ==8)
{
fb_nz1_shi=1;
if(jia==1)if(nz1_shi<23)nz1_shi=nz1_shi+1;else(nz1_shi=0); //鬧鐘1時加+1
if(jian==1)if(nz1_shi>0)nz1_shi=nz1_shi-1;else(nz1_shi=23); //鬧鐘時-1
}
else (fb_nz1_shi=0);
}
/*農(nóng)歷生肖其他節(jié)日--------------------------------------------------------------------*/
void jshs()
{
nonglixs(); //顯示農(nóng)歷
jiqijs(); //節(jié)氣計算
nonglijrjs(); //農(nóng)歷節(jié)日計算
gljr(); //公歷節(jié)日計算
if(jieqijs!=0&&nljs==0&&gljrjs==0) //如果當天只有節(jié)氣 生肖與節(jié)氣輪番顯示
{
if(miao>=0&&miao<30)shengxiaoxs();//顯示生肖
if(miao>=30&&miao<=59)jieqixs(); //顯示節(jié)氣
}
else if(jieqijs==0&&nljs!=0&&gljrjs==0) //如果當天只有農(nóng)歷節(jié)日 生肖與節(jié)氣輪番顯示
{
if(miao>=0&&miao<30)shengxiaoxs(); //顯示生肖
if(miao>=30&&miao<=59)nonglijrxs(); //農(nóng)歷節(jié)日顯示
}
else if(jieqijs==0&&nljs==0&&gljrjs!=0) //如果當天只有公歷節(jié)日 生肖與節(jié)氣輪番顯示
{
if(miao>=0&&miao<30)shengxiaoxs(); //顯示生肖
if(miao>=30&&miao<=59)gljxs(); //公歷節(jié)日顯示
}
else if(jieqijs!=0&&nljs!=0&&gljrjs==0) //如果當天同時有節(jié)氣農(nóng)歷節(jié)日 生肖與農(nóng)歷節(jié)日與節(jié)氣輪番顯
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖
if(miao>=20&&miao<40)jieqixs(); //顯示節(jié)氣
if(miao>=40&&miao<=59)nonglijrxs(); //農(nóng)歷節(jié)日顯示
}
else if(jieqijs==0&&nljs!=0&&gljrjs!=0) //如果當天同時有農(nóng)歷節(jié)日公歷節(jié)日 農(nóng)歷節(jié)日與公歷節(jié)日輪番顯
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖
if(miao>=20&&miao<40)nonglijrxs(); //農(nóng)歷節(jié)日顯示
if(miao>=40&&miao<=59)gljxs(); //公歷節(jié)日顯示
}
else if(jieqijs!=0&&nljs==0&&gljrjs!=0) //如果當天同時有生肖公歷節(jié)日 生肖與公歷節(jié)日輪番顯
{
if(miao>=0&&miao<20)shengxiaoxs(); //顯示生肖
if(miao>=20&&miao<40)jieqixs(); //顯示節(jié)氣
if(miao>=40&&miao<=59)gljxs(); //公歷節(jié)日顯示
}
else if(jieqijs!=0&&nljs!=0&&gljrjs!=0) //如果當天同時有生肖農(nóng)歷節(jié)日公歷節(jié)日 生肖與農(nóng)歷與公歷節(jié)日輪番顯
{
if(miao>=0&&miao<15)shengxiaoxs(); //顯示生肖
if(miao>=15&&miao<30)jieqixs(); //顯示節(jié)氣
if(miao>=30&&miao<45)nonglijrxs(); //農(nóng)歷節(jié)日顯示
if(miao>=45&&miao<=59)gljxs(); //公歷節(jié)日顯示
}
else shengxiaoxs(); //如果沒有其他節(jié)日只顯示生肖
}
/*鬧鐘相關(guān)--------------------------------------------------------------------*/
void naozhong()
{
if(nz_KG==0||(SJTZ!=0&&SJTZ!=1))Disp_16x16(7,0,0,ZM_16x16[21]); //顯示鬧鐘圖標
else Disp_16x16(7,0,0,ZM_16x16[0]);
if((SJTZ!=0&&SJTZ!=1)) //顯示鬧鐘
{
Disp_8x16(16,0,fb_nz1_shi,ZM_8x16[nz1_shi/10]); //
Disp_8x16(17,0,fb_nz1_shi,ZM_8x16[nz1_shi%10]); //鬧鐘時
Disp_8x16(18,0,0,ZM_8x16[15]);
Disp_8x16(19,0,fb_nz1_fen,ZM_8x16[nz1_fen/10]); //
Disp_8x16(20,0,fb_nz1_fen,ZM_8x16[nz1_fen%10]); //鬧鐘分
Disp_8x16(21,0,0,ZM_8x16[16]);
}
if(shi==nz1_shi&&fen==nz1_fen&&miao==0&&nz_KG==0) //鬧鐘對比
{
TR1 = 1; //打開定時器1
NZ_xl=1; //NZ_xl=1響鈴
}
}
/*主函數(shù)--------------------------------------------------------------------*/
void main()//無返回值主函數(shù)
{
TMOD = 0x11; //定時器0與定時器1打開
TH0 = 0x0D1;
TL0 = 0x20; //給定時器0賦初值,定時1ms
TH1 = 0x0D1;
TL1 = 0x20; //給定時器1賦初值,定時1ms
ET0 = 1; //打開定時器0中斷允許
TR0 = 1; //打開定時器0
ET1 = 1; //打開定時器1中斷允許
//TR1 = 1; //打開定時器1
EA = 1; //打開總中斷
pingbg=0; //剛通電屏背光開
SJTZ=1;
LCD19264AInit(); //LCD19264A初始化
ClearDisplay(); //LCD19264A清屏
zhoucqh(); //DS3231芯片初次通電時鐘初始化
while(1)
{
anjian(); //按鍵程序
SZSZ(); //時鐘設(shè)置程序
jshs(); //農(nóng)歷生肖其他節(jié)日顯示
naozhong();//鬧鐘相關(guān)
Disp_8x16(0,0,fb_nian,ZM_8x16[2]); //
Disp_8x16(1,0,fb_nian,ZM_8x16[0]); //
Disp_8x16(2,0,fb_nian,ZM_8x16[nian/10]); //
Disp_8x16(3,0,fb_nian,ZM_8x16[nian%10]); //年
Disp_8x16(4,0,0,ZM_8x16[10]); //-
Disp_8x16(5,0,fb_yue,ZM_8x16[yue/10]); //
Disp_8x16(6,0,fb_yue,ZM_8x16[yue%10]); //月
Disp_8x16(7,0,0,ZM_8x16[10]); //-
Disp_8x16(8,0,fb_ri,ZM_8x16[ri/10]); //
Disp_8x16(9,0,fb_ri,ZM_8x16[ri%10]); //日
Disp_16x32(0,8,fb_shi,ZM_16x32[shi/10]); //
Disp_16x32(1,8,fb_shi,ZM_16x32[shi%10]); //時
Disp_16x32(2,8,0,ZM_16x32[10]); //:
Disp_16x32(3,8,fb_fen,ZM_16x32[fen/10]); //
Disp_16x32(4,8,fb_fen,ZM_16x32[fen%10]); //分
Disp_16x32(5,8,0,ZM_16x32[10]); //:
Disp_16x32(6,8,0,ZM_16x32[miao/10]); //
Disp_16x32(7,8,0,ZM_16x32[miao%10]); //秒
Disp_16x16(5,3,0,ZM_16x16[18]); //星
Disp_16x16(6,3,0,ZM_16x16[19]); //期
switch(zhou)
{
case 1:Disp_16x16(7,3,0,ZM_16x16[1]);break; //星期一
case 2:Disp_16x16(7,3,0,ZM_16x16[2]);break; //星期二
case 3:Disp_16x16(7,3,0,ZM_16x16[3]);break; //星期三
case 4:Disp_16x16(7,3,0,ZM_16x16[4]);break; //星期四
case 5:Disp_16x16(7,3,0,ZM_16x16[5]);break; //星期五
case 6:Disp_16x16(7,3,0,ZM_16x16[6]);break; //星期六
case 7:Disp_16x16(7,3,0,ZM_16x16[17]);break; //星期天
}
DHT11_receive(); //讀取濕度溫度函數(shù)
Disp_8x16(18,1,0,ZM_8x16[11]);
Disp_8x16(20,1,0,ZM_8x16[RH/10]); //濕度
Disp_8x16(21,1,0,ZM_8x16[RH%10]);
Disp_8x16(22,1,0,ZM_8x16[12]);
Disp_8x16(18,2,0,ZM_8x16[13]);
Disp_8x16(20,2,0,ZM_8x16[TH/10]); //溫度
Disp_8x16(21,2,0,ZM_8x16[TH%10]);
Disp_8x16(22,2,0,ZM_8x16[14]);
if(LED==0)Disp_16x16(6,0,0,ZM_16x16[20]); //臺燈圖標顯示
else Disp_16x16(6,0,0,ZM_16x16[0]);
/*顯示小動物圖標*/
if(SJTZ==0||SJTZ==1)
{
if(miao>=0&&miao<5)Disp_16x16(8,0,0,ZM_16x16[22]);
else if(miao>=5&&miao<10)
{
Disp_16x16(8,0,0,ZM_16x16[0]);
Disp_16x16(9,0,0,ZM_16x16[23]);
}
else if(miao>=10&&miao<15)
{
Disp_16x16(9,0,0,ZM_16x16[0]);
Disp_16x16(10,0,0,ZM_16x16[24]);
}
else if(miao>=15&&miao<20)Disp_16x16(10,0,0,ZM_16x16[0]);
else
{
Disp_16x16(8,0,0,ZM_16x16[22]);
Disp_16x16(9,0,0,ZM_16x16[23]);
Disp_16x16(10,0,0,ZM_16x16[24]);
}
}
}
}
/*定時器1函數(shù)*/
void Timer0() interrupt 1
{
TH0 = 0x0D1;
TL0 = 0x20; //給定時器0賦初值,定時1ms
if(pingbg==0) //當背光打開時定時器開始計數(shù) 用于屏背光自動關(guān)閉控制
{
pingbgjs++;
if(pingbgjs==3000) pingbg=1; //屏背光開后如果無操作大約30秒后關(guān)閉屏背光
}
else pingbgjs=0; //定時計數(shù)清零
}
/*定時器1函數(shù)*/
void Timer1() interrupt 3
{
TH1 = 0x0D1;
TL1 = 0x20; //給定時器1賦初值,定時1ms
D++;
if(D==100)D=0;
if(D>0&&D<50)
{
L++;
if(L==10)
{
L=0;
fmq=~fmq; //鬧鐘時間到時蜂鳴器響鈴
}
}
else(L=0);
}
全部程序51hei下載地址:
LCD12964 A多功能時鐘.zip
(226.38 KB, 下載次數(shù): 1001)
2021-3-2 22:20 上傳
點擊文件名下載附件
|