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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機(jī)和NE555的3檔電容測試器的設(shè)計(仿真+代碼)

[復(fù)制鏈接]
ID:142045 發(fā)表于 2018-12-21 07:29 | 顯示全部樓層 |閱讀模式
開機(jī)屏幕顯示歡迎界面
1、插入電容,按下相應(yīng)nf、pf、uf、uf按鍵選擇檔位;
2、按下測試按鍵,屏幕出現(xiàn)提示信息,提示檔位選擇低或者高,如正常檔位屏幕顯示當(dāng)前測量電容值;
3、對于大容量電容要多按幾次測試鍵方能顯示正常值;
4、復(fù)位按鍵按下系統(tǒng)復(fù)位。

設(shè)計的主要方法是采用555芯片構(gòu)成單穩(wěn)態(tài)觸發(fā)器,將電容容量轉(zhuǎn)換為脈沖寬度。通過單片機(jī)的計時器測量脈寬, 根據(jù)已知的R值,通過單片機(jī)的運(yùn)算功能,計算出電容容量,最后,再通過單片機(jī)的普通I/O口控制液晶屏顯示出電容容量的計算結(jié)果。系統(tǒng)的測量范圍為10pF~ 500uF, 具有多個量程,可根據(jù)用戶需要由用戶選擇,與用戶的交互是通過鍵盤實現(xiàn),不同量程的實現(xiàn)是通過單片機(jī)的I/O口控制繼電器的吸合與斷開來選擇不同的R值,從而實現(xiàn)不同的量程。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真電路圖

