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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的RLC自動測量電路+程序設計

  [復制鏈接]
跳轉到指定樓層
樓主
普渡眾生哈哈哈,交流交流,(5元買的,大家有積分就闊以下載哦)
傳統的RLC參數測量的方法種類很多,例如:直接用歐姆表測量電阻,或者對電阻兩端施加一定的電壓,利用電流表測得流過的電流值,再按照歐姆定理計算出電阻值;而對電感或電容的測試采用測量阻抗角和負阻抗,然后利用數學公式計算出電容和電抗的參數。此外還可以采用過渡過程分析方法,此方法用于計算含有儲能元器件L、C的電路的時間常數,因研究的是一個電路從一個穩態過渡到另一個穩態,此方法涉及到初始值穩態值等數據。算出時間常數,由于電路中使用已知的固定的電阻,所以可以通過公式,計算得出電抗參數。在要求測試準確度高的情況下還可以采用交流電橋法,通過調整已知參數使得電橋達到平衡,讀出電感或電容值。以上方法必須采用手工操作,而且有些方法需要測量多個數據,再進行人工計算,準確度不大,且太費時費力。在這種情況下,數字式的RLC測量儀應運而生。

電路原理圖如下:


單片機源程序如下:
  1. #include <reg51.h>
  2. #include"lcd.h"
  3. #include <stdio.h>                                          
  4. /*******************************************************************/
  5. /*宏定義 特征值
  6. /******************************************************************/
  7. #define RS_1 4078852                  //特征值  //328852   通過文獻中的公式計算出的值
  8. #define RS_2 60134752                                        //72134752
  9. #define CS_1 45067376                                    //36067376
  10. #define CS_2 8208983                                    //48089834
  11. #define LS   545077                                            //445077 通過示波器測220uh,顯示的頻率反推出的值
  12. /*******************************************************************/
  13. /*I/O口申明
  14. /******************************************************************/
  15. sbit A1 = P2^0;                                  //模擬開關地址位
  16. sbit B1 = P2^1;                              

  17. sbit kr        = P2^2;                                  //電阻擋
  18. sbit kc = P2^3;                                  //電容擋
  19. sbit kl = P2^4;           //按鍵          //電感擋

  20. sbit sr = P1^0;                                  //繼電器1 控制電阻換擋
  21. sbit sc = P1^1;           //繼電器          //繼電器2 控制電容換擋
  22. /*******************************************************************/
  23. /*變量定義
  24. /******************************************************************/
  25. uint tval = 0,f = 0,sr_f = 0,sc_f = 0,ft = 0,ff = 0;  //tval測量值,f元件標志位,sr_f電阻繼電器標志位,Sc_f電容繼電器標志位,頻率標志位
  26. unsigned long rs = RS_1,cs = CS_1,ls=LS,value = 0;   //特征值初始化

  27. /*********************************************************************/
  28. /*子函數定義
  29. /********************************************************************/

  30. /****************************************/
  31. /* 函數名:unsigned int read()
  32. /* 功能:  讀取計數器中的值
  33. /* 輸入: 無
  34. /* 輸出: 計數器中的數值
  35. /****************************************/
  36. uint read(){
  37.         uchar tl,th1,th2;
  38.         uint val;
  39.         while(1){
  40.                 th1=TH0;
  41.                 tl=TL0;
  42.                 th2=TH0;                        
  43.                 if(th1==th2)                          //保證MCU計數器工作正常
  44.                         break;
  45.         }
  46.         val=(th1<<8)+tl;                          
  47.         return val;
  48. }
  49. /****************************************/
  50. /* 函數名:unsigned int LcdDisplayInt(unsigned int num)
  51. /* 功能:  打印數字
  52. /* 輸入: 數值
  53. /* 輸出:LCD打印INT數字
  54. /****************************************/
  55. unsigned int LcdDisplayLong(unsigned long num){
  56.         unsigned char buff[11]=NULL;
  57.         unsigned int len,i;
  58.         len = sprintf(buff,"%ld",num);
  59.         for(i=0;i<len;i++){
  60.                 LcdWriteData(buff[i]);        
  61.         }
  62.         return 1;
  63. }
  64. /****************************************/
  65. /* 函數名:        void measure_R()
  66. /* 功能: 測量R
  67. /* 輸入: 特征值
  68. /* 輸出:  電阻值
  69. /****************************************/
  70. unsigned long measure_R(uint fx,unsigned long rs){
  71.    unsigned long R = 0,fr=0;
  72.    fr=ff*65535+fx;
  73.    ff=0;
  74.    if(fr != 0) R=rs/fr-110;        
  75.    return R;
  76. }
  77. /****************************************/
  78. /* 函數名:        void measure_C()
  79. /* 功能: 測量C
  80. /* 輸入: 特征值
  81. /* 輸出: 電容值
  82. /****************************************/
  83. unsigned long measure_C(uint fx,unsigned long cs){
  84.    unsigned long C = 0,fc=0;
  85.    fc=ff*65535+fx;
  86.    ff=0;
  87.    if(fc != 0) C=cs/fc;
  88.    return C;
  89. }
  90. /****************************************/
  91. /* 函數名:        void measure_L()
  92. /* 功能: 測量L
  93. /* 輸入: 特征值
  94. /* 輸出: 電感值
  95. /****************************************/
  96. unsigned long measure_L(uint fx,unsigned long ls){
  97.    unsigned long L = 0,L1 = 0,fl = 0;
  98.    fl=ff*65535+fx;
  99.    ff=0;
  100.    if(fl != 0){ L1=ls/fl;L=L1*L1;}
  101.    return L;
  102. }
  103. /****************************************/
  104. /* 函數名:        detection()
  105. /* 功能: 按鍵檢測
  106. /* 輸入: 無
  107. /* 輸出: 無
  108. /****************************************/
  109. void detection(){
  110.         //按鍵檢測         0為電阻 1為電電容 2為電感
  111.         if(kr == 0)                         { f = 0; A1 = 0;B1 = 0;}
  112.         else if(kc == 0)                 { f = 1; A1 = 0;B1 = 1;}        
  113.         else if(kl == 0)                 { f = 2; A1 = 1;B1 = 0;}                                                
  114. }
  115. /****************************************/
  116. /* 函數名:        measure()
  117. /* 功能: 測量
  118. /* 輸入: 無
  119. /* 輸出: 無
  120. /****************************************/
  121. void measure(){
  122.         switch (f){
  123.                 case 0:         //電阻測量
  124.                                 LcdWriteData('R');
  125.                                 LcdWriteData(':');
  126.                                 //電阻換擋
  127.                                 value = measure_R(tval,rs);
  128.                                 if(value >= 1000 && sr_f == 0) {
  129.                                         sr = 1;
  130.                                         rs = RS_2;
  131.                                         sr_f = 1;
  132.                                 }
  133.                                 else if(value < 1000 && sr_f == 1){
  134.                                         sr = 0;
  135.                                         rs = RS_1;
  136.                                         sr_f = 0;
  137.                                 }
  138.                                 value = measure_R(tval,rs);
  139.                         //        LcdDisplayLong(sr_f);                                 //顯示檔位
  140.                         //        LcdWriteData(':');
  141.                                 break;

  142.                 case 1:         //電容測量
  143.                                 LcdWriteData('C');
  144.                                 LcdWriteData(':');
  145.                                 value = measure_C(tval,cs);
  146.                                 //電容換擋
  147.                                 if(value < 1000 && sc_f == 0){
  148.                                         sc = 1 ;
  149.                                         cs = CS_2;
  150.                                         sc_f = 1;
  151.                                 }
  152.                                 else if(value >= 1000 && sc_f == 1){
  153.                                         sc = 0;
  154.                                         cs = CS_1;
  155.                                         sc_f = 0;
  156.                                 }
  157.                                 value = measure_C(tval,cs);
  158.                                 break;

  159.                 case 2:        //電感測量
  160.                                 LcdWriteData('L');
  161.                                 LcdWriteData(':');
  162.                                 value = measure_L(tval,ls);
  163.                                 break;

  164.                                 default:
  165.                                 break;
  166.                         }
  167. }
  168. /****************************************/
  169. /* 函數名:        unit()
  170. /* 功能:顯示單位
  171. /* 輸入: 無
  172. /* 輸出: 無
  173. /****************************************/
  174. void unit(){
  175.         switch (f){
  176.                 case 0:
  177.                                 LcdWriteData(' ');
  178.                                 LcdWriteData('O');
  179.                                 LcdWriteData('H');
  180.                                 LcdWriteData('M');
  181.                                 break;

  182.                 case 1:
  183.                                 LcdWriteData(' ');
  184.                                 LcdWriteData('P');
  185.                                 LcdWriteData('F');
  186.                                 break;

  187.                 case 2:
  188.                                 LcdWriteData(' ');
  189.                                 LcdWriteData('U');
  190.                                 LcdWriteData('H');
  191.                                 break;

  192.                                 default:
  193.                                 break;
  194.         }
  195. }
  196. /****************************************/
  197. /* 函數名:Init()
  198. /* 功能:初始化
  199. /* 輸入: 無
  200. /* 輸出: 無
  201. /****************************************/
  202. void Init(){
  203.         TMOD = 0x15;                                        //設置計數器和計時器1的工作模式
  204.         //Falg初始化
  205.         f = 0;
  206.         //配置中斷
  207.         EA = 1;
  208.         ET0 = 1;
  209.         ET1 = 1;
  210.         //初始化計數器
  211.         TH0 = 0;
  212.         TL0 = 0;
  213.         TR0 = 1;
  214.         //初始化定時器
  215.         TH1 = (65536-45782)/256;
  216.         TL1 = (65536-45782)%256;
  217.         TR1 = 1;
  218.         //初始化開關
  219.         A1 = 0;
  220.         B1 = 0;
  221.         //初始化繼電器
  222.         sr = 0;
  223.         sc = 0;
  224. }

  225. /*********************************************************************/
  226. /*主函數
  227. /********************************************************************/

  228. /****************************************/
  229. /* 函數名:void main()
  230. /* 功能: 主函數
  231. /* 輸入: 無
  232. /* 輸出: 無
  233. /****************************************/
  234. void main(){
  235.         //延時以便增加電路穩定
  236.         Lcd1602_Delay1ms(1000);
  237.         Lcd1602_Delay1ms(1000);
  238.            LcdInit();
  239.     Init();
  240.         //=======初始化完成=======
  241.                
  242.         //主循環
  243.         while(1){
  244.                 detection();        //按鍵檢測
  245.                 //屏幕顯示
  246.                 Lcd1602_Delay1ms(1000);                //延時1S
  247.                 LcdWriteCom(0x01);                        //清屏
  248.                 LcdWriteCom(0x80);                        //設置指針起點
  249.                 measure();                                        //測量
  250.                 LcdDisplayLong(value);                //顯示值
  251.                 unit();                                                //顯示單位               
  252.         }

  253. }

  254. /*********************************************************************/
  255. /*中斷子函數
  256. /********************************************************************/

  257. /****************************************/
  258. ……………………

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


