基于单片机的智能数字闹钟程序代码_第1页
基于单片机的智能数字闹钟程序代码_第2页
基于单片机的智能数字闹钟程序代码_第3页
基于单片机的智能数字闹钟程序代码_第4页
基于单片机的智能数字闹钟程序代码_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计--基于单片机的智能数字闹钟程序代码程序代码

main.c#include<reg51.h>

#include<intrins.h>

#include<yf.h>

unsignedcharclock_data[4];sbitspeaker

=P2^4;//

蜂鸣器

sbitbell=P2^2;

//铃响

bitbell_on=0;

bitkey_ok=0;

unsignedcharbell_time=0x20;

ucharweek_clock_set;

#defineFIRST_ADDR0//定义全局变量

unsignedcharyy,mo,dd,xq,hh,mm,ss;//

定义时间映射全局变量(专用寄存器)

ucharj;/****************************************************************************/

//函数声明

extern

unsignedcharread_clock(unsignedcharord);

externvoidlcdwc(unsignedcharcmdcode);

externvoidhzkdis(unsignedcharcode*s);

externvoidhzkdis2(unsignedchar*s);

externcharRead_One_Byte(unsignedcharaddr);

externvoidWrite_One_Byte(unsignedcharaddr,unsignedcharthedata);

voidlcm_w_ss(void);

externvoidlcdreset(void);

externvoidInit_DS18B20(void);

externchargotkey();

externvoidInit_1302(void);

externunsignedintReadTemperature(void);externvoidwrite_clock(unsignedcharord,unsignedchardd);

externvoiddisp_hz(ucharx,uchar*c_str,ucharw);

externvoiddelay(unsignedintt);

voidnew_time(void);

voidread_clockss(x);

//voidlcm_w_temp(void);voidread_clockS(void)

{

ss=read_clock(0x81);//读取秒数据

mm=read_clock(0x83);//读取分钟数据

hh=read_clock(0x85);//小时

dd=read_clock(0x87);//日

mo=read_clock(0x89);//月

xq=read_clock(0x8b);//星期

yy=read_clock(0x8d);//年

}/*voidSet_time(unsignedcharsel){//根据选择调整的相应项目加1并写入DS1302

signedcharaddress,item;

signedcharmax,mini;

if(sel==7)

{address=0x80;max=0;mini=0;}

//秒

if(sel==6)

{address=0x82;max=59;mini=0;}

//分钟

if(sel==5)

{address=0x84;max=23;mini=0;}

//小时

if(sel==3)

{address=0x86;max=31;mini=1;}

//日

if(sel==2)

{address=0x88;max=12;mini=1;}

//月

if(sel==1)

{address=0x8c;max=99;mini=0;}

//年

if(sel==4)

{address=0x8a;max=7;mini=1;}

//星期

//读取1302某地址上的数值转换成10进制赋给item

item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16;

if(KEY_Y==0){

item++;//数加1

}

if(KEY_N==0){

item--;//数减1

}

if(item>max)item=mini;//查看数值有效范围

if(item<mini)item=max;

write_clock(0x8e,0x00);//允许写操作

write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302

write_clock(0x8e,0x80);//写保护,禁止写操作

//updata();

//刷新数据

//lcm_w_mm();//刷新分

}

*/

voidDelayM(unsignedinta){//延时函数1MS/次

unsignedchari;

while(--a!=0){

for(i=0;i<125;i++);

//一个;表示空语句,CPU空转。

}

//i从0加到125,CPU大概就耗时1毫秒

}

/*****************************************************************************/

//向LCM中填写年数据

voidlcm_w_yy(void)

