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

QQ登錄

只需一步,快速開始

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

簡(jiǎn)易電阻測(cè)試儀制作怎么做10M的量程單位 附單片機(jī)代碼

[復(fù)制鏈接]
ID:1047409 發(fā)表于 2022-11-14 23:31 | 顯示全部樓層 |閱讀模式
/************************************
*********STC89C51**********
**********12MHz晶振********/
電路原理圖如下:

原理圖

原理圖


單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include
  3. #include
  4. #define uint8 unsigned char
  5. #define uint16 unsigned int
  6. #define uchar unsigned char
  7. #define uint unsigned int


  8. uint16 cnt2ms;        //10ms計(jì)數(shù)器
  9. uint8 cnt1s;        //1秒計(jì)數(shù)器

  10. //電阻--------------------------------
  11. #define        Z1 13700053.00
  12. #define        Z2 3685279.00


  13. float RZ=0;
  14. unsigned long   RX=0;
  15. unsigned long   RX2=0;
  16. unsigned long   RX3=0;
  17. unsigned long   RX4=0;
  18. unsigned long   RX5=0;
  19. unsigned long   RX6=0;
  20. unsigned long   RX7=0;
  21. unsigned long   RX8=0;
  22. unsigned long   RX9=0;

  23. uint8 KL=0;        //
  24. unsigned int Pulsecnt=0;        //脈沖個(gè)數(shù)
  25. unsigned int Pulsenum;        //脈沖個(gè)數(shù)
  26. uint8 start=0;        //
  27. uint16 Pulseme;        //10ms計(jì)數(shù)器
  28. uint16 Pulse;        //10ms計(jì)數(shù)器
  29. bit flag=0;
  30. uint8 CH=0;        //
  31. unsigned long x;
  32. void Init_Extint(void);
  33. void TimerInitProc();

  34. void Init_System(void);
  35. void Display(uint8 chose_dat, uint8 dat);
  36. void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);
  37. void DelayMs(uint8 Ms);
  38. uint8 Pulse_FLAG=0;
  39. uint8 Pulse_5=0;
  40. /********************************按鍵*****************************************/
  41. ***it    K2=P1^4;                  //電阻檔

  42. /********************************LCD液晶**************************************/
  43. #define LCD_Data P0           //LCD的數(shù)據(jù)口
  44. ***it    LCD_BF=LCD_Data^7;    //LCD忙信號(hào)位
  45. ***it    LCD_RS=P1^0;
  46. ***it    LCD_RW=P1^1;
  47. ***it    LCD_EN=P1^2;



  48. #define LCD_GO_HOME               0x02         //AC=0,光標(biāo)、畫面回HOME位

  49. //輸入方式設(shè)置
  50. #define LCD_AC_AUTO_INCREMENT     0x06         //數(shù)據(jù)讀、寫操作后,AC自動(dòng)增一
  51. #define LCD_AC_AUTO_DECREASE      0x04         //數(shù)據(jù)讀、寫操作后,AC自動(dòng)減一
  52. #define LCD_MOVE_ENABLE           0x05         //數(shù)據(jù)讀、寫操作,畫面平移
  53. #define LCD_MOVE_DISENABLE        0x04         //數(shù)據(jù)讀、寫操作,畫面不動(dòng)

  54. //設(shè)置顯示、光標(biāo)及閃爍開、關(guān)
  55. #define LCD_DISPLAY_ON            0x0C         //顯示開
  56. #define LCD_DISPLAY_OFF           0x08         //顯示關(guān)
  57. #define LCD_CURSOR_ON             0x0A         //光標(biāo)顯示
  58. #define LCD_CURSOR_OFF            0x08         //光標(biāo)不顯示
  59. #define LCD_CURSOR_BLINK_ON       0x09         //光標(biāo)閃爍
  60. #define LCD_CURSOR_BLINK_OFF      0x08         //光標(biāo)不閃爍

  61. //光標(biāo)、畫面移動(dòng),不影響DDRAM
  62. #define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
  63. #define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
  64. #define LCD_CURSOR_LEFT_MOVE      0x10         //光標(biāo)左移一位
  65. #define LCD_CURSOR_RIGHT_MOVE     0x14         //光標(biāo)右移一位

  66. //工作方式設(shè)置
  67. #define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
  68. #define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
  69. /*定義子程序*/
  70. void LCD_ClrAll(void);              //清屏
  71. void Judge_LCD_busy(void);           //檢測(cè)是否忙碌
  72. void LCD_Write(uchar WriteData);     //寫控制字
  73. void LCD_write_data(uchar LCD_data); //寫數(shù)據(jù)顯示
  74. void LCD_cursor(uchar x);    //光標(biāo)起始地址
  75. void LCD_printc(unsigned char lcd_data) ;  //輸出一個(gè)字符
  76. void LCD_prints(unsigned char *lcd_string);//輸出字符串



  77. /*LCD1602忙碌判斷子程序*/
  78. void Judge_LCD_busy(void)   //判斷LCD1602是否忙狀態(tài)
  79. {
  80. while(1)
  81.   {
  82.    LCD_EN=0;
  83.    LCD_RS=0;
  84.    LCD_RW=1;
  85.    LCD_Data=0xff;
  86.    LCD_EN=1;   //EN 是 1—0 使能
  87.    if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。
  88.   }
  89.    LCD_EN=0;
  90. }
  91. /******LCD清屏***************/
  92. void LCD_ClrAll(void)
  93. {

  94. Judge_LCD_busy();   //判斷是否忙碌
  95. LCD_RS=0;
  96. LCD_RW=0;
  97. LCD_Data=0x01;
  98. LCD_EN=1;
  99. LCD_EN=0;

  100. }
  101. /*******LCD寫數(shù)據(jù)定義各種模式*********/
  102. void LCD_Write(uchar WriteData)   //寫指令到LCD
  103. {
  104. Judge_LCD_busy();
  105. LCD_RS=0;
  106. LCD_RW=0;

  107. P0=WriteData; //把WriteData的數(shù)據(jù)送到數(shù)據(jù)口
  108. LCD_EN=1;
  109. LCD_EN=0;
  110. }
  111. /********LCD顯示數(shù)據(jù)***********/
  112. void LCD_write_data(uchar LCD_data)      //輸出一個(gè)字節(jié)數(shù)據(jù)到LCD
  113. {
  114. Judge_LCD_busy();
  115. LCD_RS=1;
  116. LCD_RW=0;

  117. P0=LCD_data;
  118. LCD_EN=1;
  119. LCD_EN=0;
  120. }
  121. /****光標(biāo)位置的確定***/
  122. void LCD_cursor(uchar x)            //LCD光標(biāo)定位到x處
  123. {
  124. LCD_Write(0x80+x);                       //第一行地址是0x80

  125. }
  126. /*輸出一個(gè)字符*/
  127. void LCD_printc(unsigned char lcd_data)
  128. {
  129. LCD_write_data(lcd_data);
  130. }

  131. /*輸出字符串*/
  132. void LCD_prints(unsigned char *lcd_string)
  133. {
  134. unsigned char i=0;
  135. while(lcd_string[i]!=0x00)
  136.   {
  137.    LCD_write_data(lcd_string[i]);
  138.    i++;
  139.   }
  140. }

  141. /*初始化程序*/
  142. void LCD_initial(void)                        //初始化LCD
  143. {
  144. LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
  145. LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
  146. LCD_Write(LCD_DISPLAY_DOUBLE_LINE);
  147. LCD_ClrAll();

  148. }

  149. /****延時(shí)******/
  150. void delay_1ms(uint x)
  151. {
  152. uint j;
  153. uchar i;
  154. for(j=0;j<x;j++)
  155. {
  156. for(i=0;i<120;i++);
  157. }
  158. }
  159. void Key_SM(void){

  160.         if(K2==0){
  161.              delay_1ms(5);
  162.             if(K2==0){                  
  163.                 LCD_cursor(0x00);            
  164.                 LCD_prints("   MEASURE Rx   ");  
  165.                //----電阻檔-------
  166.                 CH=1;//電阻檔     

  167.                 while(K2==0){}
  168.                      }

  169.                 }
  170. }

  171. void  Value_to_ASCII(unsigned long value,uchar add)
  172. {
  173.     unsigned char temp[] = "0000.000K ";
  174.     temp[0] = value/1000000 + 0x30;//數(shù)值改成字符,液晶顯示需要ASCII碼
  175.     value = value%1000000;
  176.     temp[1] = value/100000 + 0x30;
  177.     value = value%100000;
  178.     temp[2] = value/10000 + 0x30;
  179.     value = value%10000;
  180.     temp[3] = value/1000 + 0x30;
  181.     value = value%1000;
  182.     temp[5] = value/100 + 0x30;
  183.     value = value%100;
  184.     temp[6] = value/10 + 0x30;
  185.     value = value%10;
  186.     temp[7] = value + 0x30;  

  187.     LCD_cursor(add);   //光標(biāo)起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
  188.     LCD_prints(temp);
  189. }
  190. //--------------------主程序--------------------------------
  191. void main()
  192. {

  193.       TMOD=0x51;                 //設(shè)置定時(shí)器0,方式1:16位定時(shí)器
  194.       TH1=0;
  195.       TL1=0;
  196.       TH0=(65536-2000)/256; //設(shè)定定時(shí)周期
  197.       TL0=(65536-2000)%256;
  198.       TR0=1;
  199.       TR1=1;
  200.       ET1=1;
  201.       ET0=1;
  202.       EA=1;
  203. //----電阻檔-------
  204.     LCD_initial();
  205.          delay_1ms(50);
  206.     LCD_initial();
  207.          delay_1ms(50);
  208.     LCD_cursor(0x00);

  209.     LCD_prints("   MEASURE Rx   ");
  210.     LCD_cursor(0x45);
  211.     CH=1;

  212.         while(1)
  213.         {

  214.      Key_SM();
  215.     if(flag==1){

  216.         flag=0;

  217.         x=Pulsenum*65536+TH1*256+TL1;//計(jì)算1s內(nèi)的脈沖個(gè)數(shù),頻率=脈沖個(gè)數(shù)
  218. if(CH==1){

  219.         RZ=(Z1/x);//測(cè)量100到1000
  220.         RX=RZ-1000;
  221.         RX=RX>>1;

  222. if(RX>=1005){
  223.         RX=RX-1005;
  224.     }else{RX=0;}

  225.     if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}
  226.   if(RX>1000000){RX=1000000; }

  227.               RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度

  228. RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
  229.               //保存上一次的阻值

  230.          Value_to_ASCII(RX2,0x44);//更新阻值顯示



  231. }
  232.          cnt2ms=0;
  233.          Pulsenum=0;
  234.          TH1=0;
  235.          TL1=0;
  236.          TR1=1;

  237.     }
  238.       
  239.         }
  240. }
  241. /*******************************************************************************
  242. * 函 數(shù) 名: Exti0_interrupt
  243. * 函數(shù)功能: /T0引腳下降沿進(jìn)入中斷
  244. * 入口參數(shù): 無
  245. * 返    回: 無
  246. *******************************************************************************/
  247. void T1_interrupt(void) interrupt 3 using 0
  248. {

  249.   Pulsenum++;        //保存測(cè)得脈搏值  
  250.       
  251. }
  252. /********************************************************************
  253. 函數(shù)功能:定時(shí)器/計(jì)數(shù)器1中斷處理
  254. 入口參數(shù):null
  255. 返    回:null
  256. 備    注:null
  257. ********************************************************************/
  258. void Timer0IntProc() interrupt 1 using 0 //2ms
  259. {
  260.   TH0=(65536-2000)/256;
  261.   TL0=(65536-2000)%256;
  262.     cnt2ms++;

  263.         if(cnt2ms==497)        //1s計(jì)時(shí)到
  264.         {

  265.         TR1=0;


  266.                 cnt2ms = 0;
  267.             
  268.         flag=1;
  269.         }

  270. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:819198 發(fā)表于 2022-11-15 08:29 | 顯示全部樓層
好像這種電路是用555產(chǎn)生脈沖,然后測(cè)量頻率或脈寬,然后計(jì)算得到阻值。
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-11-15 09:06 | 顯示全部樓層
先不忙程序。
你打算如何測(cè)量呢?
先給出測(cè)量方案,再按方案定程序。
回復(fù)

使用道具 舉報(bào)

ID:1047409 發(fā)表于 2022-11-15 20:39 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-11-15 09:06
先不忙程序。
你打算如何測(cè)量呢?
先給出測(cè)量方案,再按方案定程序。

如果設(shè)計(jì)圖里不改變,在用代碼做測(cè)量
回復(fù)

使用道具 舉報(bào)

ID:1047409 發(fā)表于 2022-11-15 20:40 | 顯示全部樓層
rz12345 發(fā)表于 2022-11-15 08:29
好像這種電路是用555產(chǎn)生脈沖,然后測(cè)量頻率或脈寬,然后計(jì)算得到阻值。

但是1M以上有點(diǎn)難
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-11-16 11:11 | 顯示全部樓層
方法:
買幾個(gè)標(biāo)準(zhǔn)(已知)阻值的電阻,對(duì)之進(jìn)行測(cè)量,記錄下測(cè)試結(jié)果:A1,A2,A3,......
實(shí)際測(cè)量時(shí),如果遇到A1,A2,A3,......這幾個(gè)值時(shí),你就會(huì)想到那幾個(gè)標(biāo)準(zhǔn)電阻了。
回復(fù)

使用道具 舉報(bào)

ID:1047409 發(fā)表于 2022-11-17 17:51 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-11-16 11:11
方法:
買幾個(gè)標(biāo)準(zhǔn)(已知)阻值的電阻,對(duì)之進(jìn)行測(cè)量,記錄下測(cè)試結(jié)果:A1,A2,A3,......
實(shí)際測(cè)量時(shí),如 ...

哈哈哈謝謝,但是看不懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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