【TB作品】msp430f5529單片機,dht22,煙霧傳感器

功能

//硬件:msp430f5529、dht22、LCD1602、蜂鳴器、煙霧傳感器、藍牙模塊。
//功能:讀取溫濕度、煙霧濃度顯示到屏幕;
//按鍵調節三個報警數值;
//溫度、濕度、煙霧濃度,任意一個大于報警數值就蜂鳴器報警;
//單片機將溫度、濕度、煙霧濃度,通過藍牙模塊,發送到電腦端顯示。
//電腦端也可以調節三個報警數值。

引腳


//PCF8574 LCD1602----MSP430F5529
//GND----------------GND
//VCC----------------3.3v
//SDA----------------P2.4
//SCL----------------P2.5//HC05 藍牙----------MSP430F5529
//GND----------------GND
//VCC----------------3.3v
//RX-----------------P3.3  T
//TX-----------------P3.4  R//PM2煙霧傳感器 0~3.3v電壓轉為ppm單位 20~20000ppm
//DHT22--------------MSP430F5529
//GND----------------GND
//VCC----------------3.3v
//DAT----------------P2.3//煙霧---------------MSP430F5529
//GND----------------GND
//VCC----------------3.3v
//A0-----------------P6.5//蜂鳴器-------------MSP430F5529
//GND----------------GND
//VCC----------------3.3v
//DAT----------------P1.6//按鍵----------------MSP430F5529
//KEY1----------------P1.2
//KEY2----------------P1.3
//KEY3----------------P1.4
//KEY4----------------P1.5
//GND-----------------GND//板子自己有的按鍵
//KEY5----------------P1.1
//KEY6----------------P2.1

部分程序


