皖西学院 学生课程设计项目
{ week_value[0] = Time->Week + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示 }
else
{week_value[0] = ' '; } week_value[1] = '\\0';
Time->DateString[10] = '\\0'; //字符串末尾加 '\\0' ,判断结束字符} void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到
数组 TimeString[];
{ if(hide_hour<2)
{Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour + '0';} else
{Time->TimeString[0] = ' '; Time->TimeString[1] = ' ';} Time->TimeString[2] = ':'; if(hide_min<2)
{ Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute + '0';} else
{Time->TimeString[3] = ' '; Time->TimeString[4] = ' '; } Time->TimeString[5] = ':'; if(hide_sec<2)
{Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second + '0';} else
{Time->TimeString[6] = ' '; Time->TimeString[7] = ' ';} Time->DateString[8] = '\\0';}
void Initial_DS1302(void) //时钟芯片初始化
21
皖西学院 学生课程设计项目
{ unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判断时钟芯片是否关闭 {Write1302(0x8e,0x00); //写入允许
Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
Write1302(0x88,0x07); Write1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59); Write1302(0x80,0x55);
Write1302(0x8e,0x80); //禁止写入 }}
/***********ds18b20子程序*************************/ /***********ds18b20延迟子函数(晶振12MHz )*******/ void delay_18B20(unsigned int i) { while(i--);}
/**********ds18b20初始化函数**********************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);}
/***********ds18b20读一个字节**************/ unsigned char ReadOneChar(void) {uchar i=0;
22
皖西学院 学生课程设计项目
uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); }
return(dat);}
/*************ds18b20写一个字节****************/ void WriteOneChar(uchar dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1; } }
/**************读取ds18b20当前温度************/ void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44);
// 启动温度转换
delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE);
//跳过读序号列号的操作
//读取温度寄存器前两个就是温度
23
皖西学院 学生课程设计项目
delay_18B20(100);
a=ReadOneChar(); b=ReadOneChar(); temp_value=b<<4;
temp_value+=(a&0xf0)>>4; }
void temp_to_str() //温度数据转换成液晶字符显示 { TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value+'0'; //个位 TempBuffer[2]=0xdf; //温度符号 TempBuffer[3]='C'; TempBuffer[4]='\\0';}
void Delay1ms(unsigned int count) {unsigned int i,j; for(i=0;i void mdelay(uint delay) /*延时子程序*/ { uint i; for(;delay>0;delay--) {for(i=0;i<62;i++) //1ms延时. {;}}} //读取温度值低位 //读取温度值高位 void outkey() //跳出调整模式,返回默认显示 { uchar Second; if(out==0||wireless_1==1) { mdelay(8); count=0; hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; Second=Read1302(DS1302_SECOND); Write1302(0x8e,0x00); //写入允许 Write1302(0x80,Second&0x7f); 24 皖西学院 学生课程设计项目 Write1302(0x8E,0x80); //禁止写入 done=0; while(out==0); while(wireless_1==1) }} /////////////////////////////////////////////////////////////////////////void Upkey()//升序按键 { Up=1; if(Up==0||wireless_2==1) { mdelay(8); switch(count) {case 1: temp=Read1302(DS1302_SECOND); //读取秒数 temp=temp+1; //秒数加1 up_flag=1; //数据调整后更新标志 if((temp&0x7f)>0x59) //超过59秒,清零 temp=0; break; case 2: temp=Read1302(DS1302_MINUTE); //读取分数 temp=temp+1; //分数加1 up_flag=1; if(temp>0x59) //超过59分,清零 temp=0; break; case 3: temp=Read1302(DS1302_HOUR); //读取小时数 temp=temp+1; //小时数加1 up_flag=1; if(temp>0x23) //超过23小时,清零 temp=0; 25