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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7522|回復: 6
收起左側

MSP430單片機制作智能數字萬用表電路圖+程序

  [復制鏈接]
ID:475083 發表于 2019-3-17 19:55 | 顯示全部樓層 |閱讀模式
留給想做萬用表的小伙伴們
電路原理圖如下:

DC轉換電路

DC轉換電路

全套MSP430萬用表資料

全套MSP430萬用表資料


單片機源程序如下:
  1. /*
  2. * 簡易低功耗萬用表
  3. */
  4. #include <msp430g2553.h>
  5. #include "LCD12864P.h"

  6. unsigned int ADC_flag,ADC_flag1,shua_xin;
  7. unsigned int ADC_data[8],ADC_result[8],mser,song,liang_cheng = 0,s,wen_pt,pt100 = 0,zu_zhi = 0;

  8. unsigned int data0,data1,data2,data3,data4,data5,data6,data7;

  9. //double data0,data1,data2,data3,data4,data5,data6,data7;
  10. unsigned int table[]={0x00,0x02,0x01,0x04,0x08,0xEF,0xdf,0xcf,0x80};//量程選擇 【1】直流10v   【2】直流1v  【3】電阻值10k

  11. /*
  12. *初始化
  13. */
  14. void int_t()
  15. {

  16.     WDTCTL = WDT_MDLY_8;    //看門狗定時器的初始化設置
  17.     IE1 |= WDTIE;
  18.     Ini_Lcd();                                 //lcd初始化
  19.         BCSCTL1 = CALBC1_8MHZ;
  20.         DCOCTL  = CALDCO_8MHZ;
  21.         /*
  22.         P1DIR &= BIT3+BIT4;/////////將按鍵口設置為輸入
  23.         P1REN |= BIT3+BIT4;////////打開上拉電阻,目的為產生觸發沿高電平往低電平
  24.         P1IE  |= 0X18;//////////設置按鍵口中斷
  25.         P1IES |= 0X18;///////////下降沿中斷。只有在松手時觸發中斷的產生
  26.         */
  27.         P1DIR &= BIT3;/////////將按鍵口設置為輸入
  28.         P1REN |= BIT3;////////打開上拉電阻,目的為產生觸發沿高電平往低電平
  29.         P1IE  |= 0X08;//////////設置按鍵口中斷
  30.         P1IES |= 0X08;///////////下降沿中斷。只有在松手時觸發中斷的產生

  31.         P2DIR &= ~(BIT2+BIT3+BIT4+BIT5);/////////將功能選擇按鍵口設置為輸入        1.直流電壓   2.交流電壓   3.電阻量程    4.電容測量

  32.         P1DIR |= BIT5 + BIT6 + BIT7 ;                        //        將擴展口為輸出

  33.         _EINT();                                          //使能中斷,這是一個C編譯器支持的內部過程。

  34. }
  35. /*
  36. * 按鍵延時程序
  37. */
  38. void delay(unsigned int n)//帶參數有返回值的函數
  39. {
  40.         unsigned int i;
  41.         unsigned int j;
  42.         for(i=n;i>0;i--)
  43.                 for(j=100;j>0;j--)
  44.                         _nop();
  45. }
  46. /**************************************************************
  47. *名稱:ADC()
  48. *功能:AD設置轉換  中斷
  49. ****************************************************************/

  50. void  ADC()
  51. {
  52.         P1SEL |= BIT0 + BIT1 + BIT2 + BIT4;//+ BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7;                  //設置為模擬輸入
  53.         ADC10AE0  |= BIT0 + BIT1 + BIT2+ BIT4;// + BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7;   //開啟通道A1/A2/A4/A5/A6/A7
  54.         ADC10CTL0|=ADC10ON+MSC+ADC10SHT_2+ADC10IE;                        //打開ADC轉換  ,ADC10使能 ,設置采用頻率16個周期,允許中斷
  55.         ADC10CTL0 |=SREF_1 + REFON + REF2_5V;                           //開內部參考電壓為2.5V,允許中斷
  56.         ADC10CTL1|=CONSEQ_3+INCH_7;                                                 //使用雙(4)通道、循環采集模式
  57.         ADC10DTC1|=0x08;                                                                      //每一通道連續采樣1次
  58.         _BIS_SR(GIE);
  59. }
  60. /*
  61. *功能:AD數據處理
  62. */
  63. void ADC_DATA()
  64. {
  65.         unsigned char i;
  66.         ADC10CTL0&=~ENC;
  67.         while(ADC10CTL1&ADC10BUSY);                                                //檢測AD是否繁忙
  68.         ADC10CTL0|=ENC+ADC10SC;                                                  //啟動ADC
  69.         ADC10SA=(unsigned int)ADC_result;                                //獲取ADC_result[]的首地址。首先對A1、A0采樣,放入ADC_result[0]和ADC_result[1]中,如此循環下去。
  70.         for(i=0;i<8;i++)
  71.     {
  72.                 ADC_data[i]=0;
  73.                 ADC_data[i]=ADC_result[i];
  74.         //        ADC_data[i]=(ADC_data[i]*25)/1023;                     //將ADC轉換成實際的電壓值
  75.     }
  76. }
  77. /*
  78. * 擴展芯片595寫入程序
  79. */
  80. void kuo_zhan(unsigned int dat)
  81. {
  82.         unsigned int i;
  83.         for(i=0;i<8;i++)
  84.         {
  85.                 if((dat<<i)&0x80)
  86.                         P1OUT|=BIT5;
  87.                 else
  88.                 P1OUT &= ~BIT5;
  89.                 P1OUT &= ~BIT7;
  90.                 _NOP();
  91.                 P1OUT |= BIT7;
  92.                 _NOP();
  93.         }
  94.         P1OUT &= ~BIT6;
  95.         _NOP();
  96.         P1OUT |= BIT6;
  97.         _NOP();
  98. }
  99. /*
  100. * 直流電壓檢測
  101. */
  102. void zhi_liu()
  103. {
  104.         unsigned int song_chao;

  105.         lcd_pos(1,0);
  106.         Disp_HZ("★低功耗萬用表★",8);

  107.         lcd_pos(2,0);
  108.         Disp_HZ("直流電壓",4);

  109.         lcd_pos(3,0);
  110.         Disp_HZ("測量量程",4);

  111.         lcd_pos(4,0);
  112.         Disp_HZ("測量電壓",4);

  113.         if(liang_cheng == 1)                                                //量程為10v的時候數據處理
  114.         {
  115.                 kuo_zhan(table[1]);                                                //打開10v通道
  116.                 song_chao = data0*5.8585*0.002443*100;                                        //
  117.                 if(ADC_flag1 == 1)
  118.                 {
  119.                         ADC_flag1 = 0;
  120.                         lcd_pos(3,5);
  121.                         Disp_SZ(10/10);
  122.                         Disp_SZ(10%10);
  123.                         lcd_pos(3,6);
  124.                         Disp_HZ("V",1);

  125.                         lcd_pos(4,5);
  126.                         Disp_SZ(song_chao/1000);
  127.                         Disp_SZ(song_chao%1000/100);
  128.                         Disp_SZ(song_chao%100/10);
  129.                         Disp_SZ(song_chao%10);

  130.                         lcd_pos(4,7);
  131.                         Disp_HZ("V",1);
  132.                 }
  133.         }
  134.         else if(liang_cheng == 2)                                                //量程為10v的時候數據處理
  135.         {
  136.                 kuo_zhan(table[2]);                                                //打開10v通道
  137.                 song_chao = data0*1.9825*0.002443*1000;                                        //
  138.                 if(ADC_flag1 == 1)
  139.                 {
  140.                         ADC_flag1 = 0;
  141.                         lcd_pos(3,5);
  142.                         Disp_SZ(01/10);
  143.                         Disp_SZ(01%10);
  144.                         lcd_pos(3,6);
  145.                         Disp_HZ("V",1);

  146.                         lcd_pos(4,5);
  147.                         Disp_SZ(song_chao/1000);
  148.                         Disp_SZ(song_chao%1000/100);
  149.                         Disp_SZ(song_chao%100/10);
  150.                         Disp_SZ(song_chao%10);

  151.                         lcd_pos(4,7);
  152.                         Disp_HZ("V",1);
  153.                 }
  154.         }
  155.         else if(liang_cheng == 3)                                                //量程為10v的時候數據處理
  156.                 {
  157.                         kuo_zhan(table[3]);                                                //打開10v通道
  158.                         song_chao = data0*0.0891*0.002443*1000;                                        //
  159.                         if(ADC_flag1 == 1)
  160.                         {
  161.                                 ADC_flag1 = 0;
  162.                                 lcd_pos(3,4);
  163.                                 Disp_SZ(01/10);
  164.                                 Disp_HZ(".",1);
  165.                                 Disp_SZ(01%10);
  166.                                 lcd_pos(3,6);
  167.                                 Disp_HZ("V",1);

  168.                                 lcd_pos(4,5);
  169.                                 Disp_SZ(song_chao/1000);
  170.                                 Disp_SZ(song_chao%1000/100);
  171.                                 Disp_SZ(song_chao%100/10);
  172.                                 Disp_SZ(song_chao%10);

  173.                                 lcd_pos(4,7);
  174.                                 Disp_HZ("V",1);
  175.                         }
  176.                 }
  177. }
  178. /*
  179. * 交流電壓檢測
  180. */
  181. void jiao_liu()
  182. {
  183.         unsigned int chao_song;

  184.         lcd_pos(1,0);
  185.         Disp_HZ("★低功耗萬用表★",8);

  186.         lcd_pos(2,0);
  187.         Disp_HZ("交流電壓",4);

  188.         lcd_pos(3,0);
  189.         Disp_HZ("測量量程",4);

  190.         lcd_pos(4,0);
  191.         Disp_HZ("測量電壓",4);

  192.         if(liang_cheng == 1)                                                //量程為10v的時候數據處理
  193.         {
  194.                 chao_song = data1*3.5*0.002443*100;                //
  195.                 if(ADC_flag1 == 1)
  196.                 {
  197.                         ADC_flag1 = 0;
  198.                         lcd_pos(3,4);
  199.                         Disp_SZ(10/10);
  200.                         Disp_SZ(10%10);
  201.                         lcd_pos(3,6);
  202.                         Disp_HZ("V",1);

  203.                         lcd_pos(4,5);
  204.                         Disp_SZ(chao_song/1000);
  205.                         Disp_SZ(chao_song%1000/100);
  206.                         Disp_SZ(chao_song%100/10);
  207.                         Disp_SZ(chao_song%10);

  208.                         lcd_pos(4,7);
  209.                         Disp_HZ("V",1);
  210.                 }
  211.         }
  212.         else if(liang_cheng == 2)                                                //量程為10v的時候數據處理
  213.                 {
  214.                         chao_song = data1*3.5*0.002443*1000;                //
  215.                         if(ADC_flag1 == 1)
  216.                         {
  217.                                 ADC_flag1 = 0;
  218.                                 lcd_pos(3,4);
  219.                                 Disp_SZ(01/10);
  220.                                 Disp_SZ(01%10);
  221.                                 lcd_pos(3,6);
  222.                                 Disp_HZ("V",1);

  223.                                 lcd_pos(4,5);
  224.                                 Disp_SZ(chao_song/1000);
  225.                                 Disp_SZ(chao_song%1000/100);
  226.                                 Disp_SZ(chao_song%100/10);
  227.                                 Disp_SZ(chao_song%10);

  228.                                 lcd_pos(4,7);
  229.                                 Disp_HZ("V",1);
  230.                         }
  231.                 }
  232. }
  233. /*
  234. * 電阻電壓檢測
  235. */
  236. void dian_zu()
  237. {
  238.         lcd_pos(1,0);
  239.         Disp_HZ("★低功耗萬用表★",8);

  240.         lcd_pos(2,0);
  241.         Disp_HZ("電阻電壓",4);

  242.         lcd_pos(3,0);
  243.         Disp_HZ("測量量程",4);

  244.         lcd_pos(4,0);
  245.         Disp_HZ("測量電壓",4);

  246.         if(liang_cheng == 1)                                                //量程為10v的時候數據處理
  247.         {
  248.                 kuo_zhan(table[5]);
  249.                 if(ADC_flag1 == 1)
  250.                 {
  251.                         zu_zhi = (data2*1.3125*10);                                //100 歐姆 數據處理

  252.                         ADC_flag1 = 0;
  253.                         lcd_pos(3,5);
  254.                         Disp_SZ(10/10);
  255.                         Disp_SZ(10%10);
  256.                         lcd_pos(3,6);
  257.                         Disp_HZ("K",1);
  258.                         lcd_pos(4,5);
  259.                         Disp_SZ(zu_zhi/1000);
  260.                         Disp_SZ(zu_zhi%1000/100);
  261.                         Disp_SZ(zu_zhi%100/10);
  262.                         Disp_SZ(zu_zhi%10);

  263.                         lcd_pos(4,7);
  264.                         Disp_HZ("V",1);
  265.                 }
  266.         }
  267.         else if(liang_cheng == 2)                                                //量程為10v的時候數據處理
  268.         {
  269.                 kuo_zhan(table[6]);
  270.                 if(ADC_flag1 == 1)
  271.                 {
  272.                         zu_zhi = ((data2*0.00125438)/(1-data2*0.00125438))*1870;;                                //100 歐姆 數據處理

  273.                         ADC_flag1 = 0;
  274.                         lcd_pos(3,5);
  275.                         Disp_SZ(01/10);
  276.                         Disp_SZ(01%10);
  277.                         lcd_pos(3,6);
  278.                         Disp_HZ("K",1);
  279.                         lcd_pos(4,5);
  280.                         Disp_SZ(zu_zhi/1000);
  281.                         Disp_SZ(zu_zhi%1000/100);
  282.                         Disp_SZ(zu_zhi%100/10);
  283.                         Disp_SZ(zu_zhi%10);

  284.                         lcd_pos(4,7);
  285.                         Disp_HZ("V",1);
  286.                 }
  287.         }
  288.         else if(liang_cheng == 3)                                                //量程為10v的時候數據處理
  289.                 {
  290.                         kuo_zhan(table[7]);
  291.                         if(ADC_flag1 == 1)
  292.                         {
  293.                                 zu_zhi = ((data2*0.001244895)/(1-data2*0.001244895))*4950; //10K 歐姆的數據處理

  294.                                 ADC_flag1 = 0;
  295.                                 lcd_pos(3,5);
  296.                                 Disp_SZ(100%1000/100);
  297.                                 Disp_SZ(100%100/10);
  298.                                 Disp_SZ(100%10);
  299.                                 lcd_pos(3,7);
  300.                                 Disp_HZ("Ω",1);
  301.                                 lcd_pos(4,5);
  302.                                 Disp_SZ(zu_zhi/1000);
  303.                                 Disp_SZ(zu_zhi%1000/100);
  304.                                 Disp_SZ(zu_zhi%100/10);
  305.                                 Disp_SZ(zu_zhi%10);

  306.                                 lcd_pos(4,7);
  307.                                 Disp_HZ("V",1);
  308.                         }
  309.                 }
  310. }
  311. /*
  312. * 溫度pt100功能
  313. */
  314. void wen_du()
  315. {
  316.         wen_pt = ((32231.7975*data4+0.3150709*data4*data4)*0.000016);        //溫度的數據處理

  317.         lcd_pos(2,4);
  318.         Disp_SZ(wen_pt%1000/100);
  319.         Disp_SZ(wen_pt%100/10);
  320.         Disp_HZ(".",1);  //充電電流
  321.         Disp_SZ(wen_pt%10);

  322.         lcd_pos(2,7);
  323.         Disp_HZ("℃",1);
  324. }
  325. /*
  326. * 主函數
  327. */
  328. void main()
  329. {
  330.         int_t();
  331.         ADC();                                                        //AD功能設置
  332. //        ADC_DATA();                                                //AD轉換開始
  333.         while(1)
  334.         {
  335.                 ADC_DATA();                                                                //AD轉換開始

  336.                 if(pt100 == 1)
  337.                 {
  338.                         pt100 = 0;
  339.                         wen_du();
  340.                 }
  341.                 if(P2IN & BIT2)                                                        //直流電壓檢測檔位
  342.                 {
  343.                         zhi_liu();                                                                               //直流電壓量程選擇控制
  344.                 }
  345.                 else if(P2IN & BIT3)                                        //交流電壓檢測檔位
  346.                 {
  347.                         jiao_liu();                                                                      //直流電壓量程選擇控制
  348.                 }
  349.                 else if(P2IN & BIT4)                                        //電阻電壓檢測檔位
  350.                 {
  351.                         dian_zu();                                                                      //直流電壓量程選擇控制
  352.                 }
  353.         }
  354. }
  355. /**
  356. *名稱      看門狗 定時 中斷
  357. **/
  358. #pragma vector=WDT_VECTOR
  359. __interrupt void watchdog_timer(void)
  360. {
  361.         shua_xin++;
  362.         if(shua_xin >= 1000)
  363.         {
  364.                 shua_xin = 0;
  365.                 ADC_flag1 = 1;
  366.                 s++;
  367.                 if(s >= 50)
  368.                 {
  369.                         pt100 = 1;
  370.                 }
  371. ……………………

  372. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
數字萬用表內部資料.rar (4.99 MB, 下載次數: 137)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:497832 發表于 2019-3-25 13:16 來自手機 | 顯示全部樓層
下載試
回復

使用道具 舉報

ID:78180 發表于 2019-3-26 09:24 | 顯示全部樓層
下載試
回復

使用道具 舉報

ID:15305 發表于 2019-9-18 23:17 | 顯示全部樓層
不錯的資料,感謝樓主的分享。謝謝!
回復

使用道具 舉報

ID:1013588 發表于 2022-9-15 20:28 | 顯示全部樓層
下載了,有時間試試謝謝樓主
回復

使用道具 舉報

ID:567636 發表于 2022-9-28 10:30 | 顯示全部樓層
我也下來看看,感謝樓主的分享。謝謝!
回復

使用道具 舉報

ID:1064915 發表于 2023-4-28 14:42 | 顯示全部樓層
英文較多,希望有硬件的介紹
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚 | 最新国产精品视频 | 91青娱乐在线 | 最新中文在线视频 | 亚洲精品久久久久久久久久久久久 | www国产成人免费观看视频,深夜成人网 | 伊人久久在线 | 色综合网站 | 欧美一区二区在线 | 欧美国产视频 | 激情婷婷 | 亚洲欧美国产一区二区三区 | 亚洲高清视频在线 | 久久精品欧美视频 | 成人精品一区二区三区 | 视频一区二区三区中文字幕 | 羞羞的视频在线观看 | 日韩欧美在线视频 | 国产一区不卡在线观看 | 久久91av| 日韩资源 | 久久久久久高潮国产精品视 | 成人亚洲| 欧美一区二区免费视频 | www国产精品 | 一区二区中文字幕 | www国产精品 | 成年人在线观看视频 | 亚洲男人天堂网 | 亚洲欧美在线一区 | 男人天堂免费在线 | 91极品视频| 欧美成人一区二免费视频软件 | 日韩精品一区二区三区视频播放 | 亚洲国产精品久久久 | 日本一二三区在线观看 | 日本黄色短片 | 国产成人精品午夜 | 欧美亚洲国产一区二区三区 | 国产一区电影 | 欧美一区二区三区精品 |