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