仿真圖
代碼如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ = P1^0; //DS18B20數據口
- uchar FLAG=1; //正負溫度標志
- unsigned char TMPH,TMPL;
- //這三個引腳參考資料
- sbit E=P2^2; //1602使能引腳
- sbit RW=P2^1; //1602讀寫引腳
- sbit RS=P2^0; //1602數據/命令選擇引腳
- void delay_1()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++)
- ;
- }
- // 1602命令函數
- void enable(uchar del)
- {
- P0 = del;
- RS = 0;
- RW = 0;
- E = 0;
- delay_1();
- E = 1;
- delay_1();
- }
- void write(uchar del)
- {
- P0 =del;
- RS = 1;
- RW = 0;
- E = 0;
- delay_1();
- E = 1;
- delay_1();
- }
- // 1602初始化,請參考1602的資料
- void L1602_init(void)
- {
- enable(0x01);
- enable(0x38);
- enable(0x0c);
- enable(0x06);
- enable(0xd0);
- }
- //改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下 L1602_char(1,5,'b')
- void L1602_char(uchar hang,uchar lie,char sign)
- {
- uchar a;
- if(hang == 1) a = 0x80;
- if(hang == 2) a = 0xc0;
- a = a + lie - 1;
- enable(a);
- write(sign);
- }
- //改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下L1602_string(1,5,"ab cd ef;")
- void L1602_string(uchar hang,uchar lie,uchar *p)
- {
- uchar a;
- if(hang == 1) a = 0x80;
- if(hang == 2) a = 0xc0;
- a = a + lie - 1;
- enable(a);
- while(1)
- {
- if(*p == '\0') break;
- write(*p);
- p++;
- }
- }
- void delay(uint N)
- {
- int i;
- for(i=0; i<N; i++)
- ;
- }
- Init_Ds18b20()
- {
- bit Status_Ds18b20;
- DQ=1;
- DQ=0;
- delay(250);
- DQ=1;
- delay(20);
- if(!DQ)
- Status_Ds18b20=0;
- else
- Status_Ds18b20=1;
- delay(250);
- DQ=1;
- return Status_Ds18b20;
- }
- uchar Read_Ds18b20()
- {
- uchar i=0,dat=0;
- for(i=0;i<8;i++)
- {
- DQ=1;
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- DQ=1;
- delay(25);
- }
- return dat;
- }
- void Witie_Ds18b20(uchar dat)
- {
- uchar i=0;
- for(i=0;i<8;i++)
- {
- DQ=1;
- dat>>=1;
- DQ=0;
- DQ=CY;
- delay(25);
- DQ=1;
- }
- }
- void chuli()
- {
- uint temp;
- float tem;
- Init_Ds18b20(); //復位
- Witie_Ds18b20(0xcc); //寫跳過ROM命令
- Witie_Ds18b20(0x44); //開啟溫度轉換
- Init_Ds18b20();
- Witie_Ds18b20(0xcc);
- Witie_Ds18b20(0xbe); //讀暫存器
- TMPL = Read_Ds18b20();
- TMPH = Read_Ds18b20();
- temp = TMPH;
- temp <<= 8;
- temp = temp | TMPL;
- if(TMPH>=8)
- {
- temp=~temp+1;
- FLAG=1;
- }
- else FLAG=0;
- tem=temp*0.0625;
- temp=tem*100;
- if((temp/10000)==0) //當高位為0時不顯示0
- L1602_char(2,5,' ');
- else
- L1602_char(2,5,temp/10000 + 48);
- if((temp/10000)==0&&(temp/1000%10)==0) //當高位為0時不顯示0
- L1602_char(2,6,' ');
- else
- L1602_char(2,6,temp/1000%10 + 48);
- L1602_char(2,7,temp/100%10 + 48);
- L1602_char(2,8,0x2e);
- L1602_char(2,9,temp/10%10 + 48);
- L1602_char(2,10,temp%10 + 48);
- L1602_char(2,11,0xdf); //溫度符號C前的圈
- if(FLAG==1)
- L1602_char(2,4,0x2d); //輸出-號
- else
- L1602_char(2,4,0x2b); //輸出+號
- }
- void main()
- {
- // float tt;
- // uint temp;
- P2 = 0x00;
- L1602_init();
- L1602_string(1,1," DS18B20 TEST ");
- L1602_string(2,1," C");
- while(1)
- {
- chuli();
- }
- }
復制代碼
硬件沒問題,應該就是程序問題,求大佬解答
|