實驗任務十溫度檢測系統設計(DS18B20) 熟悉用KeilC51、PROTEUS軟件進行電路及控制系統的仿真。學會利用溫度傳感器DS18B20檢測溫度,利用單片機顯示溫度。 二、實訓內容: 1、實訓任務: 1)任務描述: 設計一個數字式溫度計,要求使用溫度傳感器(可以采用DS18B20測量溫度,再經單片機處理后,LED數碼管顯示測量的溫度值。測溫范圍為-10~85℃,精度誤差在0.5℃以內。 2)任務分析: 如上圖所示,系統以51單片機為控制核心,加上溫度檢測傳感器DS18B20。利用DS18B20集成溫度傳感器檢測溫度,然后通過串口送到單片機中進行數據處理變換,最后將溫度值顯示在LED顯示器上。 3)任務實施: 1)在PROTEUS軟件中按圖搭接好電路; 2)在Keil軟件中編輯程序,進行編譯,得到.HEX格式文件; 3)將所得的HEX格式文件在PROTEUS中指定到MCU芯片中; 4)運行仿真,觀察仿真結果; 5)PROTEUS中結果正常后,用實際硬件搭接并調試電路,通過編程器將.HEX格式文件下載到AT89C51中,通電驗證實驗結果。 匯編程序如下所示:(C程序請參考教材)
- #include <reg52.h>
- //#include <intrins.h>
- sbit IO_18B20 =P2^0;
- unsigned char wei[]={0x1,0x2,0x4,0x8};
- char temp_data,temp_data1;
- unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
- unsigned char disp[]={5,0,0,0};
- //void delayx10us(unsigned char t);
- void delay_ms( int x);
- void write18b20(unsigned char dat);
- void tempchange(void);
- void display();
- void display1();
- bit read_bit();
- bit Init_Ds18b20();
- unsigned char read18b20();
- int get18b20temp();
- void main()
- {
- P0=0Xff;
- P3=0Xff;
- while(1)
- {
- tempchange();
- temp_data=get18b20temp()/16; // 取整數部分
- if(temp_data<0&&temp_data>=(-10)) //如果讀取到的值大于負10小于 0,顯示負號且將值轉換為正數
- {
- disp[0]= 16;
- temp_data=0-temp_data; //將負數轉換為正數
- }
- else
- {disp[0]=temp_data/100;}
- temp_data1=temp_data%100;
- disp[1]=temp_data1/10;
- disp[2]=temp_data1%10;
- disp[3]=12; //顯示溫度單位C
- if((temp_data>=(-10))&&(temp_data<=(85))) //如果讀取到的數值的范圍在-10~85之間,就顯示出來
- {
- display();
- }
- }
- }
- bit Init_Ds18b20() //初始化DS18B20
- {
- unsigned int i;
- bit ack;
- IO_18B20=0;
- for(i=0;i<100;i++);
- IO_18B20=1;
- for(i=0;i<4;i++);
- for(i=0;i<20;i++)
- {ack=IO_18B20;if(ack==1)break;}
- for(i=0;i<80;i++);
- return (ack);
- }
- //bit Init_Ds18b20()
- //{
- // bit ack;
- // IO_18B20 = 0;
- // delayx10us(50);
- // IO_18B20 = 1;
- // delayx10us(6);
- // ack = IO_18B20;
- // while(!IO_18B20);
- // return ack;
- //}
- void write18b20(unsigned char dat) //向DS18B20寫一個字節(jié),dat為待寫入字節(jié)
- {
- unsigned int i;
- unsigned char j;
- bit test;
- for(j=0;j<8;j++)
- {
- test=dat&0x01;
- dat=dat>>1;
- if(test)
- {
- IO_18B20=0;
- i++;i++;
- IO_18B20=1;
- for(i=0;i<8;i++);
- }
- else
- {
- IO_18B20=0;
- for(i=0;i<8;i++);
- IO_18B20=1;
- i++;i++;
- }
- }
- }
- //void write18b20(unsigned char dat) //向DS18B20寫一個字節(jié),dat為待寫入字節(jié)
- //{
- // unsigned char i;
- // for(i=0;i<8;i++)
- // {
- // IO_18B20 = 0;
- // _nop_();
- // _nop_();
- // IO_18B20 = 1;
- // _nop_();
- // _nop_();
- // IO_18B20 = dat & 0x01;
- // delayx10us(6);
- // IO_18B20 = 1;
- // dat >>= 1;
- // }
- //}
- bit read_bit() //從DS18B20讀取一位數據
- {
- unsigned int i;
- bit dat;
- IO_18B20=0;
- i++;
- IO_18B20=1;
- i++;i++;
- dat=IO_18B20;
- for(i=0;i<8;i++);
- return (dat);
- }
- unsigned char read18b20() //從DS18B20讀取一個字節(jié),dat為讀到的字節(jié)
- {
- unsigned char j,h,dat;
- dat=0;
- for(h=0;h<8;h++)
- {
- j=read_bit();
- dat=(j<<7)|(dat>>1);
- }
- return (dat);
- }
- //unsigned char read18b20() //從DS18B20讀取一個字節(jié),dat為讀到的字節(jié)
- //{
- // unsigned char i;
- // unsigned char dat=0;
- // for(i=0 ; i<8 ; i++)
- // {
- // IO_18B20 = 0;
- // _nop_();
- // _nop_();
- // IO_18B20 = 1;
- // dat >>= 1;
- // if(!IO_18B20)
- // dat |= 0x80;
- // delayx10us(6);
- // IO_18B20 = 1;
- // _nop_();
- // }
- // return dat;
- //}
- int get18b20temp() //讀取DS18B20轉換的溫度值
- {
- int temp;
- unsigned char a,b;
- Init_Ds18b20();
- delay_ms(1);
- write18b20(0xcc);
- write18b20(0xbe); //寫讀溫度命令
- a=read18b20();
- b=read18b20();
- temp=b;
- temp<<=8;
- temp=temp|a;
- return temp;
- }
- void tempchange(void) //向DS18B20發(fā)送轉換指令
- {
- Init_Ds18b20();
- delay_ms(1);
- write18b20(0xcc); //跳過ROM
- write18b20(0x44); //啟動溫度轉換
- }
- void display() //顯示函數
- {
- P3=wei[0];
- P0=duan[disp[0]];
- delay_ms(1);
- P3=wei[1];
- P0=duan[disp[1]];
- delay_ms(1);
- P3=wei[2];
- P0=duan[disp[2]]&0X7F; //第三位顯示小數點
- delay_ms(1);
- P3=wei[3];
- P0=duan[disp[3]];
- delay_ms(1);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址: |