仿真電路圖
0.png

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include "1602.h"
  3. #include "delay.h"

  4. sbit vo = P3^2;             // 用于檢測P3.2口的值,計算時間。  計時器0的開與斷
  5. sbit tr = P3^7;                                                                 // 產(chǎn)生一個低電平脈沖
  6.                                                                                   // 超量程提示燈
  7. sbit ledclc = P2^0;

  8. sbit con1 = P1^5;                            // 用于控制繼電器,實現(xiàn)檔位選擇
  9. sbit con2 = P1^6;                                                               
  10. sbit con3 = P1^7;                                                               

  11. sbit key1 = P1^0;                                                          // 獨(dú)立按鍵部分,用于用戶選擇量程
  12. sbit key2 = P1^1;
  13. sbit key3 = P1^2;
  14. sbit key4 = P1^3;

  15. sbit led1 = P2^1;                                                          // 量程提示燈
  16. sbit led2 = P2^2;
  17. sbit led3 = P2^3;
  18. sbit led4 = P2^4;


  19. unsigned int tw;                                // 用于獲取定時器的數(shù)值

  20. float ftemp;                                                                         // 用于計算電容值的中間變量

  21. unsigned long int c;                                                                // 存放電容值

  22. unsigned char need;                                                         // 需要測量時置1,一次測量結(jié)束置0
  23. unsigned char R;                            // 表示不同的檔位
  24. unsigned char flag;                                  // 數(shù)據(jù)處理結(jié)束置1
  25. unsigned char temp[8];                        // 存放電容值的各個位         
  26. unsigned char zimu1[] = " range is higher";                   //量程太高
  27. unsigned char zimu2[] = "The value of Cap";
  28. unsigned char zimu3[] = "please press key";
  29. unsigned char zimu4[] = "     to measure ";
  30. unsigned char zimu5[] = " range is lower ";        
  31. void process(unsigned long int c);                         // 數(shù)據(jù)處理函數(shù)
  32. void keyscan();                                                                 // 鍵盤掃描函數(shù)
  33. void ledlight(unsigned char R);                                         //        量程指示燈函數(shù)
  34. void init_timer0()                                     // 定時器0  初始化   
  35. {
  36.         TMOD = 0x09;                   // gate置1,方式1,16位計時,定時器由P3.2控制開斷
  37.         TH0 = 0x00;
  38.         TL0 = 0x00;
  39.         EA   = 1;
  40.         ET0 = 1;                                            
  41.         TR0 = 1;
  42. }
  43. void init_INT1 ()                                                                    // 定時器0  初始化
  44. {
  45.         EA = 1;
  46.         IT1 = 1;                                      // 下降沿觸發(fā)
  47.         EX1 = 1;
  48. }                  
  49. void main()
  50. {
  51.          ledclc = 1;                                                                    // 超量程提示燈熄滅
  52.          need = 0;                                                // 一開始無需測量
  53.     con1 = con2 = con3 = 1;
  54.         flag = 0;
  55.           init_timer0();                                                                    // 初始化
  56.         init_INT1();
  57.         LCD_init();
  58.          dispchar1(zimu3);
  59.         dispchar2(zimu4);
  60.         while(1)
  61.         {
  62.                   if(need == 1)
  63.                 {                                                                                        // 當(dāng)需要測量時
  64.                         if(vo == 0 ) //vo == 0時檢測計數(shù)器的值可能還沒開始計數(shù),可能計數(shù)結(jié)束
  65.                         {
  66.                                  if(TH0 != 0x00 || TL0 != 0x00) // 是計數(shù)結(jié)束 若有讀數(shù),用tw 存下
  67.                                  {
  68.                                           tw = TH0 << 8;
  69.                                          tw = tw | TL0;        
  70.                                          TH0 = 0x00;                               // 一次結(jié)束,計時器清零
  71.                                          TL0 = 0x00;
  72.                      need = 0;    // 需要再次測量時,need置1.避免tw的值被更//改   即不需要測量時,一直保持
  73.                                          EX1 = 1;                                                 // 開外部中斷1
  74.                                  }
  75.                                  else          // 反之,證明沒有計數(shù),無電容,默認(rèn)值tw置0
  76.                                  {
  77.                                          tw = 0;
  78.                                  }
  79.                         }

  80.                         ftemp = tw / 1.1  ; // 計算電容值   根據(jù)公式 tw = 1.1 * R * C

  81.                         c = (unsigned long int)(ftemp )*100;    //擴(kuò)大了一百倍   便于后續(xù)程序
  82. //取兩位小數(shù)點(diǎn)
  83.                         process(c);                 // 調(diào)用數(shù)據(jù)處理函數(shù),根據(jù)不同的R值進(jìn)行處理                                                                                                                                                        
  84.                 }                                                         
  85.                 if(flag == 1 ) // 數(shù)據(jù)處理結(jié)束   每次處理結(jié)束,證明需要更新顯示的數(shù)據(jù)
  86.                 {
  87.                         if(tw>=50000 || ledclc == 0)                        // 量程超出
  88.                         {
  89.                                 dispchar3(zimu1);               // 量程太高
  90.                                 ledclc = 0;
  91.                         }                                                
  92.                         else if(tw<=100 && ledclc == 1)                   //量程太低
  93.                         {
  94.                                 dispchar3(zimu5);
  95.                                 ledclc = 0;
  96.                         }
  97.                         else   
  98.                       {
  99.                                 dispchar1(zimu2);
  100.                                 disp(temp);
  101.                         }                                                         
  102.                         flag = 0;
  103.                 }               
  104.                 keyscan();
  105.         }   
  106. }

  107. void timer0()  interrupt 1                      // 定時器0中斷  用于超量程提示
  108. {
  109.          ledclc = 0;
  110. }

  111. void exint1        () interrupt 2          // 外部中斷0  用于產(chǎn)生低脈沖,啟動555定時器
  112. {
  113.         unsigned char a;
  114.         tr = 1;                                                            // tr端一個負(fù)脈沖
  115.         a = 1;
  116.         while(--a);
  117.         tr = 0;
  118.         a = 20;
  119.         while(--a);
  120.         tr = 1;                               // tr端負(fù)脈沖結(jié)束           大約40us的負(fù)脈沖
  121.         need = 1;                                                                                // 表示需要測量
  122.         ledclc = 1;                                                                            // 關(guān)閉先前的超量程提示
  123.         EX1 = 0;                 // 暫時關(guān)閉外部中斷,一次測量結(jié)束,再開放外部中斷
  124. }

  125. void process(unsigned long int c)
  126. {
  127.                 if(R == 1)          // 10M         的電阻                   量程10pf ~ 5000pf
  128.                 {
  129.                         c = c /10;                  
  130.                          lcd_pos(0x4a);
  131.                            LCD_write_Data(' ');
  132.                         LCD_write_Data('p');
  133.                         LCD_write_Data('f');
  134.                         LCD_write_Data(' ');
  135.                         LCD_write_Data(' ');
  136.                 }
  137.                 if(R == 2)                  // 100k 的電阻               量程5nf~ 500nf
  138.                 {
  139.                         c = c /100;                  
  140.                          lcd_pos(0x4a);
  141.                            LCD_write_Data(' ');
  142.                         LCD_write_Data('n');
  143.                         LCD_write_Data('f');
  144.                         LCD_write_Data(' ');
  145.                         LCD_write_Data(' ');                        
  146.                 }
  147.                 if(R == 3)                      //1k歐姆 的電阻                   量程0.5uf ~ 50uf
  148.                 {
  149.                         c = c /1000;                 // 擴(kuò)大了一百倍 單位  c = tw/500   uf
  150.                          lcd_pos(0x4a);
  151.                            LCD_write_Data(' ');
  152.                         LCD_write_Data('u');
  153.                         LCD_write_Data('f');
  154.                         LCD_write_Data(' ');
  155.                         LCD_write_Data(' ');                     
  156.                 }
  157.                 if(R == 4)                 //100歐姆 的電阻                   量程50uf ~ 500uf
  158.                 {
  159.                         c = c /100;                  // 擴(kuò)大了一百倍 單位  c = tw/500   uf
  160.                          lcd_pos(0x4a);
  161.                            LCD_write_Data(' ');
  162.                         LCD_write_Data('u');
  163.                         LCD_write_Data('f');
  164.                         LCD_write_Data(' ');
  165.                         LCD_write_Data(' ');                                                        
  166.                 }
  167.                 temp[0] = c / 100000;                                // 千位
  168.                 temp[1] = c / 10000 % 10;                        // 百位                                       
  169.                 temp[2] = c / 1000 % 10;                           // 十位
  170.                 temp[3] = c / 100 %10;                            // 個位        
  171.                 temp[4] = c / 10 % 10;            
  172.                 temp[5] = c  % 10;
  173.                 flag = 1;
  174. }
  175. void keyscan()
  176. {
  177.         if(key1 == 0)
  178.         {
  179.                 delay_ms(10);
  180.                 if(key1 == 0)                                        //  b3按下
  181.                 {
  182.                         while(key1==0);
  183.                         R = 1;        // 10M 的電阻               量程10pf~ 5000pf(5nf)
  184.                         con1 = 0;
  185.                         con2 = 0;
  186.                         con3 = 0;
  187.                         ledclc = 1;
  188.                         dispchar1(zimu3);
  189.                         dispchar2(zimu4);
  190.                 }
  191.         }
  192.         if(key2 == 0)                                                                           //  b4按下
  193.         {
  194.                 delay_ms(10);
  195.                 if(key2 == 0)
  196.                 {
  197.                         while(key2==0);
  198.                         R = 2;             // 100k 的電阻               量程5nf~ 500nf
  199.                         con1 = 1;
  200.                         con2 = 1;
  201.                         con3 = 0;
  202.                         ledclc = 1;
  203.                         dispchar1(zimu3);
  204.                         dispchar2(zimu4);
  205.                 }
  206.         }

  207.         if(key3 == 0)                                                                             //  b5按下
  208.         {
  209.                 delay_ms(10);
  210.                 if(key3 == 0)
  211.                 {
  212.                         while(key3==0);
  213.                         R = 3;
  214.                         con1 = 0;       // 1k歐姆 的電阻                   量程0.5uf ~ 50uf
  215.                         con2 = 1;
  216.                         con3 = 1;
  217.                         ledclc = 1;
  218.                         dispchar1(zimu3);
  219.                         dispchar2(zimu4);
  220.                 }
  221.         }
  222.         if(key4 == 0)                                                                             //  b6按下
  223.         {
  224.                 delay_ms(10);
  225.                 if(key4 == 0)
  226.                 {
  227.                         while(key4==0);
  228.                         R = 4;
  229.                         con1 = 0;       // 100歐姆 的電阻           量程50uf ~ 500uf
  230.                         con2 = 0;
  231.                         con3 = 1;
  232.                         ledclc = 1;
  233.                         dispchar1(zimu3);
  234.                         dispchar2(zimu4);
  235.                 }
  236.         }
  237.         ledlight(R);
  238. }        
  239. ……………………

  240. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
