Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }
void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2011/06/15
{ Time->DateString[0] = '2'; Time->DateString[1] = '0'; Time->DateString[2] = Time->Year/10 + '0'; Time->DateString[3] = Time->Year + '0'; } else { Time->DateString[0] = ' '; Time->DateString[1] = ' '; Time->DateString[2] = ' '; Time->DateString[3] = ' '; } Time->DateString[4] = '/'; if(hide_month<2) { Time->DateString[5] = Time->Month/10 + '0'; Time->DateString[6] = Time->Month + '0'; } else { Time->DateString[5] = ' '; Time->DateString[6] = ' '; } Time->DateString[7] = '/'; if(hide_day<2) { Time->DateString[8] = Time->Day/10 + '0'; Time->DateString[9] = Time->Day + '0'; } else { Time->DateString[8] = ' '; Time->DateString[9] = ' '; } if(hide_week<2) {
\\
32
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] = ' ';
\\
33
Time->TimeString[7] = ' '; } Time->DateString[8] = '\\0'; }
void Initial_DS1302(void) //时钟芯片初始化 { unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判断时钟芯片是否关闭 { Write1302(0x8e,0x00); //写入允许 Write1302(0x8c,0x11); //以下写入初始化时间 日期:11/06/15.星期: 3. 时间: 12:00:00 Write1302(0x88,0x06); Write1302(0x86,0x15); Write1302(0x8a,0x03); //xingqi Write1302(0x84,0x12); Write1302(0x82,0x00); Write1302(0x80,0x00); 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);
\\
34
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); }
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void) { uchar i=0; 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;
\\
35
Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b<<4; //左移四位,扩大16倍,变为一个字节的高四位 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 buzzer() { unsigned char i; for(i=0;i<10;i++) { bell = 0; Delay1ms(10); bell = 1; } } \\ 36