|

- //說明:本程序用的延時程序部分,都是用示波器精確的測試所得的數據.
- #include<reg52.h>
- #define uchar unsigned char
- sbit DQ=P3^5;
- sbit D1=P0^1;
- sbit D2=P0^2;
- sbit D3=P0^3;
- ///////////////LCD1602/////
- sbit RS=P0^5;
- sbit RW=P0^6;
- sbit YE=P0^7;
- /////////////////////////////////////////////////////////////
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3
- 0x99,0x92,0x82,0xf8,//4,5,6,7
- 0x80,0x90,0xfe};//8,9,.,段碼表
- /////////////////////////////////////////////////////////////
- uchar code table1[] ={"0123456789"};
- uchar code table2[] ={" Temperature="};
- uchar code table3[] ={" www.zg4o1577.cn "};
- /////////////////////////////////////////////////////////////
- void delay(unsigned int us)
- {
- while(us--);
- }
- ////////////////////////////////////////////
- void delay2()
- {
- RS=0;
- RW=0;
- YE=0;
- delay(50);
- YE=1;
- }
- /***************************************************************/
- void reset()// DS18B20復位OK
- {
- uchar x=0;
- DQ=1;
- delay(8);
- DQ=0;
- delay(330);
- DQ=1;
- delay(100);
- x=DQ;
- delay(20);
- }
- ////////////////////////////////////////////從DS18B20讀一字節
- uchar readbyte()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- delay(27);//41us
- }
- return(dat);
- }
- /////////////////////////////////////////////向DS18B20寫一字節
- void writebyte(unsigned char dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(8);
- if(DQ==0)
- {
- delay(27);//41us
- DQ=1;
- }
- else
- {
- DQ=1;
- delay(27);//41us
- }
- dat>>=1;
- }
- }
- ////////////////////////////////////////////MCU讀取溫度值
- uchar readtemp()
- {
- uchar a=0;
- uchar b=0;
- reset();
- writebyte(0xcc);
- writebyte(0x44);
- reset();
- writebyte(0xcc);
- writebyte(0xbe);
- a=readbyte();
- b=readbyte();
- ////////////////////////
- b<<=4;
- b+=(a&0xf0)>>4;
- return(b);
- }
- //////////////////////////////////////////LED數碼管顯示程序
- void shanshi(uchar dat)
- {
- uchar a,b;
- a=dat/10;
- b=dat%10;
- ////////////
- D1=0;
- D2=1;
- P1=table[a];
- delay(1000);
- P1=0xff;
- delay(1000);
- /////////////////
- D1=1;
- D2=0;
- P1=table[b];
- delay(1000);
- P1=0xff;
- delay(1000);
- }
- /******************LCD1602液晶顯示****************************/
- void LCD1602(uchar dd)
- {
- uchar e,f,i,nem,t;
- e=dd/10;
- f=dd%10;
- //////////////////////
- P2=0x01; //清屏
- delay2();
- P2=0x38; //顯示設定兩行
- delay2();
- P2=0x0f; //打開顯示和光標
- delay2();
- P2=0x06; //光標右移
- delay2();
- P2=0x80; //光標回到第一行的開頭
- delay2();
- ///////////////////////
- for(nem=0;nem<13;nem++)
- {
- P2=table2[nem];
- RS=1;
- RW=0;
- YE=0;
- delay2();
- }
- //////////////////////////////////////
- for(t=0;t<1;t++)
- {
- P2=table1[e];
- RS=1;
- RW=0;
- YE=0;
- P2=0x06; //光標右移
- delay2();
- ////////////////////////
- P2=table1[f];
- RS=1;
- RW=0;
- YE=0;
- }
- //////////////////////////////////////
- P2=0xc0;
- delay2();
- for(i=0;i<16;i++)
- {
- P2=0xc0;
- delay2();
- P2=table3[i];
- RS=1;
- RW=0;
- YE=0;
- }
- }
- ////////////////////////////////////////////主函數
- void main()
- {
- uchar temp;
- while(1)
- {
- temp=readtemp();
- shanshi(temp);
- delay(10);
- LCD1602(temp);
- }
- }
復制代碼
|
|