{

//

if(read_clock(0x8d)!=yy)

{

unsignedcharstr[2];

str[2]=0;

yy=read_clock(0x8d);

lcdwc(0x83+FIRST_ADDR);

hzkdis("20");

lcdwc(0x84+FIRST_ADDR);

str[0]=(yy/16+0x30);

str[1]=(yy%16+0x30);

hzkdis2(str);

hzkdis2("年");

}

/*****************************************************************************/

//向LCM中填写月数据

voidlcm_w_mo(void){

//

if(read_clock(0x89)!=mo){

unsignedcharstr[2];

str[2]=0;

//

lcm_w_test(0,0x90);

lcdwc(0x90+FIRST_ADDR);

if(mo/16!=0){

str[0]=mo/16+0x30;

}

//十位消隐

else{str[0]=0x20;}//同上

str[1]=mo%16+0x30;

hzkdis2(str);

lcdwc(0x91+FIRST_ADDR);

hzkdis("月");

}

/*****************************************************************************/

//星期处理并送入LCM的指定区域

voidlcm_w_xq(void){

unsignedcharsel;

unsignedcharstr[2];

str[2]=0;

//if(read_clock(0x8b)!=xq){

//xq=read_clock(0x8b);

sel=(read_clock(0x8b))%16;//字节低4位的BCD码放入sel

lcdwc(0x97+FIRST_ADDR);//写入指定区域(97H第二行第8个字)

if(sel==7)

{hzkdis("日");}

//

if(sel==6)

{hzkdis("六");}

//

if(sel==5)

{hzkdis("五");}

//

if(sel==4)

{hzkdis("四");}

//

if(sel==3)

{str[0]=0xc8;str[1]=0xfd;hzkdis2(str)/*lcm_w_test(1,0xc8);lcm_w_test(1,0xfd)*/;}//此指令等于lcm_w_word("三");因为“三”的内码失效。

if(sel==2)

{hzkdis("二");}

//

if(sel==1)

{hzkdis("一");}

//星期一

lcdwc(0x95+FIRST_ADDR);

hzkdis("星期");

//}

}

/*****************************************************************************/

//向LCM中填写日数据

voidlcm_w_dd(void){

unsignedcharstr[2]

;

str[2]=0;

//

if(read_clock(0x87)!=dd){

dd=read_clock(0x87);

lcdwc(0x92+FIRST_ADDR);

if(dd/16!=0){str[0]=(dd/16)+0x30;}

//十位消隐

else{str[0]=0x20;}//同上

str[1]=dd%16+0x30;

hzkdis2(str);

lcdwc(0x93+FIRST_ADDR);

hzkdis("日");

}

//}

/*****************************************************************************/

//向LCM中填写小时数据

voidlcm_w_hh(void){

unsignedcharstr[2];

str[2]=0;

if(read_clock(0x85)!=hh){

//hh=read_clock(0x85);

if(hh>0x07&&hh<0x22/*&&w==0*/){

//

beep=0;led_r=0;

DelayM(100);

//

beep=1;led_r=1;

}

}

lcdwc(0x88+FIRST_ADDR);

str[0]=hh/16+0x30;

str[1]=hh%16+0x30;

hzkdis2(str);

}

//}

/*****************************************************************************/

//向LCM中填写分钟数据

voidlcm_w_mm(void){

unsignedchar

str[2];

str[2]=0;

if(read_clock(0x83)!=mm){

mm=read_clock(0x83);

/*if(w==0){

days();

//节日显示

updata();

//刷新数据

}*/

}

/*

lcm_w_test(0,0x89);

lcm_w_test(1,0x3a);

//":"

lcm_w_test(1,(mm/16)+0x30);

lcm_w_test(1,mm%16+0x30);

lcm_w_test(1,0x2e);

//"."*/

lcdwc(0x89+FIRST_ADDR);

hzkdis(":");

str[0]=(mm/16)+0x30;

str[1]=

mm%16+0x30;

hzkdis2(str);

hzkdis(":");

}

/*****************************************************************************/

//向LCM中填写秒数据

voidlcm_w_ss(void)

{

unsignedcharstr[2];

str[2]=0;

//

if(read_clock(0x81)!=ss)

//判断是否需要更新

/*ss=read_clock(0x81);

//更新数据

lcm_w_test(0,0x8b);

//秒值在LCM上的写入位置

lcm_w_test(1,(ss/16)+0x30);

//写十位

lcm_w_test(1,ss%16+0x30);

//写个位

led_b=~led_b;

//背光闪烁

lcm_w_mm();//刷新分

*/

//lcm_w_mm();

ss=read_clock(0x81);

lcdwc(0x8b+FIRST_ADDR);

str[0]=ss/16+0x30;

str[1]=ss%16+0x30;

hzkdis2(str);

}lcm_w_temp(void)

{

//unsignedchar

str1[4];

ucharstr[2];

unsignedinti=0;

unsignedchara=0,b=0,c=0;

uchartemp=28;

i=ReadTemperature();//读温度并送显

/*

a=i/100;

str1[3]=a+0x30;

str1[2]=0x2e;

str1[1]=(i/10-a*10)+0x30;

str1[0]=(i-a*100-b*10)+0x30;

//lcm_w_test(1,c+0x30);//小位1位

//lcm_w_word("℃");

//度C//

str1[0]=(i/100)%10+0x30;

//

str1[1]=((i%100)/10)+0x30;

//

str1[2]=(i%10)+0x30;*/

str[0]=temp/10+0x30;

str[1]=temp%10+0x30;

lcdwc(0x8e+FIRST_ADDR);

hzkdis2(str);

lcdwc(0x8f+FIRST_ADDR);

hzkdis("℃");

}

/*****************************************************************************/

//刷新数据

voidupdata(void)

{

lcm_w_hh();//刷新小时

lcm_w_dd();//刷新日

lcm_w_xq();//更新星期值

lcm_w_mo();//刷新月

lcm_w_yy();//刷新年

lcm_w_mm();

lcm_w_ss();

lcm_w_temp();

}

//初始化界面

voidrestlib()

{

lcdwc(0x80+FIRST_ADDR);

hzkdis("校园打铃系统");

lcdwc(0x90+FIRST_ADDR);

hzkdis("初始化...");

lcdwc(0x88+FIRST_ADDR);

hzkdis("姚辉虎");

lcdwc(0x98+FIRST_ADDR);

hzkdis("");

}

/*void

rj1lib()

{

unsignedcharstr[2];

lcdwc(0x80+FIRST_ADDR);

str[0]=yy/10+0x30;

str[1]=yy%10+0x30;

hzkdis("20");

hzkdis2(str);

hzkdis("年");

lcdwc(0x90+FIRST_ADDR);

if(mo/16!=0){

str[0]=mo/16+0x30;

}

//十位消隐

else{str[0]=0x20;}//同上

str[1]=mo%16+0x30;

hzkdis2(str);

lcdwc(0x91+FIRST_ADDR);

hzkdis("月");

lcdwc(0x92+FIRST_ADDR);

if(dd/16!=0){str[0]=(dd/16)+0x30;}

//十位消隐

else{str[0]=0x20;}//同上

str[1]=dd%16+0x30;

hzkdis2(str);

lcdwc(0x93+FIRST_ADDR);

hzkdis("日");

lcdwc(0x88+FIRST_ADDR);

str[0]=hh/16+0x30;

str[1]=hh%16+0x30;

hzkdis2(str);

lcdwc(0x89+FIRST_ADDR);

hzkdis(":");

str[0]=(mm/16)+0x30;

str[1]=

mm%16+0x30;

hzkdis2(str);

lcdwc(0x81+FIRST_ADDR);

}

/*------------------------------------------------

------------------------------------------------*/

/*

//不同按键实现不同功能

voidgongneng(intgotkeys)

{

intgn,gn10,gn0;

gn=gotkeys;

switch(gn)

{

case0:

DelayM(2000);gn0=gotkey();if(gn0==0){

lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000);cxjmlib();}break;

//长按系统初始化;

case10:lcdreset();

lcdwc(0x80+FIRST_ADDR);hzkdis("1.设置时间");

lcdwc(0x90+FIRST_ADDR);hzkdis("2.设置闹时");

lcdwc(0x88+FIRST_ADDR);hzkdis("3.系统初始化");

lcdwc(0x79+FIRST_ADDR);hzkdis("");

tt:gn10=gotkey();

//

if(gn10!=16)gotott;

tt1:gn10=gotkey();

//

if(gn10==16)gotott;

switch(gn10)

{

case1:

{

lcdreset();

read_clockS();

rj1lib();

tt2:

gn10=gotkey();

if(gn10!=16)gotott2;

tt3:

gn10=gotkey();

if(gn10==16)gotott2;

switch(gn10)

{

case0:

break;

case1:

break;

case2:

break;

case3:

break;

case4:

break;

case5:

break;

case6:

break;

case7:

break;

case8:

break;

case9:

break;

default:gotott3;

}

break;

}

case2:

lcdreset();read_clockS();naozhonglib();

tt4:

gn10=gotkey();

if(gn10!=16)gotott4;

gn10=gotkey();

if(gn10==16)gotott4;

break;

case3:

lcdreset();rj3lib();

tt6:

gn10=gotkey();

if(gn10!=16)gotott6;

gn10=gotkey();

if(gn10==16)gotott6;

if(gn10==10)

//键值为10就初始化系统

{

lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000);cxjmlib();

}

if(gn10==11)

//键值为11取消初始化,返回程序主界面;

{

lcdreset();cxjmlib();

}

break;

tt8:

gn10=gotkey();

if(gn10!=16)gotott8;

gn10=gotkey();

if(gn10==16)gotott8

;

break;

}

default:gotott1;

}

}

*/

voidread_clockss(x)

{

hh=Read_One_Byte(x*4+0x20);

mm=Read_One_Byte(x*4+0x21);

ss=Read_One_Byte(x*4+0x22);

week_clock_set=Read_One_Byte(x*4+0x23);

}

voidWrite_clockss(x)

{

Write_One_Byte(x*4+0x20,hh);

Write_One_Byte(x*4+0x21,mm);

Write_One_Byte(x*4+0x22,ss);

Write_One_Byte(x*4+0x23,week_clock_set);

}

/*bitcmp_clock()

//每分钟检测一次

{

unsignedchara1;

for(a1=0;a1<32;a1++)

{

read_clockss(a1);

//acc0=a1*4+0x20

...acc1...acc2...acc3

if((hh==clock_data[0])&&(mm==clock_data[1]))

{return1;}

}

return0;

}*///unsignedcharyy,mo,dd,xq,hh,mm,ss;//

定义时间映射全局变量(专用寄存器)

voidclr_xs()

{

lcdwc(0x80+FIRST_ADDR);hzkdis("");

lcdwc(0x90+FIRST_ADDR);hzkdis("");

lcdwc(0x88+FIRST_ADDR);hzkdis("");

lcdwc(0x98+FIRST_ADDR);hzkdis("");

}

voiddisp_set_clock()

{

unsignedcharsel;

ucharstr[2];

str[2]=0;

lcdwc(0x91+FIRST_ADDR);

str[0]=yy/16+0x30;

str[1]=yy%16+0x30;

hzkdis2(str);

hzkdis2("年");

str[0]=mo/16+0x30;

str[1]=mo%16+0x30;

hzkdis2(str);

hzkdis2("月");

str[0]=dd/16+0x30;

str[1]=dd%16+0x30;

hzkdis2(str);

hzkdis2("日");

lcdwc(0x89+FIRST_ADDR);

str[0]=hh/16+0x30;

str[1]=hh%16+0x30;

hzkdis2(str);

hzkdis2("时");

str[0]=mm/16+0x30;

str[1]=mm%16+0x30;

hzkdis2(str);

hzkdis2("分");

str[0]=ss/16+0x30;

str[1]=ss%16+0x30;

hzkdis2(str);

hzkdis2("秒");

//

lcdwc(0x98+FIRST_ADDR);

sel=(read_clock(0x8b))%16;//字节低4位的BCD码放入sel

lcdwc(0x9c+FIRST_ADDR);//写入指定区域(97H第二行第8个字)

if(sel==7)

{hzkdis("07");}

//

if(sel==6)

{hzkdis("06");}

//

if(sel==5)

{hzkdis("05");}

//

if(sel==4)

{hzkdis("04");}

//

if(sel==3)

{hzkdis("03");}

//

if(sel==2)

{hzkdis("02");}

//

if(sel==1)

{hzkdis("01");}

//星期一

lcdwc(0x9a+FIRST_ADDR);

hzkdis("星期");

}voiddisp_clock_set()

{

ucharstr[2];

str[2]=0;

lcdwc(0x89+FIRST_ADDR);

str[0]=hh/16+0x30;

str[1]=hh%16+0x30;

hzkdis2(str);

hzkdis2("时");

str[0]=mm/16+0x30;

str[1]=mm%16+0x30;

hzkdis2(str);

hzkdis2("分");

/*

str[0]=ss/16+0x30;

str[1]=ss%16+0x30;

hzkdis2(str);

hzkdis2("秒");

*/

//

week_clock_set

//

lcdwc(0x98+FIRST_ADDR);

//

hzkdis2("");

}/*bitset_xs_1_flicker(ucharx,bity)

//修改数据标志

{

uchara,str[2];

str[1]=0x1e;

bitflicker=0;

key_ok=1;

while(gotkey()!=16){}

xs_fl0:

while(1)

{

for

(a=0;a<20;a++)

//

{

delay(500);

if(gotkey()!=16)gotoxs_fl1;

key_ok=0;

}xs_fl1:

lcdwc(x+FIRST_ADDR);

if(flicker){hzkdis2("_");}

else{str[0]=0x31;

str[1]=0x1e;

hzkdis2(str);

}

flicker=~flicker;

a=gotkey();

if((a<10)&&(key_ok==0)){key_ok=1;y=a*16+(y%16);gotoxs_lf2;}

if(a==0x0b)return(y);

if(a==10)return(y);

if(a==13)

{

lcdwc(x+FIRST_ADDR);

str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

return(y);

}

if(a==14)gotoxs_lf2;

}

}

*/ucharset_xs_flicker(ucharx,y)

//修改数据标志

{

uchara,str[2];

bitflicker=0;

key_ok=1;

while(gotkey()!=16){}

xs_fl0:

while(1)

{

for

(a=0;a<20;a++)

{

delay(500);

if(gotkey()!=16)gotoxs_fl1;

key_ok=0;

}xs_fl1:

lcdwc(x+FIRST_ADDR);

if(flicker){hzkdis2("_");}

else{str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

}

flicker=~flicker;

a=gotkey();

if((a<10)&&(key_ok==0)){key_ok=1;y=a*16+(y%16);gotoxs_lf2;}

if(a==0x0b)return(y);

if(a==10)return(y);

if(a==13)

{

lcdwc(x+FIRST_ADDR);

str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

return(y);

}

if(a==14)gotoxs_lf2;

}xs_lf2:

while(1)

{

for

(a=0;a<20;a++)

{

delay(500);

if(gotkey()!=16)gotoxs_fl3;

key_ok=0;

}

xs_fl3:

lcdwc(x+FIRST_ADDR);

if(flicker)

{

str[0]=y/16+0x30;

str[1]=0x5f;

hzkdis2(str);

}

else{str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

}

flicker=~flicker;

a=gotkey();

if((a<10)&&(key_ok==0))

{

key_ok=1;

y=(y/16)*16+a;

lcdwc(x+FIRST_ADDR);

str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

return(y);

}

if(a==0x0b)return(y);

if(a==10)return(y);

if(a==13)

gotoxs_fl0;

if(a==14)

{

lcdwc(x+FIRST_ADDR);

str[0]=y/16+0x30;

str[1]=y%16+0x30;

hzkdis2(str);

return(y);

}

}}

voidxs_pls()

{

clr_xs();

lcdwc(0x91+FIRST_ADDR);hzkdis("设置已经保存");

delay(10000);

}voidset_clock()

{

while(1)

{

lcdreset();

//

read_clockS();

clr_xs();

lcdwc(0x82+FIRST_ADDR);hzkdis("时间设置");

disp_set_clock();

set_cl1:

yy=set_xs_flicker(0x91,yy);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

set_cl2:

mo=set_xs_flicker(0x93,mo);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();

xs_pls();

return;}

if(gotkey()==13)gotoset_cl1;

set_cl3:

dd=set_xs_flicker(0x95,dd);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

if(gotkey()==13)gotoset_cl2;

set_cl4:

hh=set_xs_flicker(0x89,hh);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

if(gotkey()==13)gotoset_cl3;

set_cl5:

mm=set_xs_flicker(0x8b,mm);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

if(gotkey()==13)gotoset_cl4;

set_cl6:

ss=set_xs_flicker(0x8d,ss);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

if(gotkey()==13)gotoset_cl5;set_cl7:

xq=set_xs_flicker(0x9c,xq);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

new_time();xs_pls();

return;}

if(gotkey()==13)gotoset_cl6;

gotoset_cl7;

}

}

clock_set(ucharx)

//设置闹钟{

ucharstr[2];

str[2]=0;

clkset1:if(x==0){x=1;}

if(x>32){x=1;}

while(1)

{

lcdreset();

read_clockss(x);

//改为要修改的闹钟

clr_xs();

lcdwc(0x82+FIRST_ADDR);hzkdis("闹钟设置");

lcdwc(0x87+FIRST_ADDR);

str[0]=x/10+0x30;

str[1]=x%10+0x30;

hzkdis2(str);

disp_clock_set();

delay(100);

hh=set_xs_flicker(0x89,hh);

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

Write_clockss(x);xs_pls();

return;}

if(gotkey()==13){

Write_clockss(x);x=x-1;gotoclkset1;}

if(gotkey()==14){

Write_clockss(x);x=x+1;gotoclkset1;}

mm=set_xs_flicker(0x8b,mm);

set1:

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

Write_clockss(x);xs_pls();

return;}

