久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于stm32的溫度傳感警示器 [打印本頁]

作者: yaoxfahu    時間: 2020-4-14 21:33
標題: 基于stm32的溫度傳感警示器
一、硬件管理
1、STM32開發板簡介··························· 3
2、DS1820數字溫度計···························3
3、3.5寸液晶LCD顯示屏·························4
4、硬件整體實物圖···························5
二、軟件方案
1、設計思路····································5
2、軟件流程圖··································5
  3、軟件代碼實現·································6
       (1)主程序實現····························6
       (2)溫度傳感器子程序·························9
三、工程訓練小結·································12
一、硬件管理
1、STM32開發板簡介
STM32系列單片機是意法半導體集團生產的一種基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核。體現了現代單片機為控制器發展的新趨勢,目前深受用戶歡迎,正在逐漸成為單片機世界的新潮流。從STM32系列單片機的問世到快速普及,
并為業界廣為采用,最主要的原因是它具有完整的單片機系列芯片,可以讓使用者根據不同的需求,選擇最合適的單片機芯片。
STM32,有非常豐富的外設與內設資源,一般單片機內存相對比較小,沒辦法移入大量程序,而STM32集成了32512KB的內存和,6~64KB的靜態存儲器,可以放足夠大的代碼,不用擔心內存溢出。并且內部集成了2個12位的us級的A/D轉換器和12位D/A轉換器,開發者并不需要外接模數或數模轉換芯片來額外增加成本。STM32系列有上百個I/O口和多個外部中斷向量,通過配置寄存器,可以將端口映射到這些向量上。另外,STM32有豐富的通信接口:IIC、USART、SPI、IIS、CAN、USB2.0和SDIO。這些資源是32位單片機所不具有的,足夠的資源使得它的開發空間也更加強大。
本項目涉及范圍廣,功能相對比較多,所以主控芯片必須得具有足夠的外設接口,高速的處理速度和較高的性價比。單片機由于自身條件的限制,無法滿足此項目的要求。因此,本項目選用的是性能優異,廉價,功耗低,并屬于STM32系列的STM32F103VCT6芯片。STM32具有32位單片機所有的優點,并且,價格上也比較低,所以比較適合應用于智能產品。STM32F103微控制器作為智能化環境檢測調節裝置的核心,核心算法以及所有的控制算法和控制命令,都由STM32F103單片機完成。STM32F103最小系統包括晶振電路、復位電路、電源電路。
2、DSl820 數字溫度計
DSl820數字溫度計提供 9 位溫度讀數,指示器件的溫度。信息經過單線接口送入 DSl820 或從 DSl820 送出,因此從中央處理器到 DSl820 僅需連接一條線(和地)。
讀、寫和完成溫度變換所需的電源可以由數據線本身提供,而不需要外部電源。因為每一個 DSl820 有唯一的系列號(silicon serial number),因此多個 DSl820 可以存在于同一條單線總線上。這允許在許多不同的地方放置溫度靈敏器件。此特性的應用范圍包括 HVAC 環境控制,建筑物、設備或機械內的溫度檢測,以及過程監視和控制中的溫度檢測。
   
具體連線:PG11(STM32)~DQ(DS1820)
3、3、3.5寸液晶LCD顯示屏

連接方案:排線插針對準開發板相應LCD排針插口即可
4、硬件整體實物圖
二、軟件方案
1、設計思路
  本工程設計采用keil5軟件進行軟件的編寫和編譯,通過JLINK燒錄入STM32開發板,上電后進行具體的溫度檢測報警功能實現。
