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