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

標題: MSP430單片機制作智能數字萬用表電路圖+程序 [打印本頁]

作者: 272993740    時間: 2019-3-17 19:55
標題: 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)



作者: jihuoyouniu    時間: 2019-3-25 13:16
下載試
作者: wangoo1    時間: 2019-3-26 09:24
下載試
作者: zhengjianping02    時間: 2019-9-18 23:17
不錯的資料,感謝樓主的分享。謝謝!
作者: 龍小白    時間: 2022-9-15 20:28
下載了,有時間試試謝謝樓主
作者: htbst    時間: 2022-9-28 10:30
我也下來看看,感謝樓主的分享。謝謝!
作者: joyb    時間: 2023-4-28 14:42
英文較多,希望有硬件的介紹




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久精品99久久久久久 | 欧美色图一区二区 | 99re在线观看视频 | 国产成人一区 | 999精品在线 | 三级av片 | 国产精品欧美在线 | 成人永久免费 | 久久九九免费视频 | 亚洲欧美网站 | 国产精品久久久久久妇女6080 | 日韩欧美第一页 | 国产成人精品一区二区三区四区 | 久久机热这里只有精品 | 国产不卡视频 | 手机福利视频 | 九九热视频在线 | 国产精品毛片一区二区在线看 | 国产福利91 | 麻豆国产一区二区三区四区 | 国产男女视频 | 黄色片毛片 | 激情五月激情综合网 | 国产一区二区精品在线 | 免费av观看 | 日韩精品久久久久久久酒店 | 国产资源在线观看 | 久草福利资源站 | 国产精品天堂 | 色天堂视频 | 草草网 | 91福利片 | 成年在线观看 | 成人免费毛片嘿嘿连载视频 | 日本性网站 | 久久久夜色精品亚洲 | 狠狠网| 国产欧美日韩综合精品 | 欧美日韩中文字幕在线 | 成人国产网站 | 一级做a视频 |