2、軟件流程圖
3、軟件代碼實現
(一)主程序如下:
#include "sys.h"
#include "delay.h"
#include "lcd.h"
#include "touch.h"         
#include "usmart.h"  
#include "sdio_sdcard.h"   
#include "w25qxx.h"   
#include "ff.h"  
#include "exfuns.h"   
#include "fontupd.h"
#include "text.h"      
#include "led.h"
#include "bjdj.h"
#include "timer.h"
#include "usart.h"
#include "gizwits_product.h"
#include "string.h"               
#include "tpad.h"
#include "exti.h"
#include "ds18b20.h"
#include”BEEP”
dataPoint_t currentDataPoint;
u8 wifi_sta=0;
int main(void)
{         
        u8 t=0;                           
        short temperature;              
        delay_init();                     //延時函數初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
        uart_init(115200);                 //串口初始化為 115200
        LED_Init();                                  //初始化與LED連接的硬件接口
        LCD_Init();                                   //初始化LCD  
        while(font_init())                        
        {            
                LCD_ShowString(60,50,240,16,16,"Font Error!");
                delay_ms(200);                                 
                LCD_Fill(60,50,320,66,WHITE);//清除顯示
                delay_ms(200);      
        }
        Show_Str_Mid(40,30,"丁夢周 P21614086",16,240);
        Show_Str_Mid(40,60,"姚學峰 P21614021",16,240);
        Show_Str_Mid(40,90," 洪犇  P21614090",16,240);
        Show_Str_Mid(40,120,"李發宇 P21614082",16,240);
        while(DS18B20_Init())        //DS18B20初始化      
        {
                LCD_ShowString(120,130,200,16,16,"DS18B20 Error");
                delay_ms(200);
                LCD_Fill(30,130,239,130+16,WHITE);
                delay_ms(200);
        }                                                                  
        POINT_COLOR=BLUE;//設置字體為藍色
        LCD_ShowString(120,150,200,16,16,"Temp:   . C");         
        while(1)
        {                        
                if(t%10==0)                        //每100ms讀取一次
                {                                                                          
                        temperature=DS18B20_Get_Temp();      
                        if(temperature<0)
                        {
                                LCD_ShowChar(120+40,150,'-',16,0);                        //顯示負號
                                temperature=-temperature;                                        //轉為正數
                        }else LCD_ShowChar(120+40,150,' ',16,0);                        //去掉負號
                        LCD_ShowNum(120+40+8,150,temperature/10,2,16);        //顯示正數部分            
                           LCD_ShowNum(120+40+32,150,temperature%10,1,16);        //顯示小數部分
                        if(temperature>300)
                        {
                                LED0=0;
                        }
                        else
                        {
                                LED0=1;
                        }
                }                                 
                 delay_ms(10);
                t++;
        }
}
主程序說明:
在開發板上電后進行所有模塊及內存進行初始化,初始化后開始進行DSI820溫度傳感器的檢測,采用0.1秒的檢測時間間隔,每次采集的數據輸入到內存ROM中作進一步調整,并與固定的值相比較,將比較結果產生的電平通過數據總線輸出到相應的串口控制蜂鳴器和LED指示燈的工作狀態,同時調整結束后得到一個十位和個位的非整數集合,顯示在LCD屏幕之上,數值根據周圍溫度變化動態而變化。
溫度傳感器子程序:
void DS18B20_Rst(void)         
{                 
        DS18B20_IO_OUT();         //SET PG11 OUTPUT
    DS18B20_DQ_OUT=0;         //拉低DQ
    delay_us(750);            //拉低750us
    DS18B20_DQ_OUT=1;         //DQ=1
        delay_us(15);             //15US
}
//等待DS18B20的回應
//返回1:未檢測到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)           
{   
        u8 retry=0;
        DS18B20_IO_IN();        //SET PG11 INPUT         
    while (DS18B20_DQ_IN&&retry<200)
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=200)return 1;
        else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
        {
                retry++;
                delay_us(1);
        };
        if(retry>=240)return 1;            
        return 0;
}
//從DS18B20讀取一個位
//返回值:1/0
u8 DS18B20_Read_Bit(void)         
{
    u8 data;
        DS18B20_IO_OUT();        //SET PG11 OUTPUT
    DS18B20_DQ_OUT=0;
        delay_us(2);
    DS18B20_DQ_OUT=1;
        DS18B20_IO_IN();        //SET PG11 INPUT
        delay_us(12);
        if(DS18B20_DQ_IN)data=1;
    else data=0;         
    delay_us(50);           
    return data;
}
//從DS18B20讀取一個字節
//返回值:讀到的數據
u8 DS18B20_Read_Byte(void)     
{        
    u8 i,j,dat;
    dat=0;
        for (i=1;i<=8;i++)
        {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }                                                   
    return dat;
}
//寫一個字節到DS18B20
//dat:要寫入的字節
void DS18B20_Write_Byte(u8 dat)     
{            
    u8 j;
    u8 testb;
        DS18B20_IO_OUT();        //SET PG11 OUTPUT;
    for (j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;        // Write 1
            delay_us(2);                           
            DS18B20_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_DQ_OUT=0;        // Write 0
            delay_us(60);            
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
//開始溫度轉換
void DS18B20_Start(void)
{                                                                 
    DS18B20_Rst();         
        DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);        // skip rom
    DS18B20_Write_Byte(0x44);        // convert
}
//初始化DS18B20的IO口 DQ 同時檢測DS的存在
//返回1:不存在
//返回0:存在            
u8 DS18B20_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);         //使能PORTG口時鐘
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                //PORTG.11 推挽輸出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_SetBits(GPIOG,GPIO_Pin_11);    //輸出1
        DS18B20_Rst();
        return DS18B20_Check();
}  
//從ds18b20得到溫度值
//精度:0.1C
//返回值:溫度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
        short tem;
    DS18B20_Start ();                          // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);        // skip rom
    DS18B20_Write_Byte(0xbe);        // convert            
    TL=DS18B20_Read_Byte();         // LSB   
    TH=DS18B20_Read_Byte();         // MSB  
                     