unsigned char get_key(void) //聲明一個函數,返回值類型為 unsigned char,函數名為 get_key,參數列表為空
{unsigned char key; //聲明一個名為 key 的無符號字符變量if ((P1IN & BIT2) == 0) //如果 P1IN 寄存器的第二位是 0,說明按鍵1被按下{delay_ms(10); //延時 10 毫秒,以確保讀取的值穩定if ((P1IN & BIT2) == 0) //再次檢測按鍵1是否被按下{key = 1; //將 key 設置為 1,表示按下了按鍵1while ((P1IN & BIT2) == 0)//等待按鍵1松開;}}else if ((P1IN & BIT3) == 0) //如果按鍵1未被按下,檢測按鍵2是否被按下{delay_ms(10); //同樣進行延時if ((P1IN & BIT3) == 0) //檢測按鍵2是否被按下{key = 2; //將 key 設置為 2,表示按下了按鍵2while ((P1IN & BIT3) == 0)//等待按鍵2松開;}}else if ((P1IN & BIT4) == 0){delay_ms(10);if ((P1IN & BIT4) == 0){key = 3;while ((P1IN & BIT4) == 0);}}else if ((P1IN & BIT5) == 0){delay_ms(10);if ((P1IN & BIT5) == 0){key = 4;while ((P1IN & BIT5) == 0);}}else if ((P1IN & BIT1) == 0){delay_ms(10);if ((P1IN & BIT1) == 0){key = 5;while ((P1IN & BIT1) == 0);}}else if ((P2IN & BIT1) == 0){delay_ms(10);if ((P2IN & BIT1) == 0){key = 6;while ((P2IN & BIT1) == 0);}}else{key = 0;}return key;
}u8 data[5];
u16 shidu, wendu, yanwu;
u16 shidu_baojing = 900, wendu_baojing = 400, yanwu_baojing = 10000;
u8 disp[20];
u8 count = 0;
u8 timecnt = 0;
u8 keyvalue = 0;void disp_line1(void) // 定義名為disp_line1的函數
{count = 0; // 初始化計數器disp[count++] = wendu % 1000 / 100 + '0'; // 將溫度百位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = wendu % 100 / 10 + '0'; // 將溫度十位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = 'C'; // 存入字符'C',表示攝氏度,計數器+1disp[count++] = ' '; // 存入空格字符,計數器+1disp[count++] = shidu % 1000 / 100 + '0'; // 將濕度百位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = shidu % 100 / 10 + '0'; // 將濕度十位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = '%'; // 存入字符'%',表示百分比符號,計數器+1disp[count++] = ' '; // 存入空格字符,計數器+1disp[count++] = yanwu % 100000 / 10000 + '0'; // 將煙霧萬位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = yanwu % 10000 / 1000 + '0'; // 將煙霧千位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = yanwu % 1000 / 100 + '0'; // 將煙霧百位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = yanwu % 100 / 10 + '0'; // 將煙霧十位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = yanwu % 10 + '0'; // 將煙霧個位數字轉換為字符存入顯示緩存數組,計數器+1disp[count++] = 'p'; // 存入字符'p',表示“ppm”(parts per million),計數器+1disp[count++] = 0; // 存入字符'\0',表示字符串結束,計數器+1LCD_write_str(0, 0, disp); // 在LCD屏幕第0行顯示disp數組中的內容
}void send_computer(void)
{count = 0;disp[count++] = wendu % 1000 / 100 + '0';disp[count++] = wendu % 100 / 10 + '0';disp[count++] = 'C';disp[count++] = ' ';disp[count++] = shidu % 1000 / 100 + '0';disp[count++] = shidu % 100 / 10 + '0';disp[count++] = '%';disp[count++] = ' ';disp[count++] = yanwu % 100000 / 10000 + '0';disp[count++] = yanwu % 10000 / 1000 + '0';disp[count++] = yanwu % 1000 / 100 + '0';disp[count++] = yanwu % 100 / 10 + '0';disp[count++] = yanwu % 10 + '0';disp[count++] = 'p';disp[count++] = '\r';disp[count++] = '\n';disp[count++] = 0;Print_Str(disp);
}void disp_line2(void)
{count = 0; //計數器清零//顯示濕度報警值的百位、十位disp[count++] = shidu_baojing % 1000 / 100 + '0';disp[count++] = shidu_baojing % 100 / 10 + '0';disp[count++] = 'C'; //顯示'C'disp[count++] = ' '; //顯示空格//顯示溫度報警值的百位、十位disp[count++] = wendu_baojing % 1000 / 100 + '0';disp[count++] = wendu_baojing % 100 / 10 + '0';disp[count++] = '%'; //顯示'%'disp[count++] = ' '; //顯示空格//顯示煙霧報警值的萬位、千位、百位、十位、個位disp[count++] = yanwu_baojing % 100000 / 10000 + '0';disp[count++] = yanwu_baojing % 10000 / 1000 + '0';disp[count++] = yanwu_baojing % 1000 / 100 + '0';disp[count++] = yanwu_baojing % 100 / 10 + '0';disp[count++] = yanwu_baojing % 10 + '0';disp[count++] = 'p'; //顯示'p'disp[count++] = 0; //末尾字符為0//在LCD的第1行第0列顯示字符串dispLCD_write_str(0, 1, disp);
}void deal_key(void)
{// 定義一個函數deal_key,沒有返回值,沒有參數if (keyvalue == 1){// 如果keyvalue的值為1shidu_baojing += 10;// 濕度報警值加10if (shidu_baojing > 900){// 如果濕度報警值大于900shidu_baojing = 900;// 把濕度報警值設為900}}else if (keyvalue == 2){// 否則,如果keyvalue的值為2shidu_baojing -= 10;// 濕度報警值減10if (shidu_baojing < 100){// 如果濕度報警值小于100shidu_baojing = 100;// 把濕度報警值設為100}}else if (keyvalue == 3){// 否則,如果keyvalue的值為3wendu_baojing += 10;// 溫度報警值加10if (wendu_baojing > 900){// 如果溫度報警值大于900wendu_baojing = 900;// 把溫度報警值設為900}}else if (keyvalue == 4){// 否則,如果keyvalue的值為4wendu_baojing -= 10;// 溫度報警值減10if (wendu_baojing < 100){// 如果溫度報警值小于100wendu_baojing = 100;// 把溫度報警值設為100}}else if (keyvalue == 5){// 否則,如果keyvalue的值為5yanwu_baojing += 100;// 煙霧報警值加100if (yanwu_baojing > 20000){// 如果煙霧報警值大于20000yanwu_baojing = 20000;// 把煙霧報警值設為20000}}else if (keyvalue == 6){// 否則,如果keyvalue的值為6yanwu_baojing -= 100;// 煙霧報警值減100if (yanwu_baojing < 200){// 如果煙霧報警值大于200yanwu_baojing = 200;// 把煙霧報警值設為200}}
}void contorl_beep(void) // 定義一個名為 contorl_beep 的函數
{if ((shidu > shidu_baojing) || (wendu > wendu_baojing) // 如果濕度、溫度或煙霧任意一個超過了警戒值|| (yanwu > yanwu_baojing)){P1OUT &= ~BIT6; // 將 P1OUT 寄存器的第 6 位設置為 0,表示開啟蜂鳴器}else // 如果濕度、溫度和煙霧都沒有超過警戒值{P1OUT |= BIT6; // 將 P1OUT 寄存器的第 6 位設置為 1,表示關閉開啟蜂鳴器}
}/* 煙霧濃度換算 */
static unsigned int  yw_ppm_count(unsigned int x1)
{float a =0 ,b = 0,c = 0,d = 0;float ax =0 ,bx = 0,cx = 0,dx = 0;float y;float x;x=x1*3.3/4096;a = x * x * x * x * x;b = x * x * x * x;c = x * x * x;d = x * x ;ax = 0.0001923 * a;bx = 0.006017 * b;cx = 0.07267 * c;dx = 0.425 * d;y = ax - bx + cx - dx + (1.267 * x) + 1.209;y = y * 1000;return (unsigned int)y;
}void main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // 停止看門狗定時器init_clock();                             // 初始化時鐘init_uart();                              // 初始化UART串口init_adc();                               // 初始化ADC模塊init_key();                               // 初始化按鍵init_beep();                              // 初始化蜂鳴器while (DHT22_Init() == 1)                 // 初始化DHT22溫濕度傳感器{delay_ms(100);                        // 延時100毫秒}delay_ms(1000);LCD_Init();                               // 初始化液晶屏disp_line2();                             // 在液晶屏上顯示第二行_EINT();                                  // 開啟總中斷while (1)                                 // 無限循環{delay_ms(10);                         // 延時10毫秒timecnt++;                            // 時間計數器加1if (timecnt > 200)                    // 如果時間計數器超過200{timecnt = 0;                      // 重置時間計數器DHT22_Read_Data(data);            // 讀取DHT22傳感器數據shidu = data[0];                  // 濕度數據shidu = (shidu << 8) + data[1];   // 拼接數據wendu = data[2];                  // 溫度數據wendu = (wendu << 8) + data[3];   // 拼接數據yanwu = get_adc();                // 獲取煙霧濃度值//0到4096轉為0到20000ppmyanwu = yw_ppm_count(yanwu);             // 將ADC值轉換為煙霧濃度值contorl_beep();                    // 控制蜂鳴器disp_line1();                      // 在液晶屏上顯示第一行disp_line2();                      // 在液晶屏上顯示第二行send_computer();}keyvalue = get_key();                 // 獲取按鍵值if (keyvalue)                         // 如果有按鍵按下{deal_key();                       // 處理按鍵disp_line2();                     // 在液晶屏上顯示第二行}}
}unsigned char revchar = 0;                      // 定義一個無符號字符變量,初始值為0,用于保存接收到的字符
unsigned char revchar_openflag = 0;       // 定義一個無符號字符變量,初始值為0,用于標志接收到的字符是否為有效數據
unsigned char revchar_cnt = 0;               // 定義一個無符號字符變量,初始值為0,用于計數接收到的有效數據個數
unsigned char revchar_buffer[20];              // 定義一個無符號字符數組,長度為20,用于存儲接收到的有效數據#pragma vector=USCI_A0_VECTOR                   // 定義中斷函數,當 USCI_A0_VECTOR 中斷發生時,執行以下函數
__interrupt void USCI_A0_ISR(void)
{switch (__even_in_range(UCA0IV, 4))// 獲取 USCI_A0_VECTOR 中斷的狀態{case 0:                                     // Vector 0 - no interrupt,無中斷狀態break;case 2:                                     // Vector 2 - RXIFG,接收到數據的中斷狀態revchar = UCA0RXBUF;            // 讀取 USCI_A0_VECTOR 的接收緩沖區數據到變量 revcharif (revchar_openflag)                   // 如果接收到的字符是有效數據{//S889912345                        // 檢查接收到的數據是否符合特定的格式,如S889912345if ((revchar >= '0') && (revchar <= '9'))  // 如果接收到的數據是數字字符{revchar_buffer[revchar_cnt] = revchar - '0'; // 把接收到的數字字符轉化為對應的數字存入 revchar_buffer 數組中revchar_cnt++;                              // 計數器加1if (revchar_cnt >= 9)                     // 如果接收到的數字字符數量達到特定的數量{shidu_baojing = revchar_buffer[0] * 100+ revchar_buffer[1] * 10;  // 計算濕度報警值wendu_baojing = revchar_buffer[2] * 100+ revchar_buffer[3] * 10;  // 計算溫度報警值yanwu_baojing = revchar_buffer[4] * 10000+ revchar_buffer[5] * 1000 + revchar_buffer[6] * 100+ revchar_buffer[7] * 10 + revchar_buffer[8]; // 計算煙霧報警值revchar_openflag = 0;               // 清除接收標志revchar_cnt = 0;                    // 清除計數器}}else                                    // 如果接收到的字符不是數字字符{revchar_openflag = 0;               // 清除接收標志revchar_cnt = 0;                    // 清除計數器}}if (revchar == 'S'){revchar_openflag = 1;revchar_cnt = 0;}break;case 4:break;                             // Vector 4 - TXIFGdefault:break;}
}

