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