這是我去年單片機設計的溫度報警器,proteus仿真過,完美成功請看介紹
51hei.gif (117.83 KB, 下載次數: 26)
下載附件
2021-11-29 20:53 上傳
1、初始化時序圖 圖3 初始化時序圖 (1)首先將數據線置高電平1。 (2)然后進行延時(盡可能短,沒有嚴格要求)。 (3)然后把數據線拉倒低電平0。 (4)再延時750μs (時間可以在480μs -960μs中選) (5)再將數據線拉高到電平1。 (6)延時等待。如果初始化成功則在15-60μs內產生一個由DS18B20返回的低電平0。這個可以確定它的存在。 (7)假設是單片機的CPU讀到數據線上的低電平后,還要進行延時,那么時間從發出高電平算起不能少于480μs。 (8)最后將數據線再次拉到低電平后結束。 2、DS18B20寫數據 (1)首先將數據線先置低電平0。 (2)然后延時確定的時間為15μs。 (3)再按從低位到高位的順序來發送數據。 (4)其中延時時間為45μs。 (5)再把數據線拉倒高電平1。 (6)然后再重復前面五步,直到發送完整一個字節。 (7)最后將數據線拉高到1。 3、DS18B20讀數據 (1) 首先將數據線拉高到1。 (2) 然后延時2μs。 (3) 再將數據線拉低到0。 (4) 然后延時5μs。(時間大于1μs) (5) 再將數據線拉高到1。 (6) 延時4μs。 (7) 讀數據線狀態得到一個狀態位,并進行數據處理。 (8) 延時30μs。 (9) 重復以上所有步驟,直到讀取完一個字節。 3.3 LCD1602液晶顯示器3.3.1功能 1602字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線15腳的VCC和16腳的GND,本次研究采用16引腳的LCD。專門用來顯示字母、數字、符號等的點陣型液晶模塊,通過驅動模塊與顯示器的有效連接,能直觀的顯示出程序中要求的內容。 3.3.2特點 顯示質量高:由于液晶顯示器每一個點在收到信號后就一直保持那種色彩和亮度,恒定發光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點。因此,液晶顯示器畫質高且不會閃爍。 數字式接口:液晶顯示器都是數字式的,和單片機系統的接口更加簡單可靠,操作更加方便。 體積小、重量輕:液晶顯示器通過顯示屏上的電極控制液晶分子狀態來達到顯示的目的,在重量上比相同顯示面積的傳統顯示器要輕得多。 功耗低:相對而言,液晶顯示器的功耗主要消耗在其內部的電極和驅動IC上,因而耗電量比其它顯示器要少得多。 3.3.3引腳 本次實驗采用16引腳LCD1602液晶顯示器 引腳功能: 第1腳:VSS為地電源。 第2腳:VDD接5V正電源。 第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。 第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。即電平=0為輸入指令;電平=1為輸入數據。 第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。 第6腳:E端為使能端,1時讀取信息,當E端由高電平跳變成低電平時,即當1→0(下降沿)液晶模塊執行命令。 7~14腳:D0~D7為8位雙向數據線。7號引腳為最低位,14號引腳為最高位。 第15腳:背光源正極。 第16腳:背光源負極。
在課題設計的溫度控制系統設計中,控制核心是STC89C52單片機,該單片 機為51系列增強型8位單片機,它有32個I/O口,片內含4K FLASH工藝的序存儲器,便于用電的方式瞬間擦除和改寫,而且價格便宜,其外部晶振為12M一個指令周期為1μs。使用該單片機完全可以完成設計任務,其最小系統主要包括:復位電路、震蕩電路以及存儲器選擇模式,報警時界面如圖16所示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真.png (123.81 KB, 下載次數: 37)
下載附件
2019-9-25 19:18 上傳
單片機源程序如下:
- #include <REGX51.H>
- #include <intrins.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit beep=P1^5;
- sbit Led1=P2^2; //高溫閃爍
- sbit Led2=P2^3; //低溫閃爍
- u8 code t0[]="Temperature is:";
- void TempDisplayTest(void);
- void delay500us(void);
- void BuzzerOnOff(void);
- void Lcd1602Init(void);
- void Lcd1602SetCursor(u8 x,u8 y);
- void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr);
- void Lcd1602ShowTempU16(u8 x, u8 y, u16 temp);
- void Ds18b20TempConvertCmd(void);
- void Ds18b20TempReadCmd(void);
- u8 Ds18b20ReadByte(void);
- void main(void)
- {
- Lcd1602Init();
- while (1)
- {
- TempDisplayTest();
- }
- }
- void TempDisplayTest(void)
- {
- u16 tt, i; // 控制蜂鳴器報警
- u16 temp = 0; // 用來暫存12位的AD值
- u8 tmh = 0, tml = 0; // 用來暫存2個8位的AD值
- u16 tDisp = 0; // 用來存儲乘以100倍后的溫度值
- double t = 0; // 用來存儲轉換后以攝氏度為單位的溫度值
- Ds18b20TempConvertCmd(); // 先寫入轉換命令
- Ds18b20TempReadCmd(); // 然后等待轉換完后發送讀取溫度命令
- tml = Ds18b20ReadByte(); // 讀取溫度值共16位,先讀低字節
- tmh = Ds18b20ReadByte(); // 再讀高字節
- temp = tml | (tmh << 8); // 默認是12位分辨率,前面4個S位是符號位
-
- t = temp * 0.0625;
- tDisp = (u16)(t * 100); // 為方便顯示將溫度值乘以100后強轉為u16
- tt=tDisp/100;
-
- Lcd1602ShowStr(0, 0, t0);
- Lcd1602ShowTempU16(0, 1, tDisp); // 調用LCD1602的顯示函數來顯示乘以100倍后的溫度值
- if(tt>22)
- { for(i=500;i>0;i--)
- {
- BuzzerOnOff();
- Led1=0;Led2=1;
- delay500us();
- Led1=1;Led2=1;
- }
- }
- else if(tt<18)
- { for(i=500;i>0;i--)
- {
- BuzzerOnOff();
- Led1=1;Led2=0;
- delay500us();
- Led1=1;Led2=1;
- }
- }
- else {Led1=1;Led2=1;beep=1;}
- }
- void BuzzerOnOff(void)
- {
- beep = 1;
- delay500us();
- beep = 0;
- delay500us();
- }
- void delay500us(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=71;b>0;b--)
- for(a=2;a>0;a--);
- }
復制代碼
Proteus7.5版本的仿真圖下載:
溫度測量.zip
(109.04 KB, 下載次數: 152)
2019-9-24 15:57 上傳
點擊文件名下載附件
溫度報警器 下載積分: 黑幣 -5
|