找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5700|回復(fù): 2
收起左側(cè)

MSP430單片機(jī)超級(jí)終端在電壓表自動(dòng)校準(zhǔn)中的應(yīng)用實(shí)例

[復(fù)制鏈接]
ID:108615 發(fā)表于 2016-3-14 20:01 | 顯示全部樓層 |閱讀模式
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書里面的源碼,(包含工程文件(例4.1.6))完整例程下載:http://www.torrancerestoration.com/bbs/dpj-46245-1.html


關(guān)于本程序的詳細(xì)解說(shuō)大家可以點(diǎn)擊上圖下載電子書

  1. /*
  2.                
  3.                        超級(jí)終端在電壓表自動(dòng)校準(zhǔn)中的應(yīng)用實(shí)例

  4.   說(shuō)明:該程序示范用超級(jí)終端進(jìn)行電壓表校準(zhǔn)的人機(jī)交互范例。
  5.             

  6. //=========================================================================


  7.   (C)西安電子科技大學(xué) 測(cè)控技術(shù)與儀器教研中心 編寫:謝楷 2008/06/24
  8.   
  9. */
  10. //******************************************************************************
  11. //                        
  12. //               MSP430FE425
  13. //           +-----------------+
  14. //           |              XIN|-
  15. //           |                 | 32kHz
  16. //           |             XOUT|-
  17. //           |                 |
  18. //           |        (TXD)P2.4|----------->(TTL/232)----> RXD(2)
  19. //           |                 | 4800 bps ,n,8,1            
  20. //           |        (RXD)P2.5|<-----------(TTL/232)<---- TXD(3)  PC(DB9)
  21. //           |                 |
  22. //           |             GND |---------------------------GND(5)
  23. //
  24. //******************************************************************************
  25. #include "msp430x42x.h"    /*430寄存器頭文件*/
  26. #include "UART.h"          /*串口通訊程序庫(kù)頭文件*/
  27. #include "stdio.h"         /*標(biāo)準(zhǔn)IO設(shè)備頭文件(printf/scanf函數(shù)所需)*/
  28. #include "math.h"          /*數(shù)學(xué)函數(shù)庫(kù)*/
  29. #include "LCD_Display.h"   /*LCD顯示函數(shù)庫(kù)頭文件*/
  30. #include "ADC16.h"         /*ADCc采樣函數(shù)庫(kù)頭文件*/
  31. #include "Flash.h"
  32. #include "BasicTimer.h"



  33. int Voltage_Sample()
  34. {
  35.   int ADC_Value,i;
  36.   ADC16_VrefOn();        // 打開(kāi)基準(zhǔn)源
  37.   Analog_On();           // 打開(kāi)外設(shè)電源P2.2(如果有必要)
  38.   for(i=0;i<100;i++);    // 略延遲,等待穩(wěn)定
  39.   ADC_Value=ADC16_Sample(2,1);  //ADC2單次采樣
  40.   ADC16_VrefOff();        // 打開(kāi)基準(zhǔn)源
  41.   Analog_Off();           //關(guān)閉外設(shè)電源P2.2(如果有必要)   
  42.   return(ADC_Value);      // 返回采樣結(jié)果
  43. }

  44. void Calibrate()
  45. {
  46.   char Chr=0;
  47.   int ADC_Temp;
  48.   int Volt_FS;
  49.   printf("\f");                         // 清屏
  50.   printf("1秒內(nèi)按'C'鍵進(jìn)入校準(zhǔn)模式\n"); // 提示按'C'鍵進(jìn)入校準(zhǔn)模式
  51.   __delay_cycles(1000000);              // 等待1秒     
  52.   Chr=U0RXBUF;                          // 取出串口收到數(shù)據(jù)(未收到讀回0)
  53.   if((Chr=='C')||(Chr=='c'))            // 如果收字符為'C'或'c',才進(jìn)入校準(zhǔn)模式
  54.   {
  55.      printf("校準(zhǔn)開(kāi)始\n");              // 提示校準(zhǔn)開(kāi)始
  56.      printf("請(qǐng)輸入0V電壓,然后按回車鍵繼續(xù)...\n");
  57.      while(getchar()!='\n');            // 等待回車鍵
  58.      ADC_Temp=Voltage_Sample();         // 采樣一次ADC讀數(shù),作為零點(diǎn)數(shù)值
  59.      Flash_WriteWord(0,ADC_Temp);       // 將結(jié)果保存在InfoFlash的0、1單元
  60.      printf("零點(diǎn)采樣值=%d\n",ADC_Temp);// 提示零點(diǎn)采樣結(jié)果
  61.      printf("校準(zhǔn)輸入滿度校準(zhǔn)電壓(5000=50.00V):");// 提示輸入滿度校準(zhǔn)電壓值
  62.      scanf("%d",&Volt_FS);              // 從計(jì)算機(jī)輸入滿度電壓值
  63.      Flash_WriteWord(2,Volt_FS);        // 將結(jié)果保存在InfoFlash的2、3單元  
  64.      printf("請(qǐng)輸入滿度電壓,然后按回車鍵繼續(xù)...\n");
  65.      while(getchar()!='\n');            // 等回車鍵
  66.      ADC_Temp=Voltage_Sample();         // 采樣一次ADC讀數(shù),作為零點(diǎn)數(shù)值
  67.      Flash_WriteWord(4,ADC_Temp);       // 將結(jié)果保存在InfoFlash的4、5單元
  68.      printf("滿度采樣值=%d\n",ADC_Temp);// 提示滿度采樣結(jié)果     
  69.      printf("校準(zhǔn)完畢!\n\7");           // 校準(zhǔn)完畢,鳴響一聲(\7是鳴響符)
  70.   }  
  71. }

  72. void main( void )
  73. {
  74.   int ADC_0,ADC_F, VCAL,Voltage,ADC_Result;
  75.   WDTCTL=WDTPW+WDTHOLD;  //停止看門狗
  76.   FLL_CTL0|=XCAP18PF;          //配置晶振負(fù)載電容
  77.   P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
  78.   P2DIR|=BIT0+BIT1+BIT2+BIT3;       //不用的IO設(shè)為輸出
  79.   P1OUT=0;P2OUT=0;                  //以免不確定電平造成額外耗電
  80.   BT_Init(2);
  81.   LCD_Init();              //初始化液晶顯示
  82.   UART_Init(4800,'n',8,1); //串口初始化,設(shè)置成4800bps,無(wú)校驗(yàn),8位數(shù)據(jù),1位停止
  83.   ADC16_Init(2,0,'S',1);   //ADC2設(shè)為外部輸入,數(shù)據(jù)格式有符號(hào),1倍放大

  84.   Calibrate();             //校準(zhǔn)
  85.   ADC_0=Flash_ReadWord(0); //讀取校準(zhǔn)參數(shù)(零點(diǎn))
  86.   ADC_F=Flash_ReadWord(4); //讀取校準(zhǔn)參數(shù)(滿點(diǎn))
  87.   VCAL=Flash_ReadWord(2);  //讀取校準(zhǔn)參數(shù)(滿點(diǎn)電壓值)

  88.   while(1)
  89.    {
  90.      Cpu_SleepWaitBT();                   //等待被BT中斷喚醒,以下代碼每隔1/2秒執(zhí)行一次
  91.      ADC_Result=Voltage_Sample();         //采樣一次
  92.      Voltage=((long)ADC_Result-ADC_0)*VCAL/((long)ADC_F-ADC_0);//計(jì)算電壓
  93.      LCD_DisplayDecimal(Voltage,2);       //顯示電壓值,帶2位小數(shù) (例2.5.10)
  94.      LCD_InsertChar(VV);                  // 尾部添加單位: V     
  95.    }
  96. }
復(fù)制代碼



相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:3666 發(fā)表于 2021-3-2 21:07 | 顯示全部樓層
這句 ADC_F=Flash_ReadWord(4); //讀取校準(zhǔn)參數(shù)(滿點(diǎn)) 是不是AD口要加上相應(yīng)的電壓進(jìn)行采集呀?
Voltage=((long)ADC_Result-ADC_0)*VCAL/((long)ADC_F-ADC_0);//計(jì)算電壓 這句是什么意思?
謝謝
回復(fù)

使用道具 舉報(bào)

ID:611245 發(fā)表于 2021-3-2 21:36 | 顯示全部樓層
這個(gè)好復(fù)雜呀膜拜膜拜程序員
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表