if(gotkey()==13){

Write_clockss(x);

x=x-1;gotoclkset1;}

if(gotkey()==14){

Write_clockss(x);

x=x+1;gotoclkset1;}

gotoset1;

/*

ss=set_xs_flicker(0x8d,ss);

set2:

if(gotkey()==11){

read_clockS();return;}

if(gotkey()==10){

Write_clockss(x);xs_pls();

return;}

if(gotkey()==13){

Write_clockss(x);x=x-1;gotoclkset1;}

if(gotkey()==14){

Write_clockss(x);

x=x+1;gotoclkset1;}

gotoset2;*/

}

}

/*------------------------------------------------

------------------------------------------------*/

/*****************************************************************************/

/******************************************************************************/

main()

{

uchari;

lcdreset();

Init_DS18B20();

read_clockS();

while(1)

{

updata();

//主屏幕时间刷新

if(ss==0)

//闹钟打铃判断

{

for(i=1;i<33;i++)

{

if(hh==Read_One_Byte(i*4+0x20))

{

if(mm==Read_One_Byte(i*4+0x21))

{

bell_on=1;

gotomain1;

}

}

}

}main1:

if(bell_time>ss)

{

if(bell_on==1){bell=0;

speaker=~speaker;delay(5000);}

}

else

{

bell=1;speaker=1;bell_on=0;

}

delay(500);

i=gotkey();

if(i==key_set)

{

set_0:

lcdreset();

key_ok=0;

delay(10);

lcdwc(0x80+FIRST_ADDR);hzkdis("1.设置时间");

lcdwc(0x90+FIRST_ADDR);hzkdis("2.设置闹时");

lcdwc(0x88+FIRST_ADDR);hzkdis("3.系统初始化");

lcdwc(0x98+FIRST_ADDR);hzkdis("4.返回");

set_1:

if(gotkey()==16)gotoset_1;

switch(gotkey())

{

case1:

set_clock();break;

case2:

clock_set(1);break;

case3:

DelayM(2000);if(gotkey()==3)lcdreset();restlib();DelayM(4000);lcdreset();Init_1302();Init_DS18B20();read_clockS();break;

}

if(gotkey()==0x03)gotoset_2;

if(gotkey()!=0x04)gotoset_0;

set_2:

lcdreset();

}

}

}

