标题:
基于单片机的万年历diy
[打印本页]
作者:
兔子静静
时间:
2020-11-13 21:23
标题:
基于单片机的万年历diy
这是我上个月基于单片机的万年历设计,用了一个星期的时间,
51hei.png
(207.27 KB, 下载次数: 42)
下载附件
2020-11-13 21:55 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E =P2^2;
sbit DS_CLK=P1^2;
sbit DS_IO =P1^1;
sbit DS_RES=P1^0;
sbit Key_Clock=P1^4;
sbit Key_Set=P1^5;
sbit Key_up=P1^6;
sbit Key_down=P1^7;
sbit fengmingqi=P1^3;
sbit DQ =P3^3;
uchar warning_tem[4]=0;
uchar time_buf[10];
uchar time_buf1[10];
uchar time_buf2[20];
uchar temp_buf[7];
uchar taozhong_buf[6]={0};
uchar anjianzhi=0;
uchar time1_jishu1=0;
uchar time_jishu2=0;
///////////////////////
uchar DS18B20_Mode=0;
uchar Clock_Mode=0;
uchar Set_Mode=0;
uchar forbid_Tem=0;
uchar guang_wei=0;
uchar guang_wei2=0;
uchar nao_change_wei=0;
uint fengmingqi_jishi=0;
uchar time_view1=2;
uchar time_view2=0;
void delay_1ms(int delay); //毫秒延迟
void delay_1us(int delay_us); //微妙延迟
void delay(uint i); //18B20所用延迟
void Write_Dat_1602(uchar Dat_1602); //1602数据写入
void Write_Com_1602(uchar Com_1602); //1602命令写入
void ds1302_read_time(void); //1302读取温度
uchar ds1302_read_byte(uchar addr); //1302单字节读取
void ds1302_write_byte(uchar addr, uchar Dat); //1302单字节写入
void ds1302_write_time(void); //1302时间写入
void ds1302_read_time(void); //1302时间读取
void Init_1602(); //1602初始化
void Init_DS18B20(void); //18b20初始化
uchar ReadOneChar(void); //18b20单字节读
void WriteOneChar(unsigned char dat); //18b20单字节写
void ChangeTemperature(void);
uint ReadTemperature(void); //18b20读取温度
void Time_View(); //
void Temp_View(); //
void naozhong_View();
void tiaoshi_view();
void Init_1302()
{
DS_RES=0;
DS_CLK=0;
}
void main()
{fengmingqi=1;
warning_tem[0]=' ';
warning_tem[1]=3;
warning_tem[2]=0;
TMOD=0X11;
ET0=1;
ET1=1;
EA=1;
TH0=(65536-10000)/256; //10ms
TL0=(65536-10000)%256;
TH1=(65536-50000)/256; //50ms
TL1=(65536-50000)%256;
Init_1302();
Init_1602();
Time_View();
TR0=1;
TR1=1;
while(1)
{if(anjianzhi!=0)
{
///////////////////////////////
if(anjianzhi==8&&Set_Mode==0)
{if(Clock_Mode==0)
{Clock_Mode=1;
TR1=0;
guang_wei=0x09;
Write_Com_1602(0X01);
delay_1ms(5);
Write_Com_1602(0x0f);
nao_change_wei=1;
naozhong_View();
}
else
{TR1=1;
Write_Com_1602(0x0c);
Write_Com_1602(0X01);
delay_1ms(5);
Clock_Mode=0;
guang_wei=0x80;
guang_wei2=0;
}
}
/////////////////////////////////////////////////
if(anjianzhi==4)
{
if(Clock_Mode==1)
{
if(guang_wei2==0x0b)
{guang_wei=0x06;nao_change_wei=0;guang_wei2=0;}
if(nao_change_wei>3)
{nao_change_wei++;
guang_wei2++;
}
if(nao_change_wei==3)
{guang_wei2=0x09;
nao_change_wei++;
}
if(nao_change_wei<3)
{
guang_wei+=3;
nao_change_wei++;
}
naozhong_View();
}
else
{
switch(Set_Mode)
{case 0:TR1=0;Write_Com_1602(0X01);delay_1ms(5);Write_Com_1602(0x0f);guang_wei=0x83;Set_Mode++;break;
case 1:guang_wei=0x86;Set_Mode++;break;
case 2:guang_wei=0x89;Set_Mode++;break;
case 3:guang_wei=0x8b;Set_Mode++;break;
case 4:guang_wei=0x80+0x41;Set_Mode++;break;
case 5:guang_wei=0x80+0x44;Set_Mode++;break;
case 6:guang_wei=0x80+0x47;Set_Mode++;break;
case 7:TR1=1;Set_Mode=0;
Write_Com_1602(0x0c);
ds1302_write_time();
break;
}
tiaoshi_view();
}
}
//////////////////////////////////////////////////////////////
if(anjianzhi==2&&(Clock_Mode==1||Set_Mode!=0))
{
if(Clock_Mode==1)
{if(nao_change_wei==1)
{
if(taozhong_buf[0]*10+taozhong_buf[1]<23)
{ taozhong_buf[1]+=1;
if(taozhong_buf[1]==10&&taozhong_buf[0]<2)
{taozhong_buf[1]=0;taozhong_buf[0]+=1;}
}
}
if(nao_change_wei==2)
{ if(taozhong_buf[2]*10+taozhong_buf[3]<59)
taozhong_buf[3]+=1;
if(taozhong_buf[3]==10&&taozhong_buf[2]<6)
{taozhong_buf[3]=0;taozhong_buf[2]+=1;}
}
if(nao_change_wei==3)
{ if(taozhong_buf[4]*10+taozhong_buf[5]<59)
taozhong_buf[5]+=1;
if(taozhong_buf[5]==10&&taozhong_buf[4]<6)
{taozhong_buf[5]=0;taozhong_buf[4]+=1;}
}
if(nao_change_wei==4)
{
if(warning_tem[0]==' ')
warning_tem[0]='-';
else
warning_tem[0]=' ';
}
if(nao_change_wei==5)
{if(warning_tem[1]<10)
warning_tem[1]+=1;
}
if(nao_change_wei==6)
{if(warning_tem[2]<10)
warning_tem[2]+=1;
}
naozhong_View();
}
else
{
switch(Set_Mode)
{
case 1: {if(time_buf2[3]*10+time_buf2[4]<99)
time_buf2[4]+=1;
if(time_buf2[4]==10&&time_buf2[3]<9)
{time_buf2[4]=0;time_buf2[3]+=1;}
break;}
case 2:{if(time_buf2[5]*10+time_buf2[6]<12)
time_buf2[6]+=1;
if(time_buf2[6]==10&&time_buf2[5]<1)
{time_buf2[6]=0;time_buf2[5]+=1;}
break;}
case 3:{if(time_buf2[7]*10+time_buf2[8]<31)
time_buf2[8]+=1;
if(time_buf2[8]==10&&time_buf2[7]<3)
{time_buf2[8]=0;time_buf2[7]+=1;}
break;}
case 4:{if(time_buf2[18]<7)
time_buf2[18]+=1;
break;}
case 5:{if(time_buf2[12]*10+time_buf2[13]<23)
{ time_buf2[13]+=1;
if(time_buf2[13]==10&&time_buf2[12]<2)
{time_buf2[13]=0;time_buf2[12]+=1;}
}
break;
}
case 6:{if(time_buf2[14]*10+time_buf2[15]<59)
{ time_buf2[15]+=1;
if(time_buf2[15]==10&&time_buf2[14]<6)
{time_buf2[15]=0;time_buf2[14]+=1;}
}
break;
}
case 7:{if(time_buf2[17]*10+time_buf2[16]<59)
time_buf2[16]+=1;
if(time_buf2[17]==10&&time_buf2[16]<6)
{time_buf2[17]=0;time_buf2[16]+=1;}
break;
}
}
tiaoshi_view();
}
}
//////////////////////////////////////////////////////////////////
if(anjianzhi==1&&(Clock_Mode==1||Set_Mode!=0))
{if(Clock_Mode==1)
{switch(nao_change_wei)
{case 1:{if(taozhong_buf[1]>0)
taozhong_buf[1]=taozhong_buf[1]-1;
if(taozhong_buf[1]==9&&taozhong_buf[0]>0)
{taozhong_buf[1]-=1;}
break;
}
case 2:{if(taozhong_buf[3]>0)
taozhong_buf[3]=taozhong_buf[3]-1;
if(taozhong_buf[3]==9&&taozhong_buf[2]>0)
{taozhong_buf[3]-=1;}
break;
}
case 3:{if(taozhong_buf[5]>0)
taozhong_buf[5]=taozhong_buf[5]-1;
if(taozhong_buf[5]==9&&taozhong_buf[4]>0)
{taozhong_buf[5]-=1;}
break;
}
case 5:{if(warning_tem[1]>0)
warning_tem[1]-=1;
break;
}
case 6:{if(warning_tem[2]>0)
warning_tem[2]-=1;
break;
}
}
naozhong_View();
}
else
{
switch(Set_Mode)
{case 1:{if(time_buf2[4]>0)
time_buf2[4]-=1;
if(time_buf2[4]==0&&time_buf2[3]>0)
{time_buf2[4]=9;time_buf2[3]-=1;}
break;}
case 2:{if(time_buf2[6]>0)
time_buf2[6]-=1;
if(time_buf2[6]==0&&time_buf2[5]>0)
{time_buf2[6]=9;time_buf2[5]-=1;}
break;}
case 3:{if(time_buf2[8]>0)
time_buf2[8]-=1;
if(time_buf2[8]==0&&time_buf2[7]>0)
{time_buf2[8]=9;time_buf2[7]-=1;}
break; }
case 4:{if(time_buf2[18]>0)
time_buf2[18]-=1; }
case 5:{if(time_buf2[13]>0)
time_buf2[13]-=1;
if(time_buf2[13]==0&&time_buf2[12]>0)
{time_buf2[13]=9;time_buf2[12]-=1;}
break;}
case 6:{if(time_buf2[15]>0)
time_buf2[15]-=1;
if(time_buf2[15]==0&&time_buf2[14]>0)
{time_buf2[15]=9;time_buf2[14]-=1;}
break;}
case 7:{if(time_buf2[17]>0)
time_buf2[17]-=1;
if(time_buf2[17]==0&&time_buf2[16]>0)
{time_buf2[17]=9;time_buf2[16]-=1;}
break;}
}
tiaoshi_view();
}
}
anjianzhi=0;
}
}
}
void naozhong_View()
{uchar i;
Write_Com_1602(0x80);
Write_Dat_1602('C');
Write_Dat_1602('l');
Write_Dat_1602('o');
Write_Dat_1602('_');
Write_Dat_1602('S');
Write_Dat_1602('e');
Write_Dat_1602('t');
Write_Dat_1602(' ');
for(i=0;i<6;i++)
{Write_Dat_1602(taozhong_buf[i]+48);
if(i==1||i==3)
Write_Dat_1602(':');
}
Write_Com_1602(0x80+0x40);
Write_Dat_1602('T');
Write_Dat_1602('e');
Write_Dat_1602('m');
Write_Dat_1602('_');
Write_Dat_1602('S');
Write_Dat_1602('e');
Write_Dat_1602('t');
Write_Dat_1602(' ');
Write_Dat_1602(' ');
Write_Dat_1602(warning_tem[0]);
Write_Dat_1602(warning_tem[1]+48);
Write_Dat_1602(warning_tem[2]+48);
Write_Dat_1602('.');
Write_Dat_1602(warning_tem[3]+48);
Write_Dat_1602(0xdf);
Write_Dat_1602('C');
if(Clock_Mode==1)
{if(guang_wei2==0)
Write_Com_1602(0x80+guang_wei);
else
Write_Com_1602(0x80+0x40+guang_wei2);
}
}
void time0() interrupt 1
{uchar anjian=0;
TR0=0;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0)//有按键按下
{
delay_1ms(12);
if(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0)//有按键按下
{anjian=P1&0xf0;
switch(anjian)
{case 0xe0:anjianzhi=8;break; //闹钟键按下
case 0xd0:anjianzhi=4;break; //设置键按下
case 0xb0:anjianzhi=2;break; //上调移键按下
case 0x70:anjianzhi=1;break; //下调键按下
}
}
}
while(Key_Clock==0||Key_Set==0||Key_up==0||Key_down==0);
TR0=1;
}
void time1() interrupt 3
{uchar m,i;
TR1=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(time1_jishu1<3)
time1_jishu1++;
else
{time1_jishu1=0;
Time_View();
}
if(time_jishu2<13)
time_jishu2++;
else
{time_jishu2=0;
if(forbid_Tem==0)
{
if(DS18B20_Mode==0)
{
ChangeTemperature();
DS18B20_Mode=1;
}
else
{Temp_View();
DS18B20_Mode=0;
if(warning_tem[0]=='-'&&temp_buf[0]!='-')
{fengmingqi=0;fengmingqi_jishi=0;}
if((warning_tem[0]!='-'&&temp_buf[0]!='-')&&(warning_tem[1]*10+warning_tem[2]<=(temp_buf[1]-48)*10+(temp_buf[2]-48)))
{fengmingqi=0;fengmingqi_jishi=0;
}
if((warning_tem[0]=='-'&&temp_buf[0]=='-')&&(warning_tem[1]*10+warning_tem[2]>=(temp_buf[1]-48)*10+(temp_buf[2]-48)))
{fengmingqi=0;fengmingqi_jishi=0;}
} //温度报警
}
}
if( taozhong_buf[0]==time_buf2[12]&& //时间报警
taozhong_buf[1]==time_buf2[13]&&
taozhong_buf[2]==time_buf2[14]&&
taozhong_buf[3]==time_buf2[15]&&
taozhong_buf[4]==time_buf2[16]&&
taozhong_buf[5]==time_buf2[17])
{fengmingqi=0;
fengmingqi_jishi=0;
}
fengmingqi_jishi++;
if(fengmingqi==0&&fengmingqi_jishi>=200)
{fengmingqi=1;
fengmingqi_jishi=0;
}
TR1=1;
}
void tiaoshi_view()
{uchar i;
Write_Com_1602(0x80);
switch(time_buf2[18])
{case 1:time_buf2[9]='M'-48;time_buf2[10]='O'-48;time_buf2[11]='N'-48;break;
case 2:time_buf2[9]='T'-48;time_buf2[10]='U'-48;time_buf2[11]='E'-48;break;
case 3:time_buf2[9]='W'-48;time_buf2[10]='E'-48;time_buf2[11]='D'-48;break;
case 4:time_buf2[9]='T'-48;time_buf2[10]='H'-48;time_buf2[11]='U'-48;break;
case 5:time_buf2[9]='F'-48;time_buf2[10]='R'-48;time_buf2[11]='I'-48;break;
case 6:time_buf2[9]='S'-48;time_buf2[10]='A'-48;time_buf2[11]='T'-48;break;
case 7:time_buf2[9]='S'-48;time_buf2[10]='U'-48;time_buf2[11]='N'-48;break;
}
for(i=1;i<18;i++)
{ Write_Dat_1602(time_buf2[i]+48);
if(i==4|i==6)
Write_Dat_1602('-');
if(i==8)
Write_Dat_1602(' ');
if(i==11)
{
Write_Com_1602(0x80+0x40);
}
if(i==13||i==15)
Write_Dat_1602(':');
}
Write_Dat_1602(' ');
Write_Dat_1602('T');
Write_Dat_1602('i');
Write_Dat_1602('m');
Write_Dat_1602('_');
Write_Dat_1602('S');
Write_Dat_1602('e');
Write_Dat_1602('t');
if(Set_Mode>0)
Write_Com_1602(guang_wei);
}
void Time_View()
{ uchar i;
ds1302_read_time();
Write_Com_1602(0x80);
for(i=1;i<18;i++)
{ Write_Dat_1602(time_buf2[i]+48);
if(i==4|i==6)
Write_Dat_1602('-');
if(i==8)
Write_Dat_1602(' ');
if(i==11)
{
Write_Com_1602(0x80+0x40);
}
if(i==13||i==15)
Write_Dat_1602(':');
}
if(Set_Mode>0)
Write_Com_1602(guang_wei);
}
void Temp_View()
{uint t;
uchar i;
t=ReadTemperature();
temp_buf[5]=0xdf;
temp_buf[6]='C';
temp_buf[3]='.';
Write_Com_1602(0x80+0x49);
if(t&0x8000)
{temp_buf[0]='-';t=~t;t+=1;}
else
temp_buf[0]=' ';
if(t&0x0001)
temp_buf[4]='5';
else
temp_buf[4]='0';
t=t>>4;
temp_buf[1]=t/10+48;
temp_buf[2]=t%10+48;
for(i=0;i<7;i++)
Write_Dat_1602(temp_buf[i]);
}
////////////////////////////DS1302驱动///////////////////////////
uchar ds1302_read_byte(uchar addr)
{ uchar i;
uchar temp;
DS_RES=1; /*启动DS1302总线*/
addr=addr|0x01; /*最低位置高*/
/*写入目标地址:addr*/
for (i=0;i<8;i++)
{
if (addr&0x01)
DS_IO=1;
else
DS_IO=0;
DS_CLK=1;
DS_CLK=0;
addr=addr>>1;
}
/*输出数据:temp*/
for(i=0;i<8;i++)
{
temp=temp>>1;
if(DS_IO)
temp|=0x80;
else
temp&=0x7F;
DS_CLK=1;
DS_CLK=0;
}
DS_RES=0; /*停止DS1302总线*/
return temp;
}
void ds1302_write_byte(uchar addr, uchar Dat)
{
uchar i;
DS_RES=1; /*启动DS1302总线*/
/*写入目标地址:addr*/
addr=addr&0xFE; /*最低位置零*/
for(i=0;i<8;i++)
{
if(addr&0x01)
DS_IO=1;
else
DS_IO=0;
DS_CLK=1;
DS_CLK=0;
addr=addr>>1;
}
/*写入数据:Dat*/
for (i=0;i<8;i++)
{
if (Dat&0x01)
DS_IO=1;
else
DS_IO=0;
DS_CLK=1;
DS_CLK=0;
Dat=Dat>>1;
}
DS_RES=0; /*停止DS1302总线*/
}
void ds1302_write_time(void)
{
unsigned char i,tmp;
time_buf1[1]=time_buf2[3]*10;
time_buf1[1]+=time_buf2[4];
time_buf1[2]=time_buf2[5]*10;
time_buf1[2]+=time_buf2[6];
time_buf1[3]=time_buf2[7]*10;
time_buf1[3]+=time_buf2[8];
time_buf1[4]=time_buf2[12]*10;
time_buf1[4]+=time_buf2[13];
time_buf1[5]=time_buf2[14]*10;
time_buf1[5]+=time_buf2[15];
time_buf1[6]=time_buf2[16]*10;
time_buf1[6]+=time_buf2[17];
time_buf1[7]=time_buf2[18];
for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp*16;
}
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
}
void ds1302_read_time(void)
{
uchar i,tmp;
time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp*10;
}
time_buf2[1]=time_view1;
time_buf2[2]=time_view2;
time_buf2[3]=(time_buf1[1]%100)/10;
time_buf2[4]=time_buf1[1]%10;
time_buf2[5]=(time_buf1[2]%100)/10;
time_buf2[6]=time_buf1[2]%10;
time_buf2[7]=(time_buf1[3]%100)/10;
time_buf2[8]=time_buf1[3]%10;
switch(time_buf1[7])
{case 1:time_buf2[9]='M'-48;time_buf2[10]='O'-48;time_buf2[11]='N'-48;break;
case 2:time_buf2[9]='T'-48;time_buf2[10]='U'-48;time_buf2[11]='E'-48;break;
case 3:time_buf2[9]='W'-48;time_buf2[10]='E'-48;time_buf2[11]='D'-48;break;
case 4:time_buf2[9]='T'-48;time_buf2[10]='H'-48;time_buf2[11]='U'-48;break;
case 5:time_buf2[9]='F'-48;time_buf2[10]='R'-48;time_buf2[11]='I'-48;break;
case 6:time_buf2[9]='S'-48;time_buf2[10]='A'-48;time_buf2[11]='T'-48;break;
case 7:time_buf2[9]='S'-48;time_buf2[10]='U'-48;time_buf2[11]='N'-48;break;
}
time_buf2[18]=time_buf1[7];
time_buf2[12]=(time_buf1[4]%100)/10;
time_buf2[13]=time_buf1[4]%10;
time_buf2[14]=(time_buf1[5]%100)/10;
time_buf2[15]=time_buf1[5]%10;
time_buf2[16]=(time_buf1[6]%100)/10;
time_buf2[17]=time_buf1[6]%10;
}
/////////////////////////LCD1602驱动//////////////////////
void Write_Com_1602(uchar Com_1602)
{LCD_RS=0;
LCD_RW=0;
LCD_E=0;
delay_1us(3);
LCD_E=1;
P0=Com_1602;
delay_1us(3);
LCD_E=0;
}
void Write_Dat_1602(uchar Dat_1602)
{LCD_RS=1;
LCD_RW=0;
LCD_E=0;
delay_1us(3);
LCD_E=1;
P0=Dat_1602;
delay_1us(3);
LCD_E=0;
}
void Init_1602()
{
Write_Com_1602(0X38);
delay_1ms(5);
Write_Com_1602(0X08);
delay_1ms(5);
Write_Com_1602(0X01);
Write_Com_1602(0X06);
delay_1ms(5);
Write_Com_1602(0X0C);
}
//////////////////////18B20驱动/////////////////////
void Init_DS18B20(void)
{
unsigned char x=0;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于51单片机万年历DIY制作.zip
(819.6 KB, 下载次数: 25)
2020-11-13 21:23 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1