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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8135|回復: 6
打印 上一主題 下一主題
收起左側

LABVIEW上位機+STM32內部溫度傳感器源程序

  [復制鏈接]
跳轉到指定樓層
樓主

1、打開電腦的“控制面板” -->“字體”,把“數碼管字體”文件夾中的兩個文件,復制到“字體”中

2、重新打開main.vi,就可以在您的字體設置欄找到NI7SEG字體了

3、本labview采集程序采用了自動識別單片機串口技術,用戶不必手動選擇串口

4、本程序可以測量STM32芯片內部的溫度。如果您用手按住開發板上的STM32芯片,可以看到labview上顯示的溫度在增加

5、本實驗的采樣率是:10/秒,即labview可以在100ms之內處理完一個數據。如果用戶的采樣率加大,請采用labview生產者/消費者結構

單片機源程序如下:

  1. /*****************************************************************
  2. *
  3. * 文件名: main.c
  4. * 內容簡述: 本程序演示了STM32內部溫度傳感器的ADC(非DMA)以及過采樣技術的使用
  5.             采用RS485通信方式。可使用RS232轉RS485轉換器,PC機上的LabVIEW上位機仍然是串口方式,不需改動
  6. *
  7. *
  8. ******************************************************************/
  9. #include "stm32f10x.h"
  10. #include <stdio.h>

  11. u8 ah,al,comm = 0;
  12. u16 ad;
  13. u32 tempu32 = 0;

  14. u8 gototime = 0;

  15. /*************************************************
  16. 函數: void RCC_Configuration(void)
  17. 功能: 復位和時鐘控制 配置
  18. 參數: 無
  19. 返回: 無
  20. **************************************************/
  21. void RCC_Configuration(void)
  22. {
  23.   ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態枚舉變量
  24.   RCC_DeInit();                                    //復位RCC外部設備寄存器到默認值
  25.   RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振
  26.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準備好
  27.   if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經準別好
  28.   {
  29.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數里面,時鐘起振之后
  30.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時
  31.              
  32.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等于==SYSCLK
  33.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鐘==AHB時鐘
  34.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鐘==AHB1/2時鐘
  35.          
  36.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz
  37.     RCC_PLLCmd(ENABLE);                                   //使能PLL時鐘
  38.    
  39.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒
  40.     {
  41.     }
  42.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統時鐘 = PLL時鐘
  43.     while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統時鐘
  44.     {
  45.     }
  46.   }
  47.   
  48.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE);  //允許GPIOB、GPIOF、AFIO時鐘
  49. }

  50. /*******************************************************************************
  51.         函數名:ADC_Configuration
  52.         輸  入:
  53.         輸  出:
  54.         功能說明:配置ADC
  55. */
  56. static void ADC_Configuration(void)
  57. {
  58.         ADC_InitTypeDef ADC_InitStructure;

  59.     /* 使能 ADC1 and GPIOC clock */
  60.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  61.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);              //72M/6=12,ADC最大時間不能超過14M

  62.         /* 配置ADC1, 不用DMA, 用軟件自己觸發 */
  63.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                 //ADC1工作模式:獨立模式
  64.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;                         //單通道模式
  65.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                 //單次轉換
  66.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;          //轉換由軟件而不是外部觸發啟動
  67.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //ADC1數據右對齊
  68.         ADC_InitStructure.ADC_NbrOfChannel = 1;           //順序進行規則轉換的ADC通道的數目
  69.         ADC_Init(ADC1, &ADC_InitStructure);                   //根據ADC_InitStruct中指定的參數,初始化外設ADC1的寄存器

  70.         /* ADC1 regular channel16 configuration */
  71.         ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);        //ADC1,ADC通道16,規則采樣順序值為1,采樣時間為55.5周期

  72.     ADC_TempSensorVrefintCmd(ENABLE);                   //ADC內置溫度傳感器使能(要使用片內溫度傳感器,切記要開啟它)

  73.         /* Enable ADC1 */
  74.         ADC_Cmd(ADC1, ENABLE);                  //使能ADC1

  75.         /* Enable ADC1 reset calibaration register */
  76.         ADC_ResetCalibration(ADC1);                                                //重置ADC1的校準寄存器
  77.         /* Check the end of ADC1 reset calibration register */
  78.         while(ADC_GetResetCalibrationStatus(ADC1));                //獲取ADC1重置校準寄存器的狀態,設置狀態則等待

  79.         /* Start ADC1 calibaration */
  80.         ADC_StartCalibration(ADC1);                                        //開始ADC1的校準狀態
  81.         /* Check the end of ADC1 calibration */
  82.         while(ADC_GetCalibrationStatus(ADC1));                //等待校準完成

  83.         /* Start ADC1 Software Conversion */
  84.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能ADC1的軟件轉換啟動功能
  85. }

  86. /*******************************************************************************
  87. * Function Name   : NVIC_Configuration
  88. * Description        : Configures NVIC and Vector Table base location.
  89. * Input                    : None
  90. * Output                 : None
  91. * Return                 : None
  92. *******************************************************************************/
  93. void NVIC_Configuration(void)
  94. {
  95.    NVIC_InitTypeDef NVIC_InitStructure;
  96.   
  97.    /* Set the Vector Table base location at 0x08000000 */
  98.    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  99.   
  100.    /* Configure the NVIC Preemption Priority Bits */  
  101.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  102.   
  103.    /* Enable the USART1 Interrupt */
  104.    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  105.    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  106.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  107.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  108.    NVIC_Init(&NVIC_InitStructure);

  109.   //配置TIM2中斷
  110.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  111.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  112.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  113.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  114.   NVIC_Init(&NVIC_InitStructure);
  115. }

  116. /*******************************************************************************
  117.         函數名:USART3_Configuration
  118.         輸  入:
  119.         輸  出:
  120.         功能說明:
  121.         初始化串口硬件設備,啟用中斷
  122.         配置步驟:
  123.         (1)打開GPIO和USART的時鐘
  124.         (2)設置USART3兩個管腳GPIO模式
  125.         (3)配置USART3數據格式、波特率等參數
  126.         (4)使能USART3接收中斷功能
  127.         (5)最后使能USART3功能
  128. */
  129. void USART3_Configuration(void)
  130. {
  131.         GPIO_InitTypeDef GPIO_InitStructure;
  132.         USART_InitTypeDef USART_InitStructure;

  133.         /* 第1步:打開GPIO和USART3部件的時鐘 */
  134.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  135.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  136.         /* 第2步:將USART3 Tx的GPIO配置為推挽復用模式 */
  137.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  138.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  139.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  140.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  141.         /* 第3步:將USART3 Rx的GPIO配置為浮空輸入模式
  142.                 由于CPU復位后,GPIO缺省都是浮空輸入模式,因此下面這個步驟不是必須的
  143.                 但是,我還是建議加上便于閱讀,并且防止其它地方修改了這個口線的設置參數
  144.         */
  145.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  146.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  147.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  148.     GPIO_Init(GPIOB, &GPIO_InitStructure);


  149.         /* 第4步:配置USART3參數
  150.             - BaudRate = 115200 baud
  151.             - Word Length = 8 Bits
  152.             - One Stop Bit
  153.             - No parity
  154.             - Hardware flow control disabled (RTS and CTS signals)
  155.             - Receive and transmit enabled
  156.         */
  157.         USART_InitStructure.USART_BaudRate = 115200;
  158.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  159.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  160.         USART_InitStructure.USART_Parity = USART_Parity_No;
  161.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  162.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  163.         USART_Init(USART3, &USART_InitStructure);

  164.     /* 若接收數據寄存器滿,則產生中斷 */
  165.     USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

  166.         /* 第5步:使能 USART3, 配置完畢 */
  167.         USART_Cmd(USART3, ENABLE);

  168.     /* 如下語句解決第1個字節無法正確發送出去的問題 */
  169.     USART_ClearFlag(USART3, USART_FLAG_TC);     // 清標志
  170. }

  171. /*************************************************
  172. 函數: void GPIO_Configuration(void)
  173. 功能: GPIO配置
  174. 參數: 無
  175. 返回: 無
  176. **************************************************/
  177. void GPIO_Configuration(void)
  178. {
  179.   GPIO_InitTypeDef GPIO_InitStructure;                                        //定義GPIO初始化結構體

  180.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  181.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  182.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  /* 輸出 */
  183.   GPIO_Init(GPIOF, &GPIO_InitStructure);
  184. }

  185. /*************************************************
  186. 函數: void Timer2_Configuration(void)
  187. 功能: TIM2 配置
  188. 參數: 無
  189. 返回: 無
  190. 定時計算:(1 /(72 / (36 - 1 + 1))) * 781 us = 390.5us
  191. **************************************************/
  192. void Timer2_Configuration(void)
  193. {
  194.   TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  195.    
  196.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);            //打開TIM2定時器的時鐘
  197.   
  198.   
  199.   TIM_DeInit(TIM2);                                                    //TIMx寄存器重設為缺省值
  200.   
  201.   TIM_TimeBaseStructure.TIM_Period = 781;                            //自動重裝載寄存器周期的值
  202.   TIM_TimeBaseStructure.TIM_Prescaler=36 - 1;               //TIMx 時鐘頻率除數的預分頻值
  203.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;     //采樣分頻
  204.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式
  205.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  206.   
  207.   TIM_ARRPreloadConfig(TIM2, ENABLE);                       //允許自動重裝載寄存器(ARR)
  208.   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                        //允許TIM2溢出中斷
  209.   
  210.   TIM_Cmd(TIM2, ENABLE);        //開啟時鐘
  211. }

  212. /*******************************************************************/
  213. /*                                                                 */
  214. /* STM32向串口3發送1字節                                           */
  215. /*                                                                 */
  216. /*                                                                 */
  217. /*******************************************************************/
  218. void Uart3_PutChar(u8 ch)
  219. {
  220.   /* 發送使能 */
  221.   GPIO_SetBits(GPIOF, GPIO_Pin_10);                /* DE = 1 */
  222.   /* 接收禁止 */
  223.   GPIO_SetBits(GPIOF, GPIO_Pin_11);         /* nRE = 1 */

  224.   USART_SendData(USART3, (u8) ch);
  225.   while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);        //注意此句與RS232不同

  226.   //注意:因為RS485的半雙工方式,在RS485發送數據完畢后,需要把RS485設置在接收狀態,否則收不到主機的數據
  227.   /* 接收使能 */
  228.   GPIO_ResetBits(GPIOF, GPIO_Pin_11);         /* nRE = 0 */
  229.   /* 發送禁止 */
  230.   GPIO_ResetBits(GPIOF, GPIO_Pin_10);        /* DE = 0 */
  231. }

  232. /*******************************************************************/
  233. /*                                                                 */
  234. /* STM32在串口3接收1字節                                           */
  235. /* 說明:串口接收中斷                                              */
  236. /*                                                                 */
  237. /*******************************************************************/
  238. void USART3_IRQHandler(void)            //在中斷服務程序中,由于主機響應中斷時并不知道是哪個中斷源發出中斷請求,因此必須在中斷服務程序中對中斷源進行判別,然后分別進行處理。當然,如果只涉及到一個中斷請求,是不用做上述判別的。但是無論什么情況,做上述判別是個好習慣
  239. {
  240.   /* 接收使能 */
  241.   GPIO_ResetBits(GPIOF, GPIO_Pin_11);         /* nRE = 0 */
  242.   /* 發送禁止 */
  243.   GPIO_ResetBits(GPIOF, GPIO_Pin_10);        /* DE = 0 */

  244.   if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)    //若接收數據寄存器滿
  245.   {     
  246.     comm = USART_ReceiveData(USART3);   //此語句作用:將USART_DR寄存器的內容傳到comm里。另外,在單緩沖器模式下,軟件讀USART_DR寄存器則完成對RXNE位清除。[注意]在多緩沖器模式下,必須通過軟件清零"傳輸完成標志"DMA1_FLAG_TCx(即:令DMA_IFCR的位CTCIFx=1),否則將會無法跳出中斷服務程序,出現一次中斷請求無數次響應的后果
  247.    
  248.         if(comm == 0x63)                    //上位機自動查找采集器是否在線
  249.         {                         
  250.           comm = 0;      
  251.       Uart3_PutChar(0x63);              //發送CP的ASCII碼
  252.       Uart3_PutChar(0x70);                                                        
  253.         }  
  254.   }
  255. }

  256. /*************************************************
  257. 函數: void TIM2_IRQHandler(void)
  258. 功能: TIM2中斷處理函數
  259. 參數: 無
  260. 返回: 無
  261. 說明:390.5us中斷1次
  262. **************************************************/
  263. void TIM2_IRQHandler(void)
  264. {
  265.    if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  266.    {      
  267.       TIM_ClearITPendingBit(TIM2,TIM_IT_Update);         //清除中斷標志
  268.       gototime = 1;
  269.    }
  270. }

  271. /*************************************************
  272. 函數: int main(void)
  273. 功能: main主函數
  274. 參數: 無
  275. 返回: 無
  276. **************************************************/
  277. int main(void)
  278. {
  279.   u16 i;

  280.   RCC_Configuration();
  281.   ADC_Configuration();            //配置PC0 為ADC1_IN10
  282.   GPIO_Configuration();
  283.   NVIC_Configuration();
  284.   USART3_Configuration();
  285.   Timer2_Configuration();


  286.   /* 接收使能 */
  287.   GPIO_ResetBits(GPIOF, GPIO_Pin_11);         /* nRE = 0 */
  288.   /* 發送禁止 */
  289.   GPIO_ResetBits(GPIOF, GPIO_Pin_10);        /* DE = 0 */

  290.   while(1)
  291.   {
  292.     if (comm == 0x7a)                           //單片機發送數據給PC機
  293.         {      
  294.       for(i = 0;i < 256;i++)                    //根據過采樣技術,每提高一位AD分辨率,需要增加4倍的采樣率;從12位AD分辨率增加到16位AD分辨率,即增加4位,所以需要增加256倍的采樣率
  295.       {
  296.         gototime = 0;
  297.         TIM_Cmd(TIM2, ENABLE);                                //開啟時鐘
  298.             ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //軟件啟動ADC轉換
  299.             while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉換結束
  300.             ad = 0;
  301.                 ad = ADC_GetConversionValue(ADC1);                        //讀取ADC值                     
  302.         tempu32 += ad;                                      //累加        
  303.         while(gototime == 0);                                                //延時:390.5us。采樣率:10/秒
  304.         TIM_Cmd(TIM2, DISABLE);                                //關閉時鐘
  305.       }

  306.           //以下數據處理和發送會占用一定的時間,如果我們不采用過采樣技術,可以把以下代碼放在TIM2定時之內處理                            
  307.       ad = tempu32 >> 4;                        //16位分辨率,累加值右移4位
  308.       ah = ad >> 8;                                                    //高8位
  309.       al = ad & 0xff;                                   //低8位
  310.       Uart3_PutChar(ah);
  311.       Uart3_PutChar(al);
  312.                             
  313.       tempu32 = 0;   
  314.     }                                                         
  315.   }
  316. }