voidnew_time(void)

{

write_clock(0x8e,0x00);//允许写操作

write_clock(0x8c,yy);//年

write_clock(0x88,mo);//月

write_clock(0x86,dd);//日

write_clock(0x84,hh);//小时

write_clock(0x82,mm);//分钟

write_clock(0x80,ss);//秒

write_clock(0x8a,xq);//星期

write_clock(0x90,0xa5);//充电

write_clock(0x8e,0x80);//禁止写操作

}yf.h#ifndef__YF_H__

#define__YF_H__//定义累加器A中的各位

sbita0

=ACC^0;

sbita1

=ACC^1;

sbita2

=ACC^2;

sbita3

=ACC^3;

sbita4

=ACC^4;

sbita5

=ACC^5;

sbita6

=ACC^6;

sbita7

=ACC^7;

#defineuchar

unsignedchar

#definekey_set

10

#definekey_esc

11/****************************************************************************/

//定义全局变量sbitKEY_Y=P3^3;

sbitKEY_N=P3^2;

/*****************************************************************************/

//24lc08

//24存储器

#endif

24c08.c#include<reg51.h>

#include<intrins.h>

#include<YF.h>#defineTRUE

1

#defineFALSE

0

#defineDelay2408_TIME

2//经实验,不要小于50!否则可能造成时序混乱sbitSCL

