實(shí)驗(yàn)任務(wù)十溫度檢測(cè)系統(tǒng)設(shè)計(jì)(DS18B20) 熟悉用KeilC51、PROTEUS軟件進(jìn)行電路及控制系統(tǒng)的仿真。學(xué)會(huì)利用溫度傳感器DS18B20檢測(cè)溫度,利用單片機(jī)顯示溫度。 二、實(shí)訓(xùn)內(nèi)容: 1、實(shí)訓(xùn)任務(wù): 1)任務(wù)描述: 設(shè)計(jì)一個(gè)數(shù)字式溫度計(jì),要求使用溫度傳感器(可以采用DS18B20測(cè)量溫度,再經(jīng)單片機(jī)處理后,LED數(shù)碼管顯示測(cè)量的溫度值。測(cè)溫范圍為-10~85℃,精度誤差在0.5℃以內(nèi)。 2)任務(wù)分析: 如上圖所示,系統(tǒng)以51單片機(jī)為控制核心,加上溫度檢測(cè)傳感器DS18B20。利用DS18B20集成溫度傳感器檢測(cè)溫度,然后通過(guò)串口送到單片機(jī)中進(jìn)行數(shù)據(jù)處理變換,最后將溫度值顯示在LED顯示器上。 3)任務(wù)實(shí)施: 1)在PROTEUS軟件中按圖搭接好電路; 2)在Keil軟件中編輯程序,進(jìn)行編譯,得到.HEX格式文件; 3)將所得的HEX格式文件在PROTEUS中指定到MCU芯片中; 4)運(yùn)行仿真,觀察仿真結(jié)果; 5)PROTEUS中結(jié)果正常后,用實(shí)際硬件搭接并調(diào)試電路,通過(guò)編程器將.HEX格式文件下載到AT89C51中,通電驗(yàn)證實(shí)驗(yàn)結(jié)果。 匯編程序如下所示:(C程序請(qǐng)參考教材)
- #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; // 取整數(shù)部分
- if(temp_data<0&&temp_data>=(-10)) //如果讀取到的值大于負(fù)10小于 0,顯示負(fù)號(hào)且將值轉(zhuǎn)換為正數(shù)
- {
- disp[0]= 16;
- temp_data=0-temp_data; //將負(fù)數(shù)轉(zhuǎn)換為正數(shù)
- }
- 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))) //如果讀取到的數(shù)值的范圍在-10~85之間,就顯示出來(lái)
- {
- 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寫一個(gè)字節(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寫一個(gè)字節(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讀取一位數(shù)據(jù)
- {
- 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讀取一個(gè)字節(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讀取一個(gè)字節(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轉(zhuǎn)換的溫度值
- {
- 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ā)送轉(zhuǎn)換指令
- {
- Init_Ds18b20();
- delay_ms(1);
- write18b20(0xcc); //跳過(guò)ROM
- write18b20(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- }
- void display() //顯示函數(shù)
- {
- 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; //第三位顯示小數(shù)點(diǎn)
- delay_ms(1);
- P3=wei[3];
- P0=duan[disp[3]];
- delay_ms(1);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址: |