復制代碼

所有資料51hei提供下載:
55593383LabVIEW-NTCthermistor-temperature (1).rar (490.51 KB, 下載次數: 153)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:373684 發表于 2019-8-22 23:37 | 只看該作者
樓主,,請問做這個項目是不是要編好LAbview程序 外還要 編STM32單片機的程序啊 ?不是編好labview程序 直接輸到 STM那 就可以 了嗎
回復

使用道具 舉報

板凳
ID:494023 發表于 2020-11-27 21:46 | 只看該作者
cr8526 發表于 2019-8-22 23:37
樓主,,請問做這個項目是不是要編好LAbview程序 外還要 編STM32單片機的程序啊 ?不是編好labview程序 直 ...

同問
回復

使用道具 舉報

地板
ID:235200 發表于 2020-11-28 12:51 | 只看該作者
cr8526 發表于 2019-8-22 23:37
樓主,,請問做這個項目是不是要編好LAbview程序 外還要 編STM32單片機的程序啊 ?不是編好labview程序 直 ...

LabVIEW只是上位機程序,與STM32對接進行數據傳遞,所以兩者都需要
回復

使用道具 舉報

5#
ID:743531 發表于 2021-3-16 17:09 | 只看該作者

labview是上位機,stm32是下位機,有點類似于你可以吧labview理解成觸控屏吧,就是拿來顯示作用的,畢竟本身單片機本身是沒法顯示這些具體數據和曲線的,所以需要把stm32從傳感器采集到的模擬量在利用串口通信把數據分享給Labview,不知道我理解的對不對希望樓主回復
回復

