{
DQ = 1; // DQ复位 Delay(8); // 稍做延时
DQ = 0; // 单片机将DQ拉低 Delay(90); // 精确延时 大于 480us DQ = 1; // 拉高总线 Delay(8);
presence = DQ; // 如果=0则初始化成功 =1则初始化失败 Delay(100); DQ = 1;
return(presence); // 返回信号,0=presence,1= no presence }
/**********************************************************/ uchar ReadOneChar(void) // 读一个字节 {
unsigned char i = 0; unsigned char dat = 0; for (i = 8; i > 0; i--) {
DQ = 0; // 给脉冲信号 dat >>= 1;
DQ = 1; // 给脉冲信号 if(DQ) dat |= 0x80; Delay(4); }
return (dat); }
/**********************************************************/
14
void WriteOneChar(unsigned char dat)// 写一个字节 {
unsigned char i = 0; for (i = 8; i > 0; i--) { DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat>>=1; } }
/*********************************************************/ void Read_Temperature(void)// 读取温度 {
Init_DS18B20(); if(presence==1) { beep(); flash=1;
} // DS18B20不正常,蜂鸣器报警 else { flash=0;
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0xBE); // 读取温度寄存器 temp_data[0] = ReadOneChar(); // 温度低8位 temp_data[1] = ReadOneChar(); // 温度高8位
15
} }
/*********************************************************/ void Disp_Temperature()// 显示温度 {
unsigned char n=0;
if(temp_data[1]>7) //当温度高八位中的高五位全为O { flag_zf=1; // 所测温度为负时,要进行转换 temp_data[1]=!( temp_data[1]); temp_data[0]=!( temp_data[0]); temp_data[0]= temp_data[0]+1; if(temp_data[0]=0)
{ temp_data[1]= temp_data[1]+1;} } Else
{flag_zf=0} //判断测得的温度数据是正还是负,如果为正,不做任何
//理
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]; // 查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); display[3]=display[4]/100; display[1]=display[4]0; display[2]=display[1]/10; display[1]=display[1]; if(flag_zf=1) {p0=0xbf; P2=0x02;
Delay(300);} //温度为负数时第二个数码管显示负号 if(!display[3]) // 高位为0,不显示
16
{
display[3]=0x0a;
if(!display[2]) // 次高位为0,不显示 display[2]=0x0a; }
P0 = 0xc6; // 显示 C
P2 = 0xfe; // 位选线为P2.7口,LED为共阳极显示,当位选线为低电平时选通
Delay(300);
P0 = 0x9c; // 显示 ° P2 = 0xfd; // 选中P2.6口 Delay(300);
P0 =LEDData[display[0]] ; // 显示小数位 P2 = 0xfb; //p2.5 Delay(300);
P0 =LEDData1[display[1]]; // 显示个位 P2 = 0xf7; Delay(300);
P0 =LEDData[display[2]]; // 显示十位 P2 = 0xef; Delay(300);
P0 =LEDData[display[3]]; // 显示百位 P2 = 0xdf; Delay(300);
P2 = 0xff; // 关闭显示
17
}
/*********************************************************/ void beep(void) {
unsigned char i; for (i=0;i<100;i++) {
Delay(60);
BEEP=!BEEP; // BEEP取反 }
BEEP=1; // 关闭蜂鸣器 }
/*********************************************************/ void init(void) {
EA = 1; // \中断总允许\
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器0赋初值
SCON = 0x50; // 设定串行口工作方式 PCON &= 0x00; // 波特率不倍增 TR1 = 1; // 启动定时器1 IE = 0x00; // 禁止任何中断 }
/*********************************************************/ void send_char(void)
// 传送十六位的温度数据,低位在前 {
unsigned i=0;
18