=P1^6;

sbitSDA

=P1^7;

//

24c08

/******************************************************************************/

/*24C08.c*/

//调用方式如下:

//Write_One_Byte(0x10,0x04);

//k=Read_One_Byte(0x10);

/**********函数定义************/

voidDelay2408(unsignedintt)/*延时函数*/

{

while(t!=0)

t--;

}voidI2C_Start(void)

{

/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/

SCL=0;

SDA=1;

Delay2408(Delay2408_TIME);

SCL=1;

Delay2408(Delay2408_TIME);

SDA=0;

Delay2408(Delay2408_TIME);

SCL=0;

Delay2408(Delay2408_TIME);

}voidI2C_Stop(void)

{

/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/

SCL=0;

SDA=0;

Delay2408(Delay2408_TIME);

SCL=1;

Delay2408(Delay2408_TIME);

SDA=1;

Delay2408(Delay2408_TIME);

SCL=0;

Delay2408(Delay2408_TIME);

}

voidSEND_0(void)

/*SENDACK*/

{

/*发送0,在SCL为高电平时使SDA信号为低*/

SDA=0;

SCL=1;

Delay2408(Delay2408_TIME);

SCL=0;

Delay2408(Delay2408_TIME);

}voidSEND_1(void)

{

/*发送1,在SCL为高电平时使SDA信号为高*/

SDA=1;

SCL=1;

Delay2408(Delay2408_TIME);

SCL=0;

Delay2408(Delay2408_TIME);

}bitCheck_Acknowledge(void)

