日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)

發布時間:2023/12/20 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智能温度系统(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);#endif

void 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

#include "lcd.h"unsigned char code dis1[] = {"temperature is :"}; //unsigned char code dis2[] = {"021.8 C"};//?D??LCDê?·??|?μ bit LCD_Buzy() {bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P1 & 0x80);ep = 0;return result; }void LCD_WriteByte(unsigned char cmd) {while (LCD_Buzy());rs = 0;rw = 0;ep = 0;_nop_();_nop_();P1 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0; }void LCD_Pos(unsigned char pos) {LCD_WriteByte(pos | 0x80); }void LCD_Display(unsigned char dat) {while (LCD_Buzy());rs = 1;rw = 0;ep = 0;P1 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0; }void LCD_Init() {LCD_WriteByte(0x38);delay1ms(1);LCD_WriteByte(0x0c);delay1ms(1);LCD_WriteByte(0x06);delay1ms(1);LCD_WriteByte(0x01);delay1ms(1); }

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

#include "temperature.h"//×?·?×a??oˉêy uchar change(int a) {uchar b;if (a == 0)b = '0';if (a == 1)b = '1';if (a == 2)b = '2';if (a == 3)b = '3';if (a == 4)b = '4';if (a == 5)b = '5';if (a == 6)b = '6';if (a == 7)b = '7';if (a == 8)b = '8';if (a == 9)b = '9';return b; }//DS18B203?ê??ˉoˉêy uchar DS18B20_Init(void) {unsigned char x = 0;DQ = 1;Delay_DS18B20(8);DQ = 0;Delay_DS18B20(80);DQ = 1;Delay_DS18B20(14);x = DQ;Delay_DS18B20(20);return x; }unsigned char DS18B20_ReadChar(void) {unsigned char i = 0;unsigned char dat = 0;for (i = 8; i > 0; i--){DQ = 0;dat >>= 1;DQ = 1;if (DQ)dat |= 0x80;Delay_DS18B20(4);}return dat; }void DS18B20_WriteChar(unsigned char dat) {unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat & 0x01;Delay_DS18B20(5);DQ = 1;dat >>= 1;} }//?áè????è int DS18B20_ReadTemperature(void) {unsigned char a = 0;unsigned char b = 0;int t = 0;float tt = 0;DS18B20_Init();DS18B20_WriteChar(0xCC);DS18B20_WriteChar(0x44);DS18B20_Init();DS18B20_WriteChar(0xCC);DS18B20_WriteChar(0xBE);//μú°?????°???a = DS18B20_ReadChar();b = DS18B20_ReadChar();t = b;t <<= 8;t = t | a;//?yêy?¢?oêyμ?êy?μ′|àíif (t > 63488){tt = ((~t) + 1) * 0.0625;t = tt * 10 + 0.5;return (-t);}else{tt = t * 0.0625;t = tt * 10 + 0.5;return (t);} }//???è??ê?oˉêy void Temp_Display(int temp) {//???èμ?°ù???¢ê????¢?????¢D?êy??£?abs×÷?a?D??±?á?2?ó?êy?μ′|àíint temp100, temp10, temp1, temp01, abs;uchar i;uchar local; unsigned char temperature[7];//??ê?ó¢?? temperature£oLCD_Pos(0x01);i = 0;while (dis1[i] != '\0'){LCD_Display(dis1[i]);i++;}//?yêy???èoí?oêy???èμ?·??a??ê?if (temp < 0){temp = (~temp) + 1 + 1;abs = temp / 10;temp100 = abs / 100; temp10 = (abs - temp100 * 100) / 10; temp1 = abs % 10; temp01 = temp % 10; temperature[0] = '-';temperature[1] = change(temp10);temperature[2] = change(temp1);temperature[3] = '.';temperature[4] = change(temp01);temperature[5] = ' ';temperature[6] = 'C';local = 0x41;i = 0;//lcd_wcmd(0x0d);while (i < 7){LCD_Pos(local);local++;LCD_Display(temperature[i]);i++;}}//?yêy???èelse{abs = temp / 10;temp100 = abs / 100; temp10 = (abs - temp100 * 100) / 10; temp1 = abs % 10; temp01 = temp % 10; temperature[0] = change(temp100);temperature[1] = change(temp10);temperature[2] = change(temp1);temperature[3] = '.';temperature[4] = change(temp01);temperature[5] = ' ';temperature[6] = 'C';local = 0x41;i = 0;//lcd_wcmd(0x0d);while (i < 7){LCD_Pos(local);local++;LCD_Display(temperature[i]);i++;}} }

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

#include <reg51.h> #include "main.h" #include "bsp_system.h"void main() {//uchar i;uchar flag;int temp;while (1){//LCD3?ê??ˉ?¢ds18b203?ê??ˉ?¢?áè????è??ê????èLCD_Init();flag = DS18B20_Init();temp = DS18B20_ReadTemperature();Temp_Display(temp);//ò??¨μ??ó3ù???è??ê??ü?è?¨delay1ms(750);} }

main.h

#ifndef _MAIN_H #define _MAIN_H#define uint unsigned int #define uchar unsigned char#endif

bsp_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显示屏)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。