標(biāo)題: 單片機(jī)數(shù)字萬用表仿真+程序+調(diào)試說明(可測電壓 電流 電阻) [打印本頁]

作者: qiyedata    時間: 2018-12-8 19:39
標(biāo)題: 單片機(jī)數(shù)字萬用表仿真+程序+調(diào)試說明(可測電壓 電流 電阻)
數(shù)字萬用表  能夠測量電壓 電流 電阻  電壓是單量程
參加學(xué)校內(nèi)比賽用的,希望對大家有幫助
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真說明:
1.        解開壓縮后打開仿真文件,點(diǎn)擊運(yùn)行按鍵進(jìn)行仿真。
2.        按切換檔位按鍵可以切換電壓、電流、電阻的測量;
3.        在仿真過程中可以調(diào)節(jié)滑動變阻器“RV1”來模擬改變電阻值,在冊電阻的檔位可以看出阻值變化。
4.        改變電壓和電流量需要停止仿真,然后“R5(2)”/“R3(1)”那個綠色箭頭,在跳出的對話框可以修改輸入的模擬量參數(shù)。點(diǎn)擊確認(rèn)后再運(yùn)行仿真就可以看到修改的測量值。

您好:
請您在拿到實(shí)物調(diào)試前首先閱讀本篇使用說明,否則出現(xiàn)的后果本店概不負(fù)責(zé),敬請諒解。
注意事項(xiàng):
收到商品以后,請注意以下幾個使用注意的地方:
1.        不要隨意將電路板上的線頭短接,尤其電源正負(fù)極不能反接;
2.        插上電源前,在電路板下面放一張紙或其他絕緣的物品,防止背面有金屬短接;
3.        測量各個模擬量需要保證參數(shù)在測量范圍內(nèi),否則容易燒壞電路。
4.        測電壓和電流時將正表筆與正極相連,負(fù)表筆與負(fù)極相連不要接反;

使用方法:
1.        插上USB接口就可進(jìn)行工作;
2.        液晶屏上面的黑色小按鍵,是切換檔位的按鍵,可以切換電壓、電流、電阻的測量;
3.        電路板上的紅線和黑線分別是萬用表的正表筆和負(fù)表筆;其中負(fù)表筆在使用過程中不需要變動,正表筆在測量不同的量時需要手動切換(方法是將紅色的線插到相應(yīng)的針子上);