if(TH>7)                    
    {   TH=~TH;
        TL=~TL;
        temp=0;                                        //溫度為負  
    }else temp=1;                                //溫度為正                    
    tem=TH;                                         //獲得高八位
    tem<<=8;   
    tem+=TL;                                        //獲得底八位
    tem=(float)tem*0.625;                //轉換     
        if(temp)return tem;                 //返回溫度值
        else return -tem;   
}
子程序簡要說明:
由于傳輸線只有一根,即(DQ),系統經歷了一段至少420us的低電平(ds1820溫度傳稿器端輸出信息至MCU),釋放總線并初始化,MCU形成了一個最少為15us-60us的上升沿脈沖輸出至傳感器,此時DS1820溫度傳感器處于相應MCU輸出信號的狀態,若DS1820工作模式正常,便會產生一個60~240us級的低電平信號,并發送至MCU,此過程便是兩端通信的建立過程。
當接收建立后,由溫度傳感器進行間隔0.1秒的動態讀取數據,并串行輸入至MCU的內存中,經過按位取或的移位操作,將串行數據變為16位二進制數儲存在TH,TL寄存器中,當TH高5位出現1時,判定為負數,取反,未出現1,判定為正數并將TH及高八位賦給tem。將得到的tem值進行擴展,移位展寬成16位的二進制數后,通過乘與0.625完成16進制到10進制的轉換。






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 又爽又黄axxx片免费观看 | av大全在线 | 日韩精品成人在线 | 台湾a级理论片在线观看 | 亚洲国产一区二区三区 | 二区高清| 国产在线观看一区 | 特一级毛片 | 久久精品一区二区 | 日韩精品在线观看网站 | 美女天天操 | 99精品国产一区二区青青牛奶 | 中文字幕av一区 | 日韩成年人视频在线 | 久久国色 | 日韩在线视频一区 | 久久久不卡网国产精品一区 | 久久久精品视频免费看 | 国产成人99久久亚洲综合精品 | 欧美日韩久久 | 99久久久久久久 | 美国十次成人欧美色导视频 | 欧美另类视频在线 | 久久lu | 精品三区 | 一区二区高清不卡 | 欧美成人精品欧美一级 | 精品三区 | 亚洲精品一区二区在线观看 | 亚洲男女视频在线观看 | 亚洲欧美久久 | 国产精品精品 | 日韩一区二区在线播放 | 成人欧美一区二区三区黑人孕妇 | 精品一区二区三区免费视频 | 国产精品中文在线 | 国产成人a亚洲精品 | 日韩不卡在线 | 色吧色综合| 亚洲一区二区三区四区在线观看 | 中文字幕精品一区久久久久 |