程序及仿真.zip (90.48 KB, 下載次數(shù): 190)


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:443911 發(fā)表于 2019-8-7 21:29 | 顯示全部樓層
請問Nte-r22-5是什么元件
回復(fù)

使用道具 舉報

ID:598151 發(fā)表于 2019-8-9 09:14 | 顯示全部樓層
原理圖可以分享下嘛
回復(fù)

使用道具 舉報

ID:269960 發(fā)表于 2019-8-10 10:33 來自手機(jī) | 顯示全部樓層
是測得C?的容值嗎,怎么所有選項都是range is lower
回復(fù)

使用道具 舉報

ID:722171 發(fā)表于 2020-4-8 17:13 來自手機(jī) | 顯示全部樓層
有沒有pcb圖
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人久久久 | 日韩中文字幕视频 | 成人超碰在线 | 久久久国产精品入口麻豆 | 国产午夜在线观看 | 九九热免费视频在线观看 | 中文字幕日韩在线 | 久久综合99 | 精品国产久 | 亚洲视频一区在线 | 久久久久久中文字幕 | 伊人网一区| 99精品欧美一区二区三区综合在线 | 成年免费大片黄在线观看岛国 | 免费久久精品 | 一区二区三区视频免费观看 | 天天干在线播放 | 国产 日韩 欧美 中文 在线播放 | 日韩av大片免费看 | 亚洲免费精品 | 天天拍天天操 | 日韩高清国产一区在线 | 亚洲视频自拍 | 欧美精品片| 日本精品视频一区二区 | 欧美日韩不卡在线 | 亚洲欧美精 | 成人视屏在线观看 | 一区二区在线免费播放 | 成人免费视频网站在线观看 | 69电影网 | 影音先锋中文在线 | 精品国产欧美 | 欧美国产精品一区二区 | 日韩欧美二区 | 黄色精品 | 午夜免费福利影院 | 日本不卡一区 | 福利av在线 | 97色综合 | 久久精品色欧美aⅴ一区二区 |