我用的下面的程序,附件是打包的整個工程文件夾,有EE21開發板的朋友可以直接下載看看效果,我在屋子里穿著羽絨服,測出的溫度有19.5度,還請大家幫忙看看是哪里出了問題
復制代碼
- #include"reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit ds=P1^3;//DS18B20
- sbit dx=P1^4;//段選
- sbit wx=P1^5;//位選
- sbit led_cs=P1^6;//LED片選
- sbit lcd_en=P3^4;
- sbit lcd_rs=P3^5;
- uint temp;//整型的溫度數據
- float f_temp;//浮點型的溫度數據
- unsigned char code table[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//帶小數的段碼表
- unsigned char code table1[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
- 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};//不帶小數的段碼表
- void delay(uint z)//延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=113;y>0;y--);
- }
- void dsreset(void)//DS18B20復位,初始化函數
- {
- uint i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit(void)//讀1位數據函數
- {
- uint i;
- bit dat;
- ds=0;i++;//i++ 起延時作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tempread(void)//讀1個字節數據函數
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在DAT里
- }
- return(dat);
- }
- void tempwritebyte(uchar dat)//向18B20寫一個字節數據函數
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb)//寫1
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;while(i>0)i--;
- }
- else
- {
- ds=0;//寫0
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange(void)//DS18B20開始獲取溫度并轉換
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc);// 寫跳過讀ROM指令
- tempwritebyte(0x44);// 寫溫度轉換指令
- }
- uint get_temp()//讀取寄存器中存儲的溫度數據
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread();//讀低8位
- b=tempread();//讀高8位
- temp=b;
- temp<<=8;//兩個字節組合為1個字
- temp=temp|a;
- f_temp=temp*0.0625;//溫度在寄存器中為12位 分辨率位0.0625°
- temp=f_temp*10+0.5;//乘以10表示小數點后面只取1位,加0.5是四舍五入
- f_temp=f_temp+0.05;
- return temp;//temp是整型
- }
- ////////////////////顯示程序//////////////////////////
- void display(uint t)
- {
- uchar A1,A2,A3;
- A1=t/100;
- A2=t%100/10;
- A3=t%100%10;
- P0=0X01; //選通第一位數碼管
- wx=1;
- wx=0;
- P0=table[A1];//顯示百位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//關位碼
- dx=1;
- dx=0;
- P0=0x02;//選通第二位數碼管
- wx=1;
- wx=0;
- P0=table1[A2];//顯示十位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//關位碼
- dx=1;
- dx=0;
-
- P0=0x04;//選通第三位數碼管
- wx=1;
- wx=0;
- P0=table[A3];//顯示個位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//關位碼
- dx=1;
- dx=0;
- }
- void main()//主函數
- {
- led_cs=0;
- lcd_en=0;
- lcd_rs=0;
- delay(1); // 延時1ms
- tempchange(); // 啟動溫度轉換,需要750ms
- delay(500); // 延時1s
- get_temp(); // 讀取溫度
-
- while(1)
- {
- tempchange();
- display(get_temp());
- }
- }
復制代碼