智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)
單片機(jī)課程設(shè)計(jì),C51+DS18B20溫度傳感器+LM016L顯示屏
重點(diǎn)在于兩個(gè)外設(shè)的時(shí)序控制
模塊化的設(shè)計(jì)結(jié)構(gòu)清晰明了
一、題目
溫度測(cè)量系統(tǒng)的設(shè)計(jì)
二、要求
1.溫度測(cè)量范圍:-55℃ ~ 125℃,測(cè)量精度 ±0.1℃
2.DS18B20作溫度傳感器,LCD1602作顯示控制器
3.LCD1602顯示器顯示測(cè)量的溫度值(一位符號(hào),三位整數(shù),一位小數(shù))
顯示分兩行,如:
temperature is:
056.3℃
4.用proteus畫(huà)出電器原理圖并能仿真
5.程序清單
6.書(shū)寫(xiě)設(shè)計(jì)報(bào)告
三、使用軟件及仿真環(huán)境
Keil uVision5
Proteus7.8
四、課程設(shè)計(jì)步驟
1.畫(huà)出電路圖
首先根據(jù)實(shí)驗(yàn)需求在proteus仿真軟件中畫(huà)出電路
需要選取的元器件有:
AT89C51(mcu) DS18B20(溫度傳感器)
LM016L(溫度傳感器) RES(上拉電阻)
電路圖說(shuō)明:
針對(duì)液晶顯示器LM016L,D0D7引腳連接到C51的P1.0P1.7引腳,同時(shí)選取51單片機(jī)的P3.5、P3.6 、P3.7引腳作為L(zhǎng)CD的控制輸入端
針對(duì)DS18B20溫度傳感器,選取P2.0引腳作為數(shù)據(jù)傳送、數(shù)據(jù)接收引腳。同時(shí)使用4.7K的上拉電阻連接P2.0
電路圖連接完畢后,開(kāi)始構(gòu)建keil工程
2.keil工程構(gòu)建
項(xiàng)目的整體構(gòu)建使用Keil5進(jìn)行完成,由于keil5主要編寫(xiě)stm32程序,對(duì)于c51程序需要導(dǎo)入相應(yīng)的pack才能進(jìn)行編寫(xiě)。
(1)安裝C51 pack包
按照網(wǎng)上的教程進(jìn)行操作較為簡(jiǎn)單
(2)構(gòu)建項(xiàng)目結(jié)構(gòu)
打開(kāi)keil5工程,可以看到左側(cè)的工作區(qū)脈絡(luò)
Source Group 1為系統(tǒng)文件夾,文件夾中只存放main文件和STARTUP.A51啟動(dòng)文件
Bsp文件夾為自己創(chuàng)建的文件夾,自己寫(xiě)的.c文件和頭文件都存放在這里,可以看到文件夾中包含了
delay.c:有關(guān)延遲的函數(shù)
lcd.c:LM016L的相關(guān)顯示函數(shù)
temperature.c:DS18B20傳感器相關(guān)函數(shù)
通過(guò)bsp_system.h頭文件將bsp文件夾中的內(nèi)容和Soure Group 1文件夾中的內(nèi)容鏈接起來(lái),保證函數(shù)能夠進(jìn)行調(diào)用。同時(shí)通過(guò)
#ifndef
#define
#endif
這三條預(yù)處理命令保證bsp_system.h頭文件只會(huì)被編譯一次,防止重復(fù)編譯的問(wèn)題出現(xiàn)。(其它頭文件也添加這三段代碼,防止重復(fù)編譯)
可以看到在此頭文件中,對(duì)LCD與溫度傳感器的控制引腳做了相對(duì)應(yīng)的定義。如果硬件需要改變連接引腳,能夠較快的進(jìn)行程序的移植。
(3)功能函數(shù)
這一小節(jié)著重介紹各個(gè)C函數(shù)文件中的函數(shù)含義,以及核心代碼。
1.delay.c
delay.c
#include "delay.h"void delay1ms(uint timer) {unsigned char a, b, c;while (timer--){for (c = 1; c > 0; c--)for (b = 142; b > 0; b--)for (a = 2; a > 0; a--);} }void Delay_DS18B20(int num) {while (num--); }delay.h
#ifndef _DElAY_H #define _DELAY_H#include "bsp_system.h" #include "main.h"void delay1ms(uint timer); void Delay_DS18B20(int num);#endifvoid delay1ms(uint timer) 延遲1ms通過(guò)傳入的timer參數(shù)進(jìn)行延遲時(shí)間的控制
void Delay_DS18B20(int num) 微妙級(jí)延遲,由于DS18B20溫度傳感器對(duì)時(shí)序要求非常嚴(yán)格,經(jīng)過(guò)多次函數(shù)編寫(xiě)才設(shè)計(jì)出這個(gè)us級(jí)的延遲函數(shù)。主要針對(duì)溫度傳感器的時(shí)序進(jìn)行計(jì)時(shí),控制傳感器初始化、通信等過(guò)程。
2.lcd.c
LM016L液晶模塊采用HD44780控制器。HD44780具有簡(jiǎn)單而功能較強(qiáng)的指令集,可以實(shí)現(xiàn)字符移動(dòng)、閃爍等功能。LM016L與單片機(jī)MCU通訊可以采用8位或者4位并行傳輸兩種方式。
要想控制LCD屏幕顯示,需要通過(guò)對(duì)HD44780寫(xiě)入控制指令,HD44780產(chǎn)生顯示驅(qū)動(dòng)信號(hào)來(lái)驅(qū)動(dòng)LM016L。
根據(jù)以上的信息描述,我們參照LM016L的操作手冊(cè)進(jìn)行程序的編寫(xiě)
lcd.c
lcd.h
#ifndef _LCD_H #define _LCD_H#include "bsp_system.h"extern unsigned char code dis1[]; extern unsigned char code dis2[];bit LCD_Buzy(); void LCD_WriteByte(unsigned char cmd); void LCD_Pos(unsigned char pos); void LCD_Display(unsigned char dat); void LCD_Init();#endif首先是 void LCD_Init() 對(duì)LCD進(jìn)行初始化,需要向LCD中寫(xiě)入數(shù)據(jù),于是引入
void LCD_WriteByte(unsigned char cmd) 函數(shù)對(duì)數(shù)據(jù)進(jìn)行寫(xiě)入操作,通過(guò)LCD的操作時(shí)序圖進(jìn)行編寫(xiě)
在程序的寫(xiě)入過(guò)程中還需對(duì)進(jìn)行判忙操作,也就是 bit LCD_Buzy() 函數(shù),當(dāng)LCD忙碌時(shí),也就是result的值為1時(shí),不能對(duì)LCD進(jìn)行操作;result = 0 可以進(jìn)行讀寫(xiě)
最后是LCD顯示操作,按照上面的函數(shù)編寫(xiě),LCD的初始化已經(jīng)完成,需要讓LCD顯示出我們想要展示的內(nèi)容。
在顯示字符時(shí)需要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,同時(shí)在初始化的過(guò)程中先設(shè)置其顯示模式。
在顯示字符時(shí),LCD顯示模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,每個(gè)字符都有一個(gè)固定的該罵,顯示時(shí)模塊把41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字符。
通過(guò)以上的描述可以知道,只需要知道LCD中字符代碼與字符圖形之間的對(duì)應(yīng)關(guān)系,就能夠讓LCD顯示對(duì)應(yīng)的字符。
由此,編寫(xiě)出 void LCD_Display(unsigned char dat) 函數(shù),對(duì)函數(shù)傳入類(lèi)型為 unsigned char類(lèi)型的dat參數(shù),反映了LCD顯示的字符信息。每次顯示一個(gè)字符,光標(biāo)向后移位,然后顯示下一個(gè)字符。
3.temperature.c
DS18B20是常用的數(shù)字溫度傳感器,具有體積小,硬件開(kāi)銷(xiāo)低,抗干擾性能力強(qiáng),精度高的特點(diǎn)。
DS18B20數(shù)字溫度計(jì)提供9位溫度讀數(shù)。信息經(jīng)過(guò)單線接口送入DS118B20或從DS18B20送出,因此從中央處理器到DS18B20僅需要一條線。讀寫(xiě)和完成溫度變換所需的電源可以由數(shù)據(jù)本身提供,而不需要外部電源。
文件中描述了DS18B20的相關(guān)函數(shù),包括溫度傳感器的初始化、讀字符、寫(xiě)字符、讀取溫度、字符轉(zhuǎn)換函數(shù)、溫度顯示函數(shù),其中讀取溫度函數(shù)和溫度顯示函數(shù)為核心函數(shù)。
在編寫(xiě)函數(shù)時(shí),特別注意延遲函數(shù)的準(zhǔn)確性,DS18B20對(duì)時(shí)序要求極其嚴(yán)格,延遲函數(shù)不準(zhǔn)確,傳感器將不能進(jìn)行初始化和讀寫(xiě)操作。
同LCD顯示一樣,首先需要對(duì)溫度傳感器進(jìn)行初始化。
通過(guò) uchar DS18B20_Init(void) 函數(shù)對(duì)傳感器進(jìn)行初始化操作,主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?#xff0c;并在隨后的480微秒時(shí)間內(nèi)對(duì)總線進(jìn)行檢測(cè),如果有低電平出現(xiàn)說(shuō)明總線上有器件已做出應(yīng)答。若無(wú)低電平出現(xiàn)一直都是高電平說(shuō)明總線上無(wú)器件應(yīng)答。
在調(diào)試傳感器的過(guò)程中,可以通過(guò)temp變量承載DS18B20初始化函數(shù)的返回值,并通過(guò)LCD進(jìn)行顯示,便于我們進(jìn)行調(diào)試。
temperature.c
temperature.h
#ifndef _TEMPERATURE_H #define _TEMPERATURE_H#include "bsp_system.h"uchar change(int a); uchar DS18B20_Init(void); unsigned char DS18B20_ReadChar(void); void DS18B20_WriteChar(unsigned char dat); int DS18B20_ReadTemperature(void); void Temp_Display(int temp);#endif初始化成功后,向溫度傳感器寫(xiě)入?yún)?shù)控制,即向單片機(jī)發(fā)送一條ROM指令,并發(fā)送存儲(chǔ)器指令。
對(duì)于ROM的操作部分可以跳過(guò),所以我們對(duì)傳感器寫(xiě)入跳過(guò)ROM的操作指令(CCH)。然后對(duì)傳感器寫(xiě)入轉(zhuǎn)換溫度的操作命令,讓DS18B20完成專(zhuān)函的操作。在寫(xiě)命令時(shí),要低字節(jié)先寫(xiě)。
下面要讀取溫度數(shù)據(jù),首先主機(jī)復(fù)位,跳過(guò)ROM操作,讀取RAM命令。同樣,讀取數(shù)據(jù)也是低位在前。
經(jīng)過(guò)以上的時(shí)序分析,將讀取溫度函數(shù)整合起來(lái)。
此函數(shù)中,使用a,b兩個(gè)變量值承載相應(yīng)溫度值的低八位和高八位。通過(guò)判斷語(yǔ)句對(duì)正數(shù)值和負(fù)數(shù)值加以區(qū)分。
針對(duì)我們?cè)O(shè)置的傳感器測(cè)量精度作相應(yīng)的變換返回類(lèi)型為 int 的溫度值。
讀取出溫度后,自然要將溫度顯示出來(lái),因此編寫(xiě)了
void Temp_Display(int temp) 函數(shù)
由 int DS18B20_ReadTemperature(void) 讀取溫度函數(shù)傳遞的值,是包含小數(shù)位在內(nèi)的整數(shù),需要對(duì)數(shù)據(jù)作一定的處理按位顯示在LCD屏幕上。
4.main.c
當(dāng)我們按照上面的模塊化的設(shè)計(jì)方式,寫(xiě)出了硬件相關(guān)的函數(shù)后,main函數(shù)中的內(nèi)容就變得十分簡(jiǎn)單。
首先通過(guò) LCD_Init() 對(duì)液晶顯示器進(jìn)行初始化操作,然后調(diào)用DS18B20_Init(); 函數(shù)對(duì)溫度傳感器進(jìn)行初始化,用flag變量標(biāo)記傳感器是否初始化成功。
然后調(diào)用 DS18B20_ReadTemperature(); 函數(shù)讓溫度傳感器讀取溫度信息,并將溫度儲(chǔ)存在temp中。隨后調(diào)用 Temp_Display(temp); 將溫度數(shù)值顯示出來(lái)。
最后通過(guò)延遲函數(shù)對(duì)系統(tǒng)的刷新頻率作一定的控制。
main.c
main.h
#ifndef _MAIN_H #define _MAIN_H#define uint unsigned int #define uchar unsigned char#endifbsp_system.h
#ifndef _BSP_SYSTEM_H #define _BSP_SYSTEM_H#include <stdio.h> #include <reg51.h> #include <intrins.h> #include "delay.h" #include "main.h" #include "lcd.h" #include "temperature.h"//ê?è?òy???¨ò? sbit rs = P3 ^ 5; sbit rw = P3 ^ 6; sbit ep = P3 ^ 7;//???è′??D?÷òy???¨ò? sbit DQ = P2 ^ 0;//ê?è?×?·?′??¨ò? extern unsigned char code dis1[]; extern unsigned char code dis2[]; //extern unsigned char temperature[7];#endif五、效果截圖
(如果程序有什么缺失的地方留言一下~)
總結(jié)
以上是生活随笔為你收集整理的智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上周刚号召加班,这周立马双休,董明珠把互
- 下一篇: 基于java的学生宿舍公寓管理系统