學生實驗報告 (理工類)
課程名稱:專業班級: 學生學號:學生姓名: 所屬院部:指導教師: 20——20學年 第學期 金陵科技學院教務處制 實驗項目名稱:實驗學時: 同組學生姓名:實驗地點: 實驗日期:實驗成績: 批改教師:批改時間: 一、實驗目的和要求 1、進一步熟練Keil uVision3的項目文件創建、編譯、運行和軟件仿真的基本操作方法; 2、鞏固程序調試的方法; 3、掌握單總線的工作原理; 4、掌握單總線器件18B20溫度傳感器的使用方法; 5、掌握對采集數據后續處理方法; 實驗任務:編寫程序,實時(定時器0中斷每隔0.5s)采集單總線溫度傳感器18B20的數據,能單獨顯示溫度。顯示格式要求如下: 當溫度高于或低于上、下限值時繼電器吸合燈亮,蜂鳴器鳴叫報警。可自行修改上下限值。 二、實驗儀器和設備 單片機編譯軟件Keil uVision3,計算機,USB下載線,CT107D單片機綜合開發平臺 三、實驗過程 目前,溫度測量方法很多,溫度傳感器也非常普遍。本實驗是基于DS18B20芯片的“一線式”溫度傳感器。該傳感器只需占用微處理器的一個普通端口, 獨特的單線接口僅需一個端口引腳進行通訊,并且多個傳感器可以并聯在一起使用,適用于多點溫度檢測系統,節約了大量系統資源。 主機(單片機)使用時間隙(time slots)來讀寫DSl8B20 的數據位和寫命令字的位。 (1)初始化 主機總線t0 時刻發送一復位脈沖(最短為480us 的低電平信號) 接著在t1時刻釋放總線并進入接收狀態。DSl820 在檢測到總線的上升沿之后等待15-60us 接著DS1820 在t2 時刻發出存在脈沖(低電平持續60-240 us) (2)寫時間隙 - 當主機總線 t0 時刻從高拉至低電平時就產生寫時間隙;
- 從 t0時刻開始15us 之內應將所需寫的位送到總線上DSl820 在t0后15-60us 間對總線采樣若低電平寫入的位是0;若高電平寫入的位是1 。
- 連續寫2 位間的間隙應大于1us
(3)讀時間隙 見圖,主機總線t0時刻從高拉至低電平時總線只須保持低電平1us 之后,單片機將總線拉高,釋放總線以產生讀時間隙。讀時間隙在t1 時刻后t2 時刻前有效, t2距t0為15us。也就是說t2時刻前主機必須完成讀位。每次讀周期至少 60us,兩次讀之間至少隔1us。 存儲器操作指令 發送CC:跳過ROM命令 發送44: 啟動溫度變換 發送BE: 讀暫存存儲器 數據格式 DS18B20,用12位存儲溫度,S為符號位: 正溫度S全部為0; 負溫度S全部為1,數據為二進制補碼; 使用buzz=0;relay=0;ULN2003_Latch();命令即可實現當溫度超過上下限制時,繼電器吸合燈亮,蜂鳴器響。 當動態掃描在while(1)中掃描時,數碼管顯示的只會閃動,當在循環后面掃描時,數碼管才不閃動。 四、實驗結果與分析 1.請用c語言寫出全部程序,并編譯,調試。 - #include <reg52.h>
- #include<intrins.h>
- #include"18b20.h"
- sbit DQ = P1^4;
- //延時函數
- void delay2us(unsigned char t) //2us
- {
- while(t--);
- }
- //DS18B20初始化函數
- bit init_ds18b20(void)
- {
- bit initflag = 0;
- DQ = 1;
- delay2us(1);
- DQ = 0;
- delay2us(250); // 延時大于480us
- DQ = 1;
- delay2us(10); // 15us<waits<80us
- initflag = DQ; // initflag等于1初始化失敗
- delay2us(40); //< 60us<presebcepulse<240us
- return initflag;
- }
- //通過單總線向從器件寫一個字節
- void WriteOneChar(unsigned char byt)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 1;
- _nop_();
- DQ = 0;
- DQ = byt&0x01;
- delay2us(15);
- DQ = 1;
- byt >>= 1;
- }
- delay2us(5);
- }
- //通過單總線從從器件讀一個字節
- unsigned char ReadOneChar(void)
- {
- unsigned char i;
- unsigned char byt;
- for(i=0;i<8;i++)
- {
- DQ = 0; // 拉低開始讀時間隙
- byt >>= 1;
- DQ = 1; //單片機釋放總線
- if(DQ) //18b20有效數據出現
- byt |= 0x80;
- delay2us(30);
- }
- return byt;
- }
- //溫度轉換、讀取及數據處理器函數
- unsigned char rd_temperature(void)
- {
- unsigned char low,high;
- char temp;
- init_ds18b20();
- WriteOneChar(0xCC);
- WriteOneChar(0x44); //啟動溫度轉換
- init_ds18b20();
- WriteOneChar(0xCC);
- WriteOneChar(0xBE); //讀取寄存器
- low = ReadOneChar(); //低字節
- high = ReadOneChar(); //高字節
- temp = high<<4;
- temp += ((low&0xf0)>>4);
- return temp;
- }
- #include<reg52.h>
- #include "18b20.h"
- #include "display.h"
- #include "timer0.h"
- #include "Uln2003.h"//用來關掉煩人的蜂鳴器
- #define uint unsigned int
- #define uchar unsigned char
- sbit buzz = P0^4;
- sbit relay = P0^6;
- uchar disData[]={2,0,10,1,0,10,0,0};
- uchar times=0;
- uchar temperature;
- bit OneSecFlag=0;
- void main(void)
- {
- //消除蜂鳴器叫聲
- buzz=0;
- relay=0;
- ULN2003_Latch();
- Init_timer0();
- while(1)
- {
- if(OneSecFlag)
- {
- temperature=rd_temperature();
- disData[6]=temperature / 10;
- disData[7]=temperature % 10;
- OneSecFlag = 0;
- if(temperature<10||temperature>20)
- {
- buzz=1;
- relay=1;
- ULN2003_Latch();
- }
- else
- {
- buzz=0;
- relay=0;
- ULN2003_Latch();
- }
- }
- display(disData); //也可以在這里動態掃描
- }
- }
- void Timer0_isr(void) interrupt 1 using 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- times++;
- //中斷掃描數碼管顯示,也可以放在while(1)中
- if(times == 10)//0.5s
- {
- times=0;
- OneSecFlag = 1;
- }
- }
- 2.思考若要顯示小數點后面2位,數據該如何處理? 寫出數據處理部分程序片段
- DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xf7,0x7f};
- uchar disData[]={0,0,0,0,0,13,0,0};
-
- void main(void)
- {
- //消除蜂鳴器叫聲
- buzz=0;
- relay=0;
- ULN2003_Latch();
- Init_timer0();
- while(1)
- {
- display(disData);//中斷掃描數碼管顯示,也可以放在while(1)中
- if(OneSecFlag)
- {
- temperature=rd_temperature();
- disData[3]=temperature /1000;
- disData[4]=temperature %1000/100;
- disData[6]=temperature %100/10
- disData[7=temperature/10
- OneSecFlag = 0;
復制代碼
全部資料51hei下載地址:
|