- #include <REG52.H>
- #include<intrins.h> //包含_nop_()函数定义的头文件
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- sbit DQ=P3^3;
- sbit LED1=P2^3;
- sbit LED2=P2^6;
- sbit fmq=P1^6;
- union{
- uchar c[2];
- uint x;
- }temp;
- uint cc,cc2;
- float cc1;
- bit flag1;
- uchar buffer1[]={"dangerous!!"} ;
- uchar buffer2[]={"welcome!!!!"};
- uchar buffer3[]={"tem"};
- uchar num[6]={"+00.0"};
- /*void delay1us(uint z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--)
- {;} //500us
- }*/
- void delay500us()
- {
- unsigned char j;
- for(j=0;j<57;j++)
- {;} //500us
- }
- void beep()
- {
- fmq=0;
- delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
- fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
- delay500us();
- }
- //查忙函数
- void wait()
- {
- P0=0xff;
- RS=0;
- RW=1;
- EN=1;
- EN=0;
- while(P0&0x80)
- {
- EN=0;
- EN=1;
- }
- }
- void wc51com(uchar com)
- {
- wait();
- EN=0;
- RS=0;
- RW=0;
- EN=1;
- P0=com;
- EN=0;
- }
- void wc51r(uchar dat)
- {
- wait();
- EN=0;
- RS=1;
- RW=0;
- EN=1;
- P0=dat;
- EN=0;
- }
- void init()
- {
- wc51com(0x01);
- wc51com(0x38);
- wc51com(0x0c);
- wc51com(0x06);
- }
- /*****************************
- **********************************************/
- void delay(int useconds)
- {
- for(; useconds>0;useconds--);
- }
- uchar ow_reset(void)
- {
- uchar presence;
- DQ=0;//CPU把总线拉低的操作;
- delay(50);//拉低480微秒到960微秒
- DQ=1;//CPU释放总线
- delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
- presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
- delay(25);//延时60到240
- return(presence) ;
- }
- uchar read_byte(void)
- {
- uchar i;
- uchar value=0;
- for(i=8; i>0;i--)
- {
- value>>=1;
- DQ=0;
- DQ=1;
- delay(1);
- if(DQ) value|=0x80;
- delay(6);
- }
- return(value);
- }
- void write_byte(uchar val)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=val&0x01;
- delay(5);
- DQ=1;
- val=val/2;
- }
- delay(5);
- }
- void read_Temperature(void)
- {
- ow_reset();//初始化; 复位
- write_byte(0xCC);//温度变化指令(最开始为0)
- write_byte(0xBE);//读9个字节类容的温度
- temp.c[1]=read_byte(); //读出来显示低位
- temp.c[0]=read_byte(); //读出来显示高位
- _nop_(); _nop_();_nop_();
- ow_reset(); //初始化
- write_byte(0xCC); //温度变化指令
- write_byte(0x44);//读存入到9个字节中
- return;
- }
- void main()
- {
- uchar k=0;
- uint t=0;
- delay(10); fmq=1;
- EA=0;
- flag1=0;
- init();
- wc51com(0x80+0x00);
- wc51r('m');
- wc51r('e');
- while(1)
- {
- delay(10000);
- read_Temperature();
- cc=temp.c[0]*256.0+temp.c[1];
- if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
- cc1=cc*0.0625; //得到实际的值;
- cc2=cc1*100;//1710
- if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
- {
- LED2=1;
- LED1=0;
- wc51com(0x80+0x04);
- for(k=0;k<11;k++)
- {wc51r(buffer2[k]);}
- }
- else
- {
- LED2=0;
- LED1=1;
- wc51com(0x80+0x04);
- for(k=0;k<11;k++)
- {
- wc51r(buffer1[k]);
- }
- wc51com(0x80+0x40) ;
- for(k=0;k<3;k++)
- {
- wc51r(buffer3[k]);
- }
- for(t=0;t<1000;t++) //响
- {
- {
- beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
- }
- fmq=1; //不响;
- delay500us();
- delay500us();
- }
- }
- num[1]=cc2/1000+0x30;//1710/100=1;
- if(num[1]==0x30)
- num[1]=0x20;
- num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
- num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
- if(flag1==1)
- {
- num[0]='-';
- }
- else
- num[0]='+';
- wc51com(0x80+0x44);
- for(k=0;k<5;k++)
- {wc51r(num[k]);}
- }
- }#include <REG52.H>
- #include<intrins.h> //包含_nop_()函数定义的头文件
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- sbit DQ=P3^3;
- sbit LED1=P2^3;
- sbit LED2=P2^6;
- sbit fmq=P1^6;
- union{
- uchar c[2];
- uint x;
- }temp;
- uint cc,cc2;
- float cc1;
- bit flag1;
- uchar buffer1[]={"dangerous!!"} ;
- uchar buffer2[]={"welcome!!!!"};
- uchar buffer3[]={"tem"};
- uchar num[6]={"+00.0"};
- /*void delay1us(uint z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--)
- {;} //500us
- }*/
- void delay500us()
- {
- unsigned char j;
- for(j=0;j<57;j++)
- {;} //500us
- }
- void beep()
- {
- fmq=0;
- delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
- fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
- delay500us();
- }
- //查忙函数
- void wait()
- {
- P0=0xff;
- RS=0;
- RW=1;
- EN=1;
- EN=0;
- while(P0&0x80)
- {
- EN=0;
- EN=1;
- }
- }
- void wc51com(uchar com)
- {
- wait();
- EN=0;
- RS=0;
- RW=0;
- EN=1;
- P0=com;
- EN=0;
- }
- void wc51r(uchar dat)
- {
- wait();
- EN=0;
- RS=1;
- RW=0;
- EN=1;
- P0=dat;
- EN=0;
- }
- void init()
- {
- wc51com(0x01);
- wc51com(0x38);
- wc51com(0x0c);
- wc51com(0x06);
- }
- /*****************************
- **********************************************/
- void delay(int useconds)
- {
- for(; useconds>0;useconds--);
- }
- uchar ow_reset(void)
- {
- uchar presence;
- DQ=0;//CPU把总线拉低的操作;
- delay(50);//拉低480微秒到960微秒
- DQ=1;//CPU释放总线
- delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
- presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
- delay(25);//延时60到240
- return(presence) ;
- }
- uchar read_byte(void)
- {
- uchar i;
- uchar value=0;
- for(i=8; i>0;i--)
- {
- value>>=1;
- DQ=0;
- DQ=1;
- delay(1);
- if(DQ) value|=0x80;
- delay(6);
- }
- return(value);
- }
- void write_byte(uchar val)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=val&0x01;
- delay(5);
- DQ=1;
- val=val/2;
- }
- delay(5);
- }
- void read_Temperature(void)
- {
- ow_reset();//初始化; 复位
- write_byte(0xCC);//温度变化指令(最开始为0)
- write_byte(0xBE);//读9个字节类容的温度
- temp.c[1]=read_byte(); //读出来显示低位
- temp.c[0]=read_byte(); //读出来显示高位
- _nop_(); _nop_();_nop_();
- ow_reset(); //初始化
- write_byte(0xCC); //温度变化指令
- write_byte(0x44);//读存入到9个字节中
- return;
- }
- void main()
- {
- uchar k=0;
- uint t=0;
- delay(10); fmq=1;
- EA=0;
- flag1=0;
- init();
- wc51com(0x80+0x00);
- wc51r('m');
- wc51r('e');
- while(1)
- {
- delay(10000);
- read_Temperature();
- cc=temp.c[0]*256.0+temp.c[1];
- if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
- cc1=cc*0.0625; //得到实际的值;
- cc2=cc1*100;//1710
- if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
- {
- LED2=1;
- LED1=0;
- wc51com(0x80+0x04);
- for(k=0;k<11;k++)
- {wc51r(buffer2[k]);}
- }
- else
- {
- LED2=0;
- LED1=1;
- wc51com(0x80+0x04);
- for(k=0;k<11;k++)
- {
- wc51r(buffer1[k]);
- }
- wc51com(0x80+0x40) ;
- for(k=0;k<3;k++)
- {
- wc51r(buffer3[k]);
- }
- for(t=0;t<1000;t++) //响
- {
- {
- beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
- }
- fmq=1; //不响;
- delay500us();
- delay500us();
- }
- }
- num[1]=cc2/1000+0x30;//1710/100=1;
- if(num[1]==0x30)
- num[1]=0x20;
- num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
- num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
- if(flag1==1)
- {
- num[0]='-';
- }
- else
- num[0]='+';
- wc51com(0x80+0x44);
- for(k=0;k<5;k++)
- {wc51r(num[k]);}
- }
- }
复制代码
|