所有資料51hei提供下載:
2.電路城資料.rar (327.8 KB, 下載次數: 128)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2019-3-16 02:25 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:135915 發表于 2019-3-16 11:56 | 只看該作者
很好,贊
回復

使用道具 舉報

地板
ID:491577 發表于 2019-3-16 12:26 | 只看該作者
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度是由模擬電路來保證的,單片機只是計算,顯示而已。
回復

使用道具 舉報

5#
ID:465223 發表于 2019-3-23 10:29 | 只看該作者
hhh402 發表于 2019-3-16 12:26
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度 ...

說得對,這個只是一個原理,要是高精度的話那肯定需要做出很大的改進的
回復

使用道具 舉報

6#
ID:380985 發表于 2019-4-7 18:13 來自手機 | 只看該作者
好資料
回復

使用道具 舉報

7#
ID:465223 發表于 2019-4-16 16:42 | 只看該作者
hhh402 發表于 2019-3-16 12:26
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度 ...

這個有一個可以調節誤差的參數,但是需要程序上分類討論,可能很麻煩,但是確實是一種改進誤差的方法
回復

使用道具 舉報

8#
ID:511461 發表于 2019-8-7 21:32 | 只看該作者
精度能達到多少
回復

使用道具 舉報

9#
ID:741786 發表于 2020-4-30 15:48 | 只看該作者
過的
下順德區
回復