使用道具 舉報

6#
ID:308324 發表于 2021-5-8 19:26 | 只看該作者
樓主,你知道在查找stm32時一直出現錯誤是怎么回事啊?
回復

使用道具 舉報

7#
ID:726570 發表于 2021-5-10 21:55 | 只看該作者
請問為啥我鏈接不上32的開發板啊? 求指教!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 黄色精品 | 午夜精品久久久久久久久久久久久 | 午夜免费在线 | 国产美女在线看 | 国产区一区 | 九九热这里只有精品6 | 日韩精品一区二区在线 | 国产精久久久久久久妇剪断 | 国产精品久久久久一区二区三区 | 欧美日韩在线播放 | 一区二区日本 | 欧美久久一区二区三区 | av无遮挡| 懂色中文一区二区在线播放 | 亚洲成av| 国产视频精品区 | 韩日精品一区 | 91精品国产91久久久久久吃药 | 在线永久看片免费的视频 | av中文网 | 蜜桃在线播放 | 蜜臀网 | 亚洲免费三区 | 国产视频福利 | 亚洲国产精品一区二区三区 | 一区二区高清在线观看 | 欧美亚洲高清 | 亚洲国产精品一区二区第一页 | 在线免费观看黄网 | 国产乱精品一区二区三区 | eeuss国产一区二区三区四区 | 91免费视频| 毛片免费观看视频 | 亚洲成人一区 | 亚洲视频欧美视频 | 一区二区三区日本 | 激情a| 国产精品揄拍一区二区久久国内亚洲精 | 精品二 | 一区二区三区欧美 |