}
Wbyte1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ }
Gets1302() //把从DS1302读得的时间数据写入时间数组 {
uchar i;
uchar ucAddr=0x81;
for (i=0;i<7;i++) {
Utime[i]=Rbyte1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr +=2; } }
b20reset() //18B20复位,初始化函数 {
uchar i; ds=0;
for(i=1;i<110;i++); ds=1;
for(i=1;i<10;i++); }
bit b20Rbit() //读1位函数 {
uchar i; bit dat;
ds=0;ds=0;ds=0;
ds=1;ds=1;ds=1;ds=1; dat=ds;
for(i=1;i<10;i++); return (dat); }
uchar b20Rbyte() //读1个字节 {
uchar i,j,dat; dat=0;
for(i=1;i<=8;i++) {
j=b20Rbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat); }
b20Wbyte(uchar dat) //向18B20写一个字节数据 {
uint i; uchar j; bit testb;
for(j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1;
if(testb) //写 1 {
ds=0; ds=0; ds=0; ds=1;
for(i=1;i<9;i++) ; } else {
ds=0; //写 0 for(i=1;i<9;i++) ; ds=1; ds=1; ds=1; } } }
b20Set() //DS18B20 开始获取温度并转换 {
b20reset(); delayx(1);
b20Wbyte(0xcc); // 写跳过读ROM指令 b20Wbyte(0x44); // 写温度转换指令 }
uint b20Get() //读取寄存器中存储的温度数据 {
uchar TL,TH; b20reset(); delayx(1);
b20Wbyte(0xcc); b20Wbyte(0xbe);
TL=b20Rbyte(); //读低8位 TH=b20Rbyte(); //读高8位 temp=TH; temp<<=8; temp|=TL; if(TH>0x07) {
c1b=0xbf; //设为负号'-'显示 temp=~temp+1;} else
c1b=0xc6; //设为字母'C'显示 temp=temp*6.25; temp=temp+5; temp=temp/10;
return temp; //temp是整型 }
//* ================ 打开 ISP,IAP 功能 ================= */ void ISP_IAP_enable(void) { EA = 0; /* 关中断 */ ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */ ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */ ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */ }
/* =============== 关闭 ISP,IAP 功能 ================== */ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ ISP_TRIG = 0x00; EA = 1; /* 开中断 */ }
/* ================ 公用的触发代码 ==================== */ void ISPgoon(void) { ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */ ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */ ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */ _nop_();
}
/* ==================== 字节读 ======================== */ unsigned char byte_read(unsigned int byte_addr) { ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */ ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ return (ISP_DATA); /* 返回读到的数据 */ }
/* ================== 扇区擦除 ======================== */ void SectorErase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */ ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ }
/* ==================== 字节写 ======================== */ void byte_write(unsigned int byte_addr, unsigned char original_data) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ ISP_DATA = original_data; /* 写入数据准备 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭IAP功能 */ }
time_set( )interrupt 0 {
unsigned int m,n,u,k,i; unsigned char *p; p=0x2000; u=mmhh[0]*2;
SectorErase(0x2000);//擦除扇区 for(m=0;m<=u;m++)
byte_write(p+m,mmhh[m]);//重新写入数据 m=23;u=59; while(s6!=0) {
if(m==24) m=0; if(u==60) u=0; if(u==-1) u=59; n=m*100+u;
for(i=1;i<=100;i++) Disp_led(n); if(s3==0) { for(i=0;i<100;i++) ; if(s3==0) m++;} if(s4==0) { for(i=0;i<100;i++) ; if(s4==0) u++;} if(s5==0) { for(i=0;i<100;i++) ; if(s5==0) u--; } }
Utime[0]=0; Utime[1]=u; Utime[2]=m; for(i=0;i<7;i++) {
k=Utime[i]/10;
Utime[i]=Utime[i]; Utime[i]=Utime[i]+16*k;
} Puts1302(); }