单片机时钟制作主程序.docx
《单片机时钟制作主程序.docx》由会员分享,可在线阅读,更多相关《单片机时钟制作主程序.docx(16页珍藏版)》请在冰豆网上搜索。
![单片机时钟制作主程序.docx](https://file1.bdocx.com/fileroot1/2022-11/25/d4e5079b-bb15-40a4-ac7c-172de7c98260/d4e5079b-bb15-40a4-ac7c-172de7c982601.gif)
单片机时钟制作主程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcd_rs=P3^5;
sbitlcd_e=P3^6;
sbitlcd_bla=P3^7;
sbitfm=P2^5;
sbitds_ds=P3^1;
sbitds_rw=P3^2;
sbitds_as=P3^0;
sbitds_cs=P3^4;
sbitio=P2^4;
sbits1=P2^3;
sbits2=P2^2;
sbits3=P2^1;
sbits4=P2^0;
sbitinti1=P3^3;
ucharsec,alm_sec,min,alm_min,hors,alm_hors,day,date,mon,year,tg,ts,tb,tx,a;
uintt;
ucharflag,s4flag,s2flag,s2flag2;
bitb;
/**************报警30秒******************/
voidfm_bibi()
{
ucharii=25;
while(ii--)
{
fm=0;
delay_ms(60);
fm=1;
delay_ms(50);
fm=0;
delay_ms(150);
fm=1;
delay_ms(700);
if((s4==0)||(s3==0)||(s2==0)||(s1==0))
ii=0;
}
}
/***********第一次上电时初始化时间******************
voidset_sdtime()
{
ds_write_date(0,40);//秒
ds_write_date(1,0);//秒闹铃
ds_write_date(2,11);//分
ds_write_date(3,0);//分闹铃
ds_write_date(4,07);//小时
ds_write_date(5,0);//小时闹铃
ds_write_date(6,5);//星期
ds_write_date(7,27);//日
ds_write_date(8,4);//月
ds_write_date(9,12);//年
}*/
voidxianshi_t()
{
if(flag==0)
{
if((t<1000)&&(t>=100))
{
lcdwrite_com(0x80+0x40+10);
lcdwrite_dat(table4[t/100]);//温度十位
lcdwrite_dat(table4[t%100/10]);//温度个位
lcdwrite_dat(0x2e);//小数点
lcdwrite_dat(table4[t%10]);//温度小数点后一位
lcdwrite_dat(0xdf);//°C符号
lcdwrite_dat(0x43);
}
if((t<100)&&(t>=0))
{
lcdwrite_com(0x80+0x40+11);
lcdwrite_dat(table4[t/10]);//温度个位
lcdwrite_dat(0x2e);//小数点
lcdwrite_dat(table4[t%10]);//温度小数点后一位
lcdwrite_dat(0xdf);//°C符?
lcdwrite_dat(0x43);
}
}
else
{
if((t<1000)&&(t>=100))
{
lcdwrite_com(0x80+0x40+9);
lcdwrite_dat(0x2d);//负号
lcdwrite_dat(table4[t/100]);//温度十位
lcdwrite_dat(table4[t%100/10]);//温度个位
lcdwrite_dat(0x2e);//小数点
lcdwrite_dat(table4[t%10]);//温度小数点后一位
lcdwrite_dat(0xdf);//°C符号
lcdwrite_dat(0x43);
}
if((t<100)&&(t>=0))//负十度到零度
{
lcdwrite_com(0x80+0x40+10);
lcdwrite_dat(0x2d);//负号
lcdwrite_dat(table4[t/10]);//温度个位
lcdwrite_dat(0x2e);//小数点
lcdwrite_dat(table4[t%10]);//温度小数点后一位
lcdwrite_dat(0xdf);//°C符号
lcdwrite_dat(0x43);
}
}
}
/***************键盘扫描*******************/
voidkey()
{
if(s4==0)
{
lcd_bla=1;//开背光
delay_ms(5);
if(s4==0)
{
flag=1;
while(!
s4);
s4flag++;
}
}
if(s4flag==1)
{
if(s2flag==0)
{
lcdwrite_com(0x0f);//显示光标
lcdwrite_com(0x80+5);
if(s3==0)//调年
{
delay_ms(5);
if(s3==0)
while(!
s3);
year++;
if(year==21)
year=10;
write_lcdnyr(4,year);
}
}
if(s2==0)
{
delay_ms(5);
if(s2==0)
{
while(!
s2);
s2flag++;
if(s2flag==7)
s2flag=0;
}
}
if(s2flag==1)//调月
{
lcdwrite_com(0x80+8);
if(s3==0)
{
delay_ms(5);
if(s3==0)
while(!
s3);
mon++;
if(mon==13)
mon=1;
write_lcdnyr(7,mon);
}
}
elseif(s2flag==2)//调日
{
lcdwrite_com(0x80+11);
if(s3==0)
{
delay_ms(5);
if(s3==0)
while(!
s3);
date++;
if(date==32)
date=1;
write_lcdnyr(10,date);
}
elseif(s2flag==3)//调星期
{
lcdwrite_com(0x80+13);
if(s3==0)
{
delay_ms(5);
if(s3==0)
while(!
s3);
day++;
if(day==8)
day=1;
write_lcdday(13,day);
}
}
elseif(s2flag==4)//调时
{
lcdwrite_com(0x80+0x40+1);
if(s3==0)
{
delay_ms(5);
if(s3==0)
while(!
s3);
hors++;
if(hors==24)
hors=0;
write_lcdsfm(0,hors);
}
}
elseif(s2flag==5)//调分
{
lcdwrite_com(0x80+0x40+4);
if(s3==0)
{
delay_ms(5);
if(s3==0)
while(!
s3);
min++;
if(min==60)
min=0;
write_lcdsfm(3,min);
}
}
elseif(s2flag==6)//调秒
{
lcdwrite_com(0x80+0x40+7);
if(s3==0)
{
delay_ms(5);
if(s3==0)
/************读取18b20寄存器中的温度数据****************************/
intred18b02t()
{
floattt;
uchart1,t2,f;
init18b20();//初始化
delay_ms
(2);
write_18byte(0xcc);//跳过读ROM指令
write_18byte(0x44);//启动温度转换
init18b20();//初始化
delay_ms
(2);
write_18byte(0xcc);//跳过读ROM指令
write_18byte(0xbe);//读取温度寄存器,共九个前两个就是
t1=red_18byte();
t2=red_18byte();
//t1=0x90;//测试使用
//t2=0xfc;
f=t2;
f>>=3;
if(f==0x1f)
{
flag=1;
t=t2;
t<<=8;
t=t|t1;
t=~t+1;
tt=t*0.0625;
t=tt*10+0.5;
}
else
{
flag=0;
t=t2;
t<<=8;
t=t|t1;
tt=t*0.0625;
t=tt*10+0.5;
}
returnt;
}
/********************************************/
while(!
s3);
sec++;
if(sec==60)
sec=0;
write_lcdsfm(6,sec);
}
}
}
elseif(s4flag==2)
{
if(a==0)
{
read_alm();
lcdwrite_com(0x01);
lcdwrite_com(0x0c);
lcdwrite_com(0x80+2);
write_lcdsfm(-0x40+2,alm_hors);
lcdwrite_dat(0x3a);
write_lcdsfm(-0x40+5,alm_min);
lcdwrite_dat(0x3a);
write_lcdsfm(-0x40+8,alm_sec);
if(ds_read_date(0xb)<0x20)
{
lcdwrite_dat(0x20);//以下四行显示OFF.
lcdwrite_dat(0x4f);
lcdwrite_dat(0x46);
lcdwrite_dat(0x46);
}
else
{
lcdwrite_dat(0x20);
lcdwrite_dat(0x4f);//以下三行显示ON.
lcdwrite_dat(0x4e);
lcdwrite_dat(0x20);
}
a=1;
}
if(s2==0)
{
delay_ms(5);
if(s2==0)
{
while(!
s2);
s2flag2++;
if(s2flag2==5)
s2flag2=1;
}
}
if(s2flag2==1)
{
lcdwrite_com(0x0f);//显示光标
lcdwrite_com(0x80+14);
if(s3==0)//调定时开关
{
delay_ms(5);
if(s3==0)
while(!
s3);
b=~b;
if(b==1)//b=1时显示ON.
{
lcdwrite_com(0x80+11);
lcdwrite_dat(0x4f);//以下三行显示ON.
lcdwrite_dat(0x4e);
lcdwrite_dat(0x20);
}
else//b=0时显示OFF.
{
lcdwrite_com(0x80+11);
lcdwrite_dat(0x4f);//以下三行显示OFF.
lcdwrite_dat(0x46);
lcdwrite_dat(0x46);
}
}
}
elseif(s2flag2==2)
{
lcdwrite_com(0x80+9);
if(s3==0)//调定时秒
{
delay_ms(5);
if(s3==0)
while(!
s3);
alm_sec++;
if(alm_sec==60)
alm_sec=0;
write_almlcdsfm(8,alm_sec);
lcdwrite_com(0x80+8);
}
}
elseif(s2flag2==3)
{
lcdwrite_com(0x80+6);
if(s3==0)//调定时分
{
delay_ms(5);
if(s3==0)
while(!
s3);
alm_min++;
if(alm_min==60)
alm_min=0;
write_almlcdsfm(5,alm_min);
lcdwrite_com(0x80+5);
}
}
elseif(s2flag2==4)
{
lcdwrite_com(0x80+3);
if(s3==0)//调定时时
{
delay_ms(5);
if(s3==0)
while(!
s3);
alm_hors++;
if(alm_hors==24)
alm_hors=0;
write_almlcdsfm(2,alm_hors);
lcdwrite_com(0x80+2);
}
}
}
elseif(s4flag==3)
{
a=0;
flag=0;
s4flag=0;
s2flag2=0;
s2flag=0;
lcdwrite_com(0x0c);//关闭光标
lcd_bla=0;//关背光
ds_write_date(0,sec);//秒
ds_write_date(1,alm_sec);//秒闹铃
ds_write_date(2,min);//分
ds_write_date(3,alm_min);//分闹铃
ds_write_date(4,hors);//小时
ds_write_date(5,alm_hors);//小时闹铃
ds_write_date(6,day);//星期
ds_write_date(7,date);//日
ds_write_date(8,mon);//月
ds_write_date(9,year);//年
if(b==1)//b=1时,开定时中断,否则关定时中断。
ds_write_date(0x0b,0x26);
else
ds_write_date(0x0b,0x06);
}
}
/************开外部中断1******************/
voidint_1()
{
EX1=1;
IT1=0;
EA=1;
}
/**************外部中断1函数******************/
voidinit()interrupt2
{
uchara;
a=ds_read_date(0x0c);//读寄存器C,清除告警
fm_bibi();//蜂鸣器响
}
/******************主函数******************/
voidmain()
{
int_1();
dsinit();//第一次上电时初始化ds12cr887
lcdinit();
lcd_bla=0;
while
(1)
{
key();
if(flag==0)
{
read_dstime();//读ds12cr887时间
write_lcdnyr(2,20);//实时写入20
write_lcdnyr(4,year);//实时写入年
lcdwrite_dat(0x2d);//写入—
write_lcdnyr(7,mon);//实时写入月
lcdwrite_dat(0x2d);//写入—
write_lcdnyr(10,date);//实时写入日
lcdwrite_dat(0x20);//写入空格
write_lcdday(13,day);//实时写入星期
lcdwrite_dat(0x20);//写入空格
write_lcdsfm(0,hors);//实时写入时
lcdwrite_dat(0x3a);//写入冒号
write_lcdsfm(3,min);//实时写入分
lcdwrite_dat(0x3a);//写入冒号
write_lcdsfm(6,sec);//实时写入秒
if((sec%10)==0)//隔10秒读一次温度
{
red18b02t();
xianshi_t();//显示温度
}
if((s3==0)||(s2==0)||(s1==0))//按下s3或s2或s1时开背光
lcd_bla=1;
if((sec%10)==0)//10秒钟后关背光
lcd_bla=0;
}
}
}