全部程序

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21496.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何編輯pdf文件內容?編輯技巧大揭秘,秒變辦公達人!

如何編輯pdf文件內容&#xff1f;在數字化辦公日益普及的今天&#xff0c;PDF文件因其跨平臺、格式穩定的特點&#xff0c;成為我們日常工作和學習中不可或缺的一部分。然而&#xff0c;PDF文件的編輯卻常常令人頭疼&#xff0c;許多人面對需要修改內容的PDF文件時感到無從下手…

【RPG Maker MV 仿新仙劍 戰斗場景UI (九)】

RPG Maker MV 仿新仙劍 戰斗場景UI 九 前言角色戰斗精靈精靈圖設置攻擊 戰斗背景圖 前言 前段天研究并完成了主角人物行走圖部分的開發&#xff0c;完成了對應的8方向行走&#xff0c;及精靈的展示。現在開始重新回到戰斗場景的開發中&#xff0c;回顧下&#xff0c;已完成功能…

如何手動批準內核擴展 Tuxera NTFS for mac內核擴展需要批準 內核擴展怎么打開

在了解如何手動批準內核擴展之前&#xff0c;我們應該先了解什么叫做內核擴展。內核擴展又被稱為KEXT&#xff0c;通過它可以實現macOS系統與軟件組件之間的交互&#xff0c;例如磁盤管理、任務管理和內存管理等等。 kext 是內核擴展&#xff08;Kernel Extension&#xff09;…

