00000000.png (73.5 KB, 下載次數: 384)
下載附件
2015-7-14 19:46 上傳
- #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]);}
- }
- }
復制代碼
|