制作出来的实物图如下:
单片机源程序如下:
- /**********************************************
- 电子数字时钟程序
- 单 片 机:STC15F2K60S2
- 晶 振:12MHz
- 液 晶 屏:LCM-12864-ST7920
- 时 间:2026年02月25日修改完成
- LCM12864使用并口连接方式,PSB、RST接高电平
- **********************************************/
- //头文件
- #include "stc15f.h"
- #include <intrins.h>
- #include "LCD12864.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "NongLi.h"
- #include "Display_Time.h"
- #include "ZiKu.h"
- #include <math.h>
- #define uint unsigned int
- #define uchar unsigned char
- //定义按键
- sbit K1 =P2^3; //K1-设置
- sbit K2 =P2^4; //K2-确认、返回
- sbit K3 =P2^6; //K3-加
- sbit K4 =P2^7; //K4-减
- sbit BLK=P2^0;
- sbit wei=P3^6;
- sbit duan=P3^7;
- //函数声明
- void Add_Sub();
- void Delayms(uint);
- //定义全局变量
- bit W=0;
- uchar Miao,Fen,Shi,Ri,Yue,Zhou,Nian,Moontemp1,Moontemp2;
- signed char Address,Item,Max,Min;
- //延时函数1ms/次
- void Delayms(uint ms)
- {
- uchar i;
- while(--ms!=0)
- for(i=0;i<125;i++);
- }
- //日期、时间设置函数
- void Set_Time()
- {
- Nian=Read_DS1302(0x8D);
- Yue=Read_DS1302(0x89);
- Ri=Read_DS1302(0x87);
- Week=Read_DS1302(0x8B);
- Write_LCD(0,0x80);
- Write_String("20");
- Write_LCD(1,(Nian/16)+0x30);
- Write_LCD(1,Nian%16+0x30);
- Write_String("年");
- Write_LCD(1,(Yue/16)+0x30);
- Write_LCD(1,Yue%16+0x30);
- Write_String("月");
- /*
- Write_LCD(0,0x88);
- Write_String("星期");
- Write_LCD(1,Yue%16+0x30);
- */
- Write_LCD(1,(Ri/16)+0x30);
- Write_LCD(1,Ri%16+0x30);
- Write_String("日");
- if(Read_DS1302(0x85)!=Shi)
- Shi=Read_DS1302(0x85);
-
- Write_LCD(0,0x91);
- Write_LCD(1,(Shi/16)+0x30);
- Write_LCD(1,Shi%16+0x30);
- Write_String("时");
- if(Read_DS1302(0x83)!=Fen)
- Fen=Read_DS1302(0x83);
- Write_LCD(1,(Fen/16)+0x30);
- Write_LCD(1,Fen%16+0x30);
- Write_String("分");
- if(Read_DS1302(0x81)!=Miao)
- Miao=Read_DS1302(0x81);
- Write_LCD(1,(Miao/16)+0x30);
- Write_LCD(1,Miao%16+0x30);
- Write_String("秒");
- }
- //调整时间子函数
- void Set_time(uchar Set)
- {
- Write_Com(0x30);
- Write_Com(0x06);
- Write_LCD(0,0x98);
- Write_String("★调整");
-
- /* if(Set==6)
- {
- Write_String("星期");
- Address=0x8A;
- Max=7;
- Min=1;
- Set_Time();
- ds_w();
- Set_Time();
- }
- */
- if(Set==5)
- {
- Write_String("秒钟");
- Address=0x80;
- Max=59;
- Min=0;
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- if(Set==4)
- {
- Write_String("分钟");
- Address=0x82;
- Max=59;
- Min=0;
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- if(Set==3)
- {
- Write_String("小时");
- Address=0x84;
- Max=23;
- Min=0;
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- if(Set==2)
- {
- Write_String("日期");
- Address=0x86;
- Yue=Read_DS1302(0x89);
- Moontemp1=Yue/16;
- Moontemp2=Yue%16;
- Yue=Moontemp1*10+Moontemp2;
- Nian= Read_DS1302(0x8d);
- Moontemp1=Nian/16;
- Moontemp2=Nian%16;
- Nian=Moontemp1*10+Moontemp2;
- if(Yue==2&&Nian%4!=0)
- {
- Max=28;
- Min=1;
- }
- if(Yue==2&&Nian%4==0)
- {
- Max=29;
- Min=1;
- }
- if(Yue==1||Yue==3||Yue==5||Yue==7||Yue==8||Yue==10||Yue==12)
- {
- Max=31;
- Min=1;
- }
- if(Yue==4||Yue==6||Yue==9||Yue==11)
- {
- Max=30;
- Min=1;
- }
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- if(Set==1)
- {
- Write_String("月份");
- Address=0x88;
- Max=12;
- Min=1;
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- if(Set==0)
- {
- Write_String("年份");
- Address=0x8C;
- Max=99;
- Min=0;
- Set_Time();
- Add_Sub();
- Set_Time();
- }
- }
- //加减子函数
- void Add_Sub()
- {
- Item=((Read_DS1302(Address+1))/16)*10+(Read_DS1302(Address+1))%16;
-
- if(K3==0) //如果按动上调键
- Item++; //数加 1
- if(K4==0) //如果按动下调键
- Item--; //数减 1
- if(Item>Max)
- Item=Min;
- if(Item<Min)
- Item=Max;
- Write_DS1302(0x8E,0x00);
- Write_DS1302(Address,(Item/10)*16+Item%10);
- Write_DS1302(0x8E,0x80);
- }
- //主函数
- void main()
- {
- uchar E=0;
- BLK=0;K1=1;K2=1;K3=1;K4=1;
- wei=0;
- duan=0;
- Init_DS1302();
- Init_LCD();
- Welcome();
- Delayms(3000);
- Delayms(3000);
- Delayms(3000);
- Clear_LCD();
- Clear12864_GDRAM();
- while(1)
- {
- if(W==0)
- {
- Display_Date();
- Display_Nl();
- Display_Time();
- Read_Temp();
- Display_Temp();
- Display_Week();
- }
- else {}
- //设置时间
- if(K1==0)
- {
- Delayms(20);
- if(K1==0&&W==1)
- {
- E++;
- if(E>=7)
- E=0;
- while(!K1);
- Set_time(E); //调整
- }
- if(K1==0&&W==0)
- {
- Clear_LCD();
- Clear12864_GDRAM();
- W=1;
- Set_time(E);
- }
- while(!K1);
- }
- //退出设置
- if(K2==0)
- {
- Delayms(20);
- if(K2==0&&W==1)
- {
- W=0;
- E=0;
- }
- if(K2==0&&W==0)
- {
- Clear_LCD();
- Clear12864_GDRAM();
- Write_Com(0x30);
- Write_Com(0x06);
- Welcome();
- while(!K2);
- }
- Clear_LCD();
- Clear12864_GDRAM();
- Display_Date();
- Display_Week();
- Display_Nl();
- Display_Time();
- Read_Temp();
- Display_Temp();
- while(!K2);
- }
- //加调整
- if(K3==0&&W==1)
- {
- Delayms(20);
- if(K3==0&&W==1)
- Set_time(E);
- while(!K3);
- }
- //减调整
- if(K4==0&&W==1)
- {
- Delayms(20);
- if(K4==0&&W==1)
- Set_time(E);
- while(!K4);
- }
- }
- }
复制代码
原理图和程序下载:
12864数显时钟温度.7z
(95.76 KB, 下载次数: 0)
|