{

/*发送完一个字节后检验设备的应答信号*/

uchara;

SCL=0;

Delay2408(Delay2408_TIME);

SDA=1;

Delay2408(Delay2408_TIME);

SCL=1;

Delay2408(Delay2408_TIME);

a=255;

while(SDA==1)

{

a--;

if(a==0){SCL=0;returnFALSE;}

}

SCL=0;

returnTRUE;

}voidWriteI2CByte(ucharb)

{

/*向I2C总线写一个字节*/

unsignedchari;

for(i=0;i<8;i++)

{

if((b<<i)&0x80)

SEND_1();

else

SEND_0();

}

}unsignedcharReadI2CByte(void)

{

/*从I2C总线读一个字节*/

unsignedcharb=0,i;

for(i=0;i<8;i++)

{

SCL=0;

Delay2408(4);

SDA=1;

/*释放总线*/

Delay2408(4);

SCL=1;

/*接受数据*/

Delay2408(4);

if(SDA==1)

{

b=b<<1;

b=b|0x01;

}

else

b=b<<1;

Delay2408(4);

SCL=0;

}

returnb;

}/**********以下为读写24c02的函数***********************************************/

voidWrite_One_Byte(unsignedcharaddr,unsignedcharthedata)

{

bitacktemp=1;

//

I2C_Stop();

I2C_Start();

WriteI2CByte(0xa0);

acktemp=Check_Acknowledge();

WriteI2CByte(addr);

/*address*/

acktemp=Check_Acknowledge();

WriteI2CByte(thedata);

/*thedata*/

acktemp=Check_Acknowledge();

I2C_Stop();

Delay24

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论