【漏洞復現】海康威視綜合安防管理平臺 orgManage/v1/orgs/download 任意文件讀取漏洞復現

0x01 產品簡介 海康威視綜合安防管理平臺是一套“集成化”、“智能化”的平臺,通過接入視頻監控、一卡通、停車場、報警檢測等系統的設備。海康威視集成化綜合管理軟件平臺,可以對接入的視頻監控點集中管理,實現統一部署、統一配置、統一管理和統一調度。 0x02 漏洞概述 海康…

C語言:學生成績管理系統(含源代碼)

一.功能 二.源代碼 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…

滲透測試報告生成工具

目錄 1.前言 1.1 滲透測試報告是什么? 1.2 滲透測試報告的編寫需要考慮以下幾點&#xff1a; 1.3 一份優秀的滲透測試報告應該具備以下特點&#xff1a; 1.4 在編寫滲透測試報告之前&#xff0c;需要進行一些準備工作&#xff1a; 1.5 滲透測試報告一般包括以下部分&…

作為表達式調用時,無法解析類修飾器的簽名。vue3+ts+vite,使用裝飾器時報錯

作為表達式調用時&#xff0c;無法解析類修飾器的簽名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 頁面也無法打開 解決方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…

代碼隨想錄算法訓練營Day55 | 583. 兩個字符串的刪除操作 72. 編輯距離 編輯距離總結篇

代碼隨想錄算法訓練營Day55 | 583. 兩個字符串的刪除操作 72. 編輯距離 編輯距離總結篇 LeetCode 583. 兩個字符串的刪除操作 題目鏈接&#xff1a;LeetCode 583. 兩個字符串的刪除操作 思路&#xff1a; 分別刪除 class Solution { public:int minDistance(string word1, …

SEW交頻器 MDX61801110-5A3-4-0T可議價

SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T可議價 SEW交頻器 MDX61801110-5A3-4-0T參數表 SEW交頻器 MDX61801110-5A3-4-0T中文說明書 SEW交頻器 MDX61B01110-5A3-4-0T 規格:MOVIDRIVE MDX61B0110-5A3…

【MySQL】探索 MySQL 中的 NVL:使用 IFNULL 和 COALESCE 實現