注意實(shí)際測量時電壓不可超過10v,電流不可超過500mA,這是極限值,千萬不可超過

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /***************引腳聲明*********************/
  6. #define lcd P0
  7. sbit rs=P2^7;          //LCD液晶控制端
  8. sbit en=P2^6;
  9. sbit SPK=P1^7;  //蜂鳴器引腳
  10. sbit CS=P1^2;   //將CS位定義為P1.2引腳
  11. sbit CLK=P1^0;  //將CLK位定義為P1.0引腳
  12. sbit DIO=P1^1;  //將DIO位定義為P1.1引腳
  13. sbit key=P2^5;  //定義按鍵引腳
  14. sbit a=P2^0;                //模擬量通道選擇端
  15. sbit b=P2^1;                //模擬量通道選擇端
  16. sbit c=P2^2;                //模擬量通道選擇端

  17. /***********LCD顯示數(shù)組**************************/
  18. uchar code table0[]="  DCV(0-5V)   ";
  19. uchar table1[]="  V=0000.00 v";
  20. uchar code table2[]="  DCI(0-100mA)";
  21. uchar table3[]="  I=0000.00mA";
  22. uchar code table4[]="  R(0-1k)     ";
  23. uchar table5[]="  R=000.0    ";

  24. /***************全局變量************************/
  25. uchar flag=0;      //換擋標(biāo)志位


  26. void delay(uint count)                 //延時
  27. {
  28.   uint i,j;
  29.   for(i=0;i<count;i++)
  30.    for(j=0;j<120;j++);
  31. }

  32. /*************LCD1602驅(qū)動程序************************/
  33. void w_cmd(uchar com)                  //lcd1602寫命令
  34. {
  35.   rs=0;
  36.   lcd=com;
  37.   en=1;
  38.   delay(5);
  39.   en=0;
  40. }

  41. void w_data(uchar dat)                  //lcd1602讀數(shù)據(jù)
  42. {
  43.   rs=1;
  44.   lcd=dat;
  45.   en=1;
  46.   delay(5);
  47.   en=0;
  48. }

  49. void w_str(uchar *s)       //lcd1602寫字符串
  50. {
  51.     while(*s)  w_data(*s++);
  52. }

  53. void init()                     //lcd1602初始化
  54. {
  55.   en=0;
  56.   w_cmd(0x38);
  57.   w_cmd(0x0c);
  58.   w_cmd(0x06);
  59.   w_cmd(0x01);
  60. }

  61. /*****************************************************
  62. 函數(shù)功能:將模擬信號轉(zhuǎn)換成數(shù)字信號
  63. ***************************************************/
  64. unsigned char  A_D()
  65. {
  66.   unsigned char i,dat;
  67.    CS=1;   //一個轉(zhuǎn)換周期開始
  68.    CLK=0;  //為第一個脈沖作準(zhǔn)備
  69.    CS=0;  //CS置0,片選有效
  70.    DIO=1;    //DIO置1,規(guī)定的起始信號  
  71.    CLK=1;   //第一個脈沖
  72.    CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  73.    DIO=1;   //DIO置1, 通道選擇信號  
  74.    CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選通道CH0
  75.    CLK=0;   //第二個脈沖下降沿
  76.    
  77.    DIO=0;   //DI置0,選擇通道0
  78.    CLK=1;    //第三個脈沖
  79.    CLK=0;    //第三個脈沖下降沿
  80.    DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1
  81.    CLK=1;    //第四個脈沖
  82.    for(i=0;i<8;i++)  //高位在前
  83.     {
  84.       CLK=1;         //第四個脈沖
  85.       CLK=0;
  86.       dat<<=1;       //將下面儲存的低位數(shù)據(jù)向右移
  87.    dat|=(unsigned char)DIO;   //將輸出數(shù)據(jù)DIO通過或運(yùn)算儲存在dat最低位
  88.     }            
  89.     CS=1;          //片選無效
  90.   return dat;  //將讀書的數(shù)據(jù)返回     
  91. }
  92. /**********************報警程序************************/
  93. void BaoJing(void)
  94. {  
  95.         uint i, j;
  96.         for (i = 0; i < 200; i++)    //產(chǎn)生脈沖使蜂鳴器發(fā)出聲音
  97.         {
  98.          SPK = 0; for (j = 0; j < 100; j++);
  99.          SPK = 1; for (j = 0; j < 100; j++);
  100.   }         
  101. }
  102. /*********************按鍵判定************************************/
  103. void keyscan()
  104. {
  105.         if(key==0)                   //判斷是否按下
  106.         {
  107.                 delay(10);
  108.                 if(key==0)
  109.                 {
  110.                         while(!key);
  111.                         flag++;
  112.                         if(flag>3) flag=0;
  113.                        
  114.                 }
  115.         }
  116. }
  117. /*******************定時器1初始化程序******************/
  118. void Timer1_Init(void) //
  119. {
  120.         TMOD=0x11;       
  121.         TH1 = ( 65535 - 50000 ) / 256;   //0.2ms
  122.         TL1 = ( 65535 - 50000 ) % 256;
  123.         ET1=1;               
  124.         TR1=1;         
  125.         EA=1;
  126. }
  127. /*******************定時器1中斷程序********************/
  128. void Timer1 ( void ) interrupt 3  //定時器1中斷函數(shù) 0.2ms
  129. {
  130.         TH1 = ( 65535 - 50000) / 256;  
  131.         TL1 = ( 65535 - 50000 ) % 256;
  132.         keyscan();   //按鍵判定
  133. }

  134. /*主函數(shù)*/                                                               
  135. void main()
  136. {
  137.   uint adval;
  138.   unsigned long int temp;
  139.   init();         //液晶初始化       
  140.   Timer1_Init();  //定時器1初始化       
  141.   while(1)
  142.   {
  143.          
  144.          if(flag==0)                 //直流電壓測量
  145.          {       
  146.                         c=0;b=0;a=0;    //通道選擇
  147.                         w_cmd(0x80);
  148.                         w_str(table0);
  149.                         adval=A_D();    //進(jìn)行A/D轉(zhuǎn)換
  150.                         temp=adval* 5.0/255* 2*100;  //轉(zhuǎn)換成實(shí)際電壓并放大100倍
  151.                         if(temp>500)
  152.                         {
  153.                                 BaoJing();   //超量程報警
  154.                                 w_cmd(0xc0+0x00);       
  155.                                 w_str("  V= .OL  v  ");
  156.                                 delay(500);
  157.                         }
  158.                         else
  159.                         {
  160.                                 table1[4]=temp/100000+0x30;
  161.                                 table1[5]=temp%100000/10000+0x30;
  162.                                 table1[6]=temp%10000/1000+0x30;
  163.                                 table1[7]=temp%1000/100+0x30;
  164.                                 table1[9]=temp%100/10+0x30;
  165.                                 table1[10]=temp%10+0x30;                       
  166.                                 w_cmd(0xc0+0x00);       
  167.                                 w_str(table1);               
  168.                                 delay(10);
  169.                         }
  170.          }

  171.          if(flag==1)           //          直流電流測量
  172.          {
  173.                         c=0;b=0;a=1;    //通道選擇
  174.                         w_cmd(0x80);
  175.                         w_str(table2);               
  176.                         adval=A_D();    //進(jìn)行A/D轉(zhuǎn)換
  177.                         temp=adval*0.1/255*5000000/10;
  178.                         if(temp>10000)
  179.                         {
  180.                                 BaoJing();   //超量程報警
  181.                                 w_cmd(0xc0+0x00);       
  182.                                 w_str("  I= .OL mA  ");
  183.                                 delay(500);
  184.                         }
  185.                         else
  186.                         {
  187.                                 table3[4]=temp/100000+0x30;
  188.                                 table3[5]=temp%100000/10000+0x30;
  189.                                 table3[6]=temp%10000/1000+0x30;
  190.                                 table3[7]=temp%1000/100+0x30;
  191.                                 table3[9]=temp%100/10+0x30;
  192.                                 table3[10]=temp%10+0x30;       
  193.                                 w_cmd(0xc0+0);       
  194.                                 w_str(table3);
  195.                                
  196.                                 delay(10);
  197.                         }
  198.     }
  199.           if(flag==2)           //          電阻測量
  200.           {   
  201. ……………………

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

所有資料51hei提供下載:
數(shù)字萬用表-直流單量程 超量程報警.zip (108.67 KB, 下載次數(shù): 298)



作者: lovejim159    時間: 2018-12-18 11:35
仿真打不開呀
作者: 春陰釀寒    時間: 2019-2-16 02:10
目前在思考這個問題,謝謝大佬!
作者: 而又個人糖果    時間: 2019-6-16 00:31
挺厲害的
作者: hgtfdfgggt    時間: 2019-8-10 10:08
感謝樓主分享

作者: syl0372    時間: 2020-2-15 19:43
感謝樓主分享
作者: 請?jiān)O(shè)置用戶名    時間: 2020-3-19 21:35
剩下的程序在附件的哪里啊





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1