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