實物展示
1,開燈與關燈
小臺燈功率不大 所以沒有加入調光
需要大功率調光臺燈的則要改臺燈電路
IMG_20210302_204635.jpg (4.46 MB, 下載次數: 203)
下載附件
2021-3-2 21:16 上傳
IMG_20210302_204643.jpg (4.53 MB, 下載次數: 193)
下載附件
2021-3-2 21:17 上傳
2,背光關顯示狀態
小臺燈打開狀態下 屏背光燈常開
其他狀態下 如果大約30秒內無操作 則自動關背光燈
IMG_20210302_205555.jpg (4.97 MB, 下載次數: 192)
下載附件
2021-3-2 21:34 上傳
3,背光燈支持自動調光
與手機一樣 弱暗光下 屏背光柔和不刺眼
IMG_20210302_204801.jpg (2.53 MB, 下載次數: 183)
下載附件
2021-3-2 21:35 上傳
4,節日節氣生肖顯示
農歷節日 公歷節日 24節氣 生肖
若遇到節日重疊 則輪番顯示 無節日則顯示生肖
IMG_20210302_212330.jpg (4.57 MB, 下載次數: 194)
下載附件
2021-3-2 21:29 上傳
IMG_20210302_212317.jpg (4.84 MB, 下載次數: 177)
下載附件
2021-3-2 21:30 上傳
IMG_20210302_212256.jpg (4.73 MB, 下載次數: 193)
下載附件
2021-3-2 21:30 上傳
IMG_20210302_212602.jpg (4.75 MB, 下載次數: 185)
下載附件
2021-3-2 21:31 上傳
5,時鐘設置
時分秒年月日包括鬧鐘字體反白設置
IMG_20210302_212553.jpg (4.73 MB, 下載次數: 194)
下載附件
2021-3-2 21:32 上傳
6,其他 溫濕顯示 小動物輪流顯示
帶字體顯示微調與屏背光微調 調出舒服視覺
IMG_20210302_112355.jpg (1.57 MB, 下載次數: 188)
下載附件
2021-3-2 22:01 上傳
IMG_20210302_112414.jpg (4.9 MB, 下載次數: 181)
下載附件
2021-3-2 22:01 上傳
7,仿真電路圖
因為使用STC12C5A60S2 仿真溫濕顯示無數據
請勿使用89C52來做 跑得慢估計夠嗆的 反正仿真嗆的很 也不知道是不是我的電腦太菜了
提示:仿真版本8.9 低于8.9都打不開的
屏幕截圖 2021-03-02 204304.png (113.51 KB, 下載次數: 211)
下載附件
2021-3-2 22:05 上傳
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.png (6.56 KB, 下載次數: 207)
下載附件
2021-3-3 02:38 上傳
全部程序51hei下載地址:
LCD12964 A多功能時鐘.zip
(226.38 KB, 下載次數: 1001)
2021-3-2 22:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|