使用道具 舉報

10#
ID:626187 發表于 2020-11-20 14:33 | 只看該作者
請問這個電阻、電容的換擋測量范圍是多少?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品日韩av不卡在线 | 国产精品久久久久久久久久久新郎 | 亚洲精品国产成人 | 偷拍第一页 | 久久精品免费 | 成人网av | 欧美日韩黄色一级片 | 成人不卡在线 | 日韩在线小视频 | 亚洲网站在线观看 | 精品一区二区三区免费视频 | 国产综合久久久久久鬼色 | 久久亚洲综合 | 99热这里有精品 | 亚洲视频中文字幕 | 天堂中文在线播放 | 男女搞网站 | 国产伊人精品 | 亚洲精品在线看 | 日本三级精品 | 国产精品激情在线 | 国产一级淫片免费视频 | 国产精品污污视频 | 欧美一区二区三区久久精品 | 毛片大全| 欧美综合国产精品久久丁香 | 色资源在线 | 国产日韩欧美在线观看 | 国产精品一区二区三区久久 | 国产精品视频在线播放 | 在线播放一区 | 精品久久中文 | 一级高清免费毛片 | 欧美亚洲视频在线观看 | 国产精品一级 | 三级成人在线观看 | 精产嫩模国品一二三区 | 欧美激情一区二区三区 | 精品免费国产视频 | 免费人成激情视频在线观看冫 | 黄色毛片网站在线观看 |