緣分讓我們相遇亂世以外 命運卻要我們危難中相愛 也許未來遙遠在光年之外 我愿守候未知里為你等待 我沒想到為了你我能瘋狂到 山崩海嘯沒有你根本不想逃 我的大腦為了你已經瘋狂到 脈搏心跳沒有你根本不重要 &#x1f3b5; 鄧紫棋《光年之外》 什么是 NVL…

PyTorch使用tensorboard的SummaryWriter報錯

PyTorch使用tensorboard可以顯示網絡運行情況,但偶爾使用SummaryWriter時遇到Segmentation fault錯誤。 利用python3的faulthandler,可定位到出錯的代碼行,具體操作有兩種方式如下: (1) 在代碼中寫入faulthandler import faulthandler # 在import之后直接添加以下啟用代碼…

探索數據結構:便捷的雙向鏈表

&#x1f511;&#x1f511;博客主頁&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列專欄&#xff1a;漸入佳境之數據結構與算法 歡迎來到泊舟小課堂 &#x1f618;博客制作不易歡迎各位&#x1f44d;點贊?收藏?關注 ?? 前言 前面我們學習了單鏈表&#xff0c;它解…

k8s常用命令(持續更新中)

1. 常用命令 # 查看命名空間下的所有pod kubectl get pod -n 命名空間 # 查看某命名空間下某個pod的日志 kubectl logs -f -n 命名空間 pod名# 查看某命名空間下某pod的詳細信息 kubectl describe pod pod名 -n 命名空間# 查看所有命名空間下pod kubectl pods --all-namespac…

等保測評核心對象概覽及實施要點

等保測評的對象主要包括以下幾個方面&#xff1a; 1. 信息系統&#xff1a;由計算機硬件、網絡和通信設備、計算機軟件、信息資源、信息用戶和規章制度組成的以處理信息流為目的的人機一體化系統。常見的信息系統包括辦公自動化系統(OA)、客戶關系管理系統、進銷存管理系統等。…

ICLR24大模型提示(3/11) | PromptAgent:利用語言模型進行戰略規劃,實現專家級提示優化

【摘要】高效的、針對特定任務的提示通常由專家精心設計&#xff0c;以整合詳細的說明和領域見解&#xff0c;這些見解基于對大型語言模型 (LLM) 的本能和目標任務的復雜性的深刻理解。然而&#xff0c;自動生成這種專家級提示仍然難以實現。現有的提示優化方法往往忽視領域知識…

20240603每日AI------------項目引入Spring Cloud Alibaba AI (二)

項目源碼解析 前端代碼&#xff1a; <div class"container"><h1>Spring Cloud Alibaba AI Example</h1><form id"form"><label for"message">User Message&#xff1a;</label><input type"text&q…

大模型PEFT(一)之推理實踐學習記錄

1. 簡介 多種模型: LLaMA、Mistral、Mixtral-MoE、Qwen、Yi、Gemmha、Baichuan、ChatGLM、Phi等等。集成方法:(增量)預訓練、指令監督微調、獎勵模型訓練、PPO訓練和DPO訓練。多種精度:32比特全參數微調、16比特凍結微調、16比特LORA微調和基于AQLM/AWQ/GPTQ/LLM.int8 的2/4/8…

一篇文章掌握Java的80%:面向對象與并發編程

Java作為一種廣泛使用的計算機編程語言&#xff0c;其強大之處在于其面向對象的特性和對并發編程的良好支持。作為一名程序員&#xff0c;我深知掌握Java的面向對象概念、集合框架、多線程與并發編程&#xff0c;以及JVM基礎對于編寫高效、可維護的代碼至關重要。本文將引導你快…

操作字符串獲取文件名字(包含類型)

記錄一種操作字符串獲取文件名字的操作方式&#xff0c;方便后期的使用。示例&#xff1a; 輸入&#xff1a;"D:/code/Test/Test.txt" 輸出&#xff1a;"Test.txt" 設計思路&#xff1a; 首先查找路徑中最后一個”/“&#xff0c;然后再通過字符串截取的…

湖南源點調研 為什么中小企業產品上市前一定要做市場調研?

本文由湖南長沙&#xff08;產品前測&#xff09;源點調研咨詢編輯發布 可能有很多企業主會表示&#xff0c;市場調研&#xff0c;產品調研&#xff0c;不都是大公司、大品牌、上市公司才會有的流程嗎&#xff0c;像我們這種小企業、小品牌、小廠家沒有必要去那么做&#xff0…