找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3758|回复: 7
收起左侧

MAX111数字万用表单片机源程序 12864显示

  [复制链接]
ID:217168 发表于 2017-7-4 18:09 | 显示全部楼层 |阅读模式
用12864液晶屏来显示的单片机数字万用表制作资料,菜单显示处理很经典:
0.png

单片机源程序如下:
  1. /************************************************************************************************
  2. 控制说明:

  3.         电阻测量:       10: send0(0x80);        100: send0(0x81);
  4.                                  1K: send0(0x82);        10K: send0(0x83);
  5.                                100K: send0(0x84);         1M: send0(0x85);
  6.                                 10M: send0(0x86);

  7.     直流电压测量:100MV: send1(0x04);
  8.                     10V: send1(0x08);
  9.                    100V: send1(0x10);
  10.                    10KV: send1(0x20);

  11.     交流电压测量:100MV: send1(0x06);
  12.                     10V: send1(0x0a);
  13.                    100V: send1(0x12);
  14.                    10KV: send1(0x22);

  15.     直流电流测量:  1MA: send2(0x02);
  16.                    10MA: send2(0x04);
  17.                   100MA: send2(0x08);
  18.                     10A: send2(0x10);

  19.     交流电流测量:  1MA: send2(0x03);
  20.                    10MA: send2(0x05);
  21.                   100MA: send2(0x09);
  22.                     10A: send2(0x11);

  23. 注:初始化时要全部处于非工作状态<send0(0x08) send1(0x00) send2(0x00)>使用时选择相应指令,返回时关断.
  24. *************************************************************************************************/
  25. #include <reg52.h>
  26. #include <stdio.h>
  27. #include <intrins.h>
  28. #include <string.h>
  29. #include <math.h>
  30. #include "ziku.h"         //字库

  31. sbit key_up   = P3^2;     //光标上移按键
  32. sbit key_down = P3^3;     //光标下移按键
  33. sbit key_ok   = P3^4;     //确定按键
  34. sbit key_back = P3^5;     //退出按键
  35. sbit ZLDL     = P3^0;     //

  36. /***  利用二维数组存放字模  ***/
  37. unsigned char code arrayadress0[][4];
  38. unsigned char code arrayadress1[][12];
  39. unsigned char code arrayadress2[][16];
  40. unsigned char code arrayadress3[][8];
  41. unsigned char code arrayadress4[][4];
  42. unsigned char code arrayadress5[][8];
  43. unsigned char code arrayadress6[][16];
  44. unsigned char code arrayadress7[][12];

  45. /*****  函数声明  *****/
  46. extern void InitLCD();                           //液晶初始化函数
  47. extern void delay1ms(unsigned char x);           //延时1ms函数
  48. extern void delay10ms(unsigned char x);          //延时10ms函数
  49. extern void biaoge();                            //画表格函数
  50. extern void Clrscreen(unsigned char m);          //送指定数据函数
  51. extern double duqudata0(unsigned char i);         //采集数据函数
  52. extern double duqudata1_1(unsigned char i);         //采集数据函数
  53. extern double duqudata1_2(unsigned char i);         //采集数据函数
  54. extern double duqudata1_3(unsigned char i);         //采集数据函数
  55. extern double duqudata2(unsigned char i);         //采集数据函数
  56. extern double duqudata3(unsigned char i);         //采集数据函数
  57. extern void send0(unsigned char abc);            //串口发送子函数(控制电阻档)
  58. extern void send1(unsigned char abc);            //模拟串口发送子函数(控制电压档)
  59. extern void send2(unsigned char abc);            //模拟串口发送子函数(控制电压档)
  60. extern void Clrscreen_ge(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth);    //送固定数据\画表格
  61. extern void Clrscreen_data(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth);  //送固定数据函数
  62. extern void display_GD(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,signed char KY,signed char HY,unsigned char *china_code);  //移动显示函数
  63. extern void display(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);     //随意显示函数
  64. extern void display_LM(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);  //拉幕显示
  65. extern void QU_ASCII(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);    //动态数字显示

  66. void InitJDQ();                                  //初始化继电器
  67. void display_start();                            //开屏显示内容
  68. void display_RES();                              //进入电阻档显示界面
  69. void display_VOL();                              //进入电压档显示界面
  70. void display_GAL();                              //进入电流档显示界面
  71. void display_figure(unsigned char i);            //采集处理的数字显示
  72. void display_dat();                              //采集数据处理显示

  73. /**** 全局变量定义 ****/
  74. unsigned char k;
  75. unsigned char Z,Z0,Z1,Z2;                       
  76. double number,numb,N=0,Y;
  77. /********************************************************************************************************
  78. void InitJDQ()  //初始化继电器                                       
  79. *********************************************************************************************************/
  80. void InitJDQ()
  81. {
  82. send0(0x08);
  83. send1(0x00);
  84. send2(0x00);
  85. ZLDL=0;
  86. }
  87. /********************************************************************************************************
  88. void display_start()  //开屏显示内容
  89. *********************************************************************************************************/
  90. void display_start()
  91. {
  92.   Clrscreen(0x00);
  93.   display(0,0,4,12,arrayadress1[0]);                        //电阻测量
  94.   display(2,0,4,12,arrayadress1[8]);                          //短路检测
  95.   display(4,0,6,12,arrayadress1[16]);                          //直流电压测量
  96.   display(6,0,6,12,arrayadress1[28]);                      //交流电压测量
  97.   display(0,56,6,12,arrayadress1[40]);                     //直流电流测量
  98.   display(2,56,6,12,arrayadress1[52]);                     //交流电流测量
  99.   display(4,80,4,12,arrayadress1[64]);                     //频率测量
  100. }                                
  101. /*******************************************************************************************************
  102. void display_RES()  //进入电阻档显示界面
  103. *********************************************************************************************************/
  104. void display_RES()
  105. {
  106.     Clrscreen(0x00);
  107.     display(0,0,6,12,arrayadress7[0]);          //请选择档位:
  108.     display(6,32,8,12,arrayadress7[12]);        //选择后请按确认键
  109.     display(2,6,2,8,arrayadress3[12]);          //10
  110.     display(2,34,3,8,arrayadress3[16]);         //100
  111.     QU_ASCII(2,70,1,8,"1");
  112.     display(2,78,1,8,arrayadress3[10]);         //1K
  113.     display(2,98,2,8,arrayadress3[12]);         
  114.     display(2,114,1,8,arrayadress3[10]);        //10K
  115.     display(4,6,3,8,arrayadress3[16]);           
  116.     display(4,30,1,8,arrayadress3[10]);         //100K
  117.     QU_ASCII(4,60,1,8,"1");
  118.     display(4,68,1,8,arrayadress3[6]);          //1M         
  119.     display(4,98,2,8,arrayadress3[12]);         
  120.     display(4,114,1,8,arrayadress3[6]);          //10M
  121. }
  122. /******************************************************************************************************
  123. void display_VOL()  //进入电压档显示界面
  124. ***********************************************************************************************************/
  125. void display_VOL()
  126. {
  127.    Clrscreen(0x00);
  128.    display(0,0,6,12,arrayadress7[0]);           //请选择档位:
  129.    display(6,32,8,12,arrayadress7[12]);         //选择后请按确认键
  130.    display(2,22,3,8,arrayadress3[16]);
  131.    display(2,46,1,8,arrayadress3[6]);                  
  132.    display(2,54,1,8,arrayadress3[0]);           //100MV
  133.    display(2,82,2,8,arrayadress3[12]);            
  134.    display(2,98,1,8,arrayadress3[0]);           //10V
  135.    display(4,22,3,8,arrayadress3[16]);            
  136.    display(4,46,1,8,arrayadress3[0]);           //100V
  137.    QU_ASCII(4,82,1,8,"1");
  138.    display(4,90,1,8,arrayadress3[10]);
  139.    display(4,98,1,8,arrayadress3[0]);          //1KV
  140. }
  141. /*****************************************************************************************************
  142. void display_GAL()  //进入电流档显示界面
  143. ******************************************************************************************************/
  144. void display_GAL()
  145. {
  146.    Clrscreen(0x00);
  147.    display(0,0,6,12,arrayadress7[0]);           //请选择档位:
  148.    display(6,32,8,12,arrayadress7[12]);         //选择后请按确认键
  149.    QU_ASCII(2,22,1,8,"1");                     
  150.    display(2,32,2,8,arrayadress3[6]);           //1MA
  151.    display(2,74,2,8,arrayadress3[12]);            
  152.    display(2,92,2,8,arrayadress3[6]);           //10MA
  153.    display(4,22,3,8,arrayadress3[16]);            
  154.    display(4,48,2,8,arrayadress3[6]);           //100MA
  155.    display(4,82,2,8,arrayadress3[12]);            
  156.    display(4,100,1,8,arrayadress3[8]);          //10A
  157. }
  158. /******************************************************************************************************
  159. void display_figure()  //采集处理数字显示
  160. *******************************************************************************************************/
  161. void display_figure(unsigned char i)
  162. {
  163. switch(i)
  164.   {
  165.    case 1: QU_ASCII(3,k,1,8,"1"); break;
  166.    case 2: QU_ASCII(3,k,1,8,"2"); break;
  167.    case 3: QU_ASCII(3,k,1,8,"3"); break;
  168.    case 4: QU_ASCII(3,k,1,8,"4"); break;
  169.    case 5: QU_ASCII(3,k,1,8,"5"); break;
  170.    case 6: QU_ASCII(3,k,1,8,"6"); break;
  171.    case 7: QU_ASCII(3,k,1,8,"7"); break;
  172.    case 8: QU_ASCII(3,k,1,8,"8"); break;
  173.    case 9: QU_ASCII(3,k,1,8,"9"); break;
  174.    default: QU_ASCII(3,k,1,8,"0");
  175.   }
  176. }
  177. /******************************************************************************************************
  178. void display_dat()  //采集数据处理显示
  179. *******************************************************************************************************/
  180. void display_dat()
  181. {
  182. unsigned char j;
  183. j=number;
  184. if(j/100)                                    //判断最高位是否为十位
  185.   {
  186.    k=32;                                     //全局变量K(显示起始列)的赋值
  187.    Z0=number/100;                             //取十位上的数值
  188.    display_figure(Z0);                       //显示数据(switch...case)
  189.    number=number-Z0*100;                      //减掉十位数据
  190.    k+=8;
  191.    Z0=number/10;                             //取十位上的数值
  192.    display_figure(Z0);                       //显示数据(switch...case)
  193.    number=number-Z0*10;                      //减掉十位数据
  194.    k+=8;                                     //列地址加八
  195.    Z0=number/1;                              //取个位数值
  196.    display_figure(Z0);                       //显示数据(switch...case)   
  197.    display(3,56,1,4,arrayadress0[0]);        //小数点显示
  198.    number=number-Z0*1;                       //减掉个位数据                       
  199.    k+=12;
  200.    Z0=number/0.1;                            //取小数点后第一位的数值
  201.    display_figure(Z0);
  202.    number=number-Z0*0.1;
  203.    k+=8;
  204.    Z0=number/0.01;                           //取小数点后第二位的数值
  205.    display_figure(Z0);
  206.    number=number-Z0*0.01;
  207.    k+=8;
  208.    Z0=number/0.001;                          //取小数点后第三位的数值;
  209.    display_figure(Z0);
  210.   }
  211. else if(j/10)                                    //判断最高位是否为十位
  212.   {
  213.    Clrscreen_data(0x00,3,32,8);
  214.    k=40;                                     //全局变量K(显示起始列)的赋值
  215.    Z0=number/10;                             //取十位上的数值
  216.    display_figure(Z0);                       //显示数据(switch...case)
  217.    number=number-Z0*10;                      //减掉十位数据
  218.    k+=8;                                     //列地址加八
  219.    Z0=number/1;                              //取个位数值
  220.    display_figure(Z0);                       //显示数据(switch...case)   
  221.    display(3,56,1,4,arrayadress0[0]);        //小数点显示
  222.    number=number-Z0*1;                       //减掉个位数据                       
  223.    k+=12;
  224.    Z0=number/0.1;                            //取小数点后第一位的数值
  225.    display_figure(Z0);
  226.    number=number-Z0*0.1;
  227.    k+=8;
  228.    Z0=number/0.01;                           //取小数点后第二位的数值
  229.    display_figure(Z0);
  230.    number=number-Z0*0.01;
  231.    k+=8;
  232.    Z0=number/0.001;                          //取小数点后第三位的数值;
  233.    display_figure(Z0);
  234.   }
  235. else if(j/1)                                //判断最高位是否为个位
  236.   {
  237.    Clrscreen_data(0x00,3,40,8);   
  238.    k=48;
  239.    Z1=number/1;
  240.    display_figure(Z1);                       //显示数据(switch...case)  
  241.    display(3,56,1,4,arrayadress0[0]);        //小数点显示
  242.    number=number-Z1*1;
  243.    k+=12;
  244.    Z1=number/0.1;
  245.    display_figure(Z1);
  246.    number=number-Z1*0.1;
  247.    k+=8;
  248.    Z1=number/0.01;
  249.    display_figure(Z1);
  250.    number=number-Z1*0.01;
  251.    k+=8;
  252.    Z1=number/0.001;
  253.    display_figure(Z1);
  254.   }
  255. else                                        //显示小于1的数
  256.   {
  257.    Clrscreen_data(0x00,3,40,8);
  258.    QU_ASCII(3,48,1,8,"0");
  259.    display(3,56,1,4,arrayadress0[0]);        //小数点显示
  260.    k=60;                                                                                       
  261.    Z2=number/0.1;
  262.    display_figure(Z2);
  263.    number=number-Z2*0.1;
  264.    k+=8;
  265.    Z2=number/0.01;
  266.    display_figure(Z2);
  267.    number=number-Z2*0.01;
  268.    k+=8;
  269.    Z2=number/0.001;
  270.    display_figure(Z2);
  271.   }
  272. }
  273. /*************************************************************************/
  274. void main()
  275. {
  276. signed char i,j;
  277. InitLCD();
  278. Clrscreen(0x00);                                 //清屏
  279. InitJDQ();                                       //继电器初始化
  280. do
  281. {
  282. //  W_G();
  283. for(i=96,j=0;i>=0,j<64;i--,j++)
  284. {
  285.   display_GD(1,i,j,16,96,0,arrayadress2[0]);     //水平滚动           欢迎使用
  286.   delay1ms(50);
  287.   }
  288. display_LM(3,23,80,16,arrayadress2[8]);         //拉幕         数字万用表
  289. delay10ms(200);
  290. /**************************************************************************************************电阻测量/
  291. ***********************************************************************************************************/
  292. start_1:
  293. display_start();                                //主屏显示
  294. start_1_0:
  295. do
  296. {
  297. //  W_G();
  298.   Clrscreen_data(0xff,0,0,48);                   //光标闪动
  299.   delay10ms(43);
  300.   display(0,0,4,12,arrayadress1[0]);
  301.   delay10ms(100);   
  302. }while(key_up==1&key_down==1&key_ok==1);        //按键判断
  303. if(key_up==0) goto start_7_0;                   //光标上移
  304. else if(key_down==0) goto start_2_0;            //光标下移
  305. else if(key_ok==0)                              //确认
  306.   {
  307. RES:
  308. display_RES();   
  309. RES_10:
  310.    do
  311.     {
  312.      Clrscreen_data(0x00,2,4,20);                            //光标闪动
  313.      delay10ms(43);
  314.      display(2,6,2,8,arrayadress3[12]);                     
  315.      delay10ms(100);   
  316.     }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  317.    if(key_up==0) goto RES_10M_0;                             //光标上移
  318.    else if(key_down==0) goto RES_100_0;                      //光标下移
  319.    else if(key_ok==0)                                        //确认
  320.         {
  321.      Clrscreen(0x00);                                        //清屏
  322.      display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  323.      display(3,92,1,16,arrayadress6[0]);                     //Ω
  324.      biaoge();
  325.      send0(0x80);                                            //相应继电器控制选择档位                                
  326.      do
  327.          {
  328.      for(i=0;i<5;i++)                                        //MAX111采集5次
  329.       {
  330.         number=duqudata0(1);
  331.                 N=N+number;
  332.           }
  333.       number=N/5;                                            //求5次采集的平均值
  334.           N=0;
  335.           number=(40*number)/(0.65-number);
  336.       display_dat();                                         //对采集数据的处理显示
  337.           }while(key_back==1);
  338.           send0(0x08);                                           //关继电器
  339.           goto RES;
  340.          }
  341.          else goto start_1;
  342. /*******************************************************************************************************/
  343. RES_100:
  344.   display_RES();
  345. RES_100_0:
  346.         do
  347.          {
  348.       Clrscreen_data(0x00,2,32,28);                           //光标闪动
  349.       delay10ms(43);
  350.       display(2,34,3,8,arrayadress3[16]);                     
  351.       delay10ms(100);
  352.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  353.     if(key_up==0) goto RES_10;                                //光标上移
  354.     else if(key_down==0) goto RES_1K_0;                       //光标下移
  355.     else if(key_ok==0)                                        //确认
  356.          {
  357.       Clrscreen(0x00);                                        //清屏
  358.           display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  359.       display(3,92,1,16,arrayadress6[0]);                     //Ω
  360.       biaoge();
  361.           send0(0x81);                                            //相应继电器控制选择档位
  362.           do
  363.           {
  364.       for(i=0;i<5;i++)                                        //MAX111采集5次
  365.        {
  366.         number=duqudata0(1);
  367.                 N=N+number;
  368.            }
  369.       number=N/5;                                            //求5次采集的平均值
  370.           N=0;
  371.           number=(400*number)/(3.21-number);
  372.       display_dat();                                         //对采集数据的处理显示
  373.           }while(key_back==1);
  374.           send0(0x08);                                           //关继电器
  375.          goto RES_100;
  376.     }
  377.         else goto start_1;
  378. /*************************************************************************************************/
  379. RES_1K:
  380.   display_RES();
  381. RES_1K_0:
  382.         do
  383.          {
  384.       Clrscreen_data(0x00,2,68,20);                           //光标闪动
  385.       delay10ms(43);
  386.       QU_ASCII(2,70,1,8,"1");
  387.       display(2,78,1,8,arrayadress3[10]);                     
  388.       delay10ms(100);
  389.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  390.     if(key_up==0) goto RES_100_0;                             //光标上移
  391.     else if(key_down==0) goto RES_10K_0;                      //光标下移
  392.     else if(key_ok==0)                                        //确认
  393.          {
  394.       Clrscreen(0x00);                                        //清屏
  395.           display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  396.       display(3,92,1,8,arrayadress3[10]);                     //K
  397.       display(3,100,1,16,arrayadress6[0]);                    //Ω
  398.       biaoge();
  399.           send0(0x82);                                            //相应继电器控制选择档位
  400.       do
  401.           {
  402.       for(i=0;i<5;i++)                                        //MAX111采集5次
  403.        {
  404.         number=duqudata0(1);
  405.                 N=N+number;
  406.            }
  407.       number=N/5;                                            //求5次采集的平均值
  408.           N=0;
  409.           number=(4*number)/(4.27-number);                       //1K
  410.       display_dat();                                         //对采集数据的处理显示
  411.           }while(key_back==1);
  412.           send0(0x08);                                           //关继电器
  413.           goto RES_1K;
  414.          }
  415.          else goto start_1;
  416. /*************************************************************************************************/
  417. RES_10K:
  418.   display_RES();
  419. RES_10K_0:
  420.         do
  421.          {
  422.       Clrscreen_data(0x00,2,96,28);                           //光标闪动
  423.       delay10ms(43);
  424.       display(2,98,2,8,arrayadress3[12]);         
  425.       display(2,114,1,8,arrayadress3[10]);                       
  426.       delay10ms(100);
  427.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  428.     if(key_up==0) goto RES_1K_0;                              //光标上移
  429.     else if(key_down==0) goto RES_100K_0;                     //光标下移
  430.     else if(key_ok==0)                                        //确认
  431.          {
  432.       Clrscreen(0x00);                                        //清屏
  433.            display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  434.       display(3,92,1,8,arrayadress3[10]);                     //K
  435.       display(3,100,1,16,arrayadress6[0]);                    //Ω
  436.       biaoge();
  437.           send0(0x83);                                            //相应继电器控制选择档位
  438.           do
  439.           {
  440.       for(i=0;i<5;i++)                                        //MAX111采集5次
  441.        {
  442.         number=duqudata0(1);
  443.                 N=N+number;
  444.            }
  445.       number=N/5;                                             //求5次采集的平均值
  446.           N=0;
  447.           number=(40*number)/(4.5-number);
  448.       display_dat();                                          //对采集数据的处理显示
  449.           }while(key_back==1);
  450.           send0(0x08);                                            //关继电器
  451.           goto RES_10K;
  452.          }
  453.          else goto start_1;
  454. /*************************************************************************************************/
  455. RES_100K:
  456.   display_RES();  
  457. RES_100K_0:
  458.         do
  459.          {
  460.       Clrscreen_data(0x00,4,4,36);                            //光标闪动
  461.       delay10ms(43);
  462.       display(4,6,3,8,arrayadress3[16]);           
  463.       display(4,30,1,8,arrayadress3[10]);                       
  464.       delay10ms(100);
  465.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  466.     if(key_up==0) goto RES_10K_0;                             //光标上移
  467.     else if(key_down==0) goto RES_1M_0;                       //光标下移
  468.     else if(key_ok==0)                                        //确认
  469.          {
  470.       Clrscreen(0x00);                                        //清屏
  471.            display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  472.       display(3,92,1,8,arrayadress3[10]);                     //K
  473.       display(3,100,1,16,arrayadress6[0]);                    //Ω
  474.       biaoge();
  475.           send0(0x84);                                            //相应继电器控制选择档位
  476.           do
  477.           {
  478.       for(i=0;i<5;i++)                                        //MAX111采集5次
  479.        {
  480.         number=duqudata0(1);
  481.                 N=N+number;
  482.            }
  483.       number=N/5;                                            //求5次采集的平均值
  484.           N=0;
  485.           number=(400*number)/(4.67-number);
  486.       display_dat();                                         //对采集数据的处理显示
  487.           }while(key_back==1);
  488.           send0(0x08);                                           //关继电器
  489.           goto RES_100K;
  490.          }
  491.          else goto start_1;
  492. /*************************************************************************************************/
  493. RES_1M:
  494.   display_RES();
  495. RES_1M_0:
  496.         do
  497.          {
  498.       Clrscreen_data(0x00,4,58,20);                           //光标闪动
  499.       delay10ms(43);
  500.       QU_ASCII(4,60,1,8,"1");
  501.       display(4,68,1,8,arrayadress3[6]);                     
  502.       delay10ms(100);
  503.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  504.     if(key_up==0) goto RES_100K_0;                            //光标上移
  505.     else if(key_down==0) goto RES_10M_0;                      //光标下移
  506.     else if(key_ok==0)                                        //确认
  507.          {
  508.       Clrscreen(0x00);                                        //清屏
  509.           display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  510.       display(3,92,1,8,arrayadress3[6]);                      //M
  511.       display(3,100,1,16,arrayadress6[0]);                    //Ω
  512.       biaoge();
  513.           send0(0x85);                                            //相应继电器控制选择档位
  514.           do
  515.           {
  516.       for(i=0;i<5;i++)                                        //MAX111采集5次
  517.        {
  518.         number=duqudata0(1);
  519.                 N=N+number;
  520.            }
  521.       number=N/5;                                             //求5次采集的平均值
  522.           N=0;
  523.           number=(4*number)/(4.82-number);
  524.       display_dat();                                          //对采集数据的处理显示
  525.           }while(key_back==1);
  526.           send0(0x08);                                            //关继电器
  527.           goto RES_1M;
  528.          }
  529.          else  goto start_1;
  530. /*************************************************************************************************/
  531. RES_10M:
  532.   display_RES();
  533. RES_10M_0:
  534.         do
  535.          {
  536.       Clrscreen_data(0x00,4,96,28);                           //光标闪动
  537.       delay10ms(43);
  538.       display(4,98,2,8,arrayadress3[12]);         
  539.       display(4,114,1,8,arrayadress3[6]);                       
  540.       delay10ms(100);
  541.           }while(key_up==1&key_down==1&key_ok==1&key_back);        //按键判断
  542.     if(key_up==0) goto RES_1M_0;                              //光标上移
  543.     else if(key_down==0) goto RES_10;                         //光标下移
  544.     else if(key_ok==0)                                        //确认
  545.          {
  546.       Clrscreen(0x00);                                        //清屏
  547.           display(1,6,5,16,arrayadress4[0]);                      //当前阻值
  548.       display(3,92,1,8,arrayadress3[6]);                      //M
  549.       display(3,100,1,16,arrayadress6[0]);                    //Ω
  550.       biaoge();
  551.           send0(0x86);                                            //相应继电器控制选择档位
  552.           do
  553.           {
  554.       for(i=0;i<5;i++)                                        //MAX111采集5次
  555.        {
  556.         number=duqudata0(1);
  557.                 N=N+number;
  558.            }
  559.       number=N/5;                                             //求5次采集的平均值
  560.           N=0;
  561.           number=(40*number)/(5.55-number);
  562.       display_dat();                                          //对采集数据的处理显示
  563.           }while(key_back==1);
  564.           send0(0x08);                                            //关继电器
  565.           goto RES_10M;
  566.          }
  567.          else goto start_1;
  568. }
  569. /*************************************************************************************************/
  570. /**************************************************************************************************短路检测/  
  571. ***********************************************************************************************************/
  572. start_2:
  573. display_start();
  574. start_2_0:
  575. do
  576. {
  577. //  W_G();
  578.   Clrscreen_data(0xff,2,0,48);                   //光标闪动
  579.   delay10ms(43);
  580.   display(2,0,4,12,arrayadress1[8]);
  581.   delay10ms(100);   
  582. }while(key_up==1&key_down==1&key_ok==1);        //按键判断
  583. if(key_up==0) goto start_1_0;                   //光标上移
  584. else if(key_down==0) goto start_3_0;            //光标下移
  585. else if(key_ok==0)                              //确认
  586.   {
  587.    Clrscreen(0x00);                              //清屏
  588.    display(1,6,5,16,arrayadress4[40]);           //线路状态
  589.    biaoge();
  590.   do
  591.   {
  592. R_10:
  593.    do
  594.    {
  595.     send0(0x80);
  596.     numb=duqudata3(1);
  597.     if(numb<1)
  598.     {
  599.      send0(0xc0);                              //蜂鸣器响
  600.      number=(40*numb)/(0.65-numb);
  601.      display_dat();
  602.      display(3,92,1,16,arrayadress6[0]);
  603.          Clrscreen_data(0x00,3,109,18);
  604.     }
  605.     else goto R_100;
  606.    }while(numb<1&key_back==1);
  607.    send0(0x00);                                //关继电器
  608.    goto start_2;
  609. R_100:
  610.    do
  611.    {
  612.     send0(0x81);
  613.     numb=duqudata3(1);
  614.     if(numb<1)
  615.     {
  616.          if(numb<0.5) goto R_10;
  617.          else
  618.      send0(0xc1);                              //蜂鸣器响
  619.      number=(400*numb)/(3.21-numb);
  620.      display_dat();
  621.      display(3,92,1,16,arrayadress6[0]);
  622.          Clrscreen_data(0x00,3,109,18);
  623.     }
  624.     else goto R_1K;
  625.    }while(numb<1&key_back==1);
  626.    send0(0x00);                                //关继电器
  627.    goto start_2;
  628. R_1K:
  629.    do
  630.    {
  631.     send0(0x82);
  632.     numb=duqudata3(1);
  633.     if(numb<1)
  634.     {
  635.          if(numb<0.5) goto R_100;
  636.          else
  637.      number=(4*numb)/(4.27-numb);
  638.      display_dat();
  639.      display(3,92,1,8,arrayadress3[10]);                     //K
  640.      display(3,100,1,16,arrayadress6[0]);                    //Ω
  641.     }
  642.     else goto R_10K;
  643.    }while(numb<1&key_back==1);
  644.    send0(0x00);                                //关继电器
  645.    goto start_2;
  646. R_10K:
  647.    do
  648.    {
  649.     send0(0x83);
  650.     numb=duqudata3(1);
  651.     if(numb<1)
  652.     {
  653.          if(numb<0.5) goto R_1K;
  654.          else
  655.      number=(40*numb)/(4.5-numb);
  656.      display_dat();
  657.      display(3,92,1,8,arrayadress3[10]);                     //K
  658.      display(3,100,1,16,arrayadress6[0]);                    //Ω
  659.     }
  660.     else goto R_100K;
  661.    }while(numb<1&key_back==1);
  662.    send0(0x00);                                //关继电器
  663.    goto start_2;
  664. R_100K:
  665.    do
  666.    {
  667.     send0(0x84);
  668.     numb=duqudata3(1);
  669.     if(numb<1)
  670.     {
  671.           if(numb<0.5) goto R_10K;
  672.          else
  673.      number=(400*numb)/(4.67-numb);
  674.      display_dat();
  675.      display(3,92,1,8,arrayadress3[10]);                     //K
  676.      display(3,100,1,16,arrayadress6[0]);                    //Ω
  677.     }
  678.     else goto R_1M;
  679.    }while(numb<1&key_back==1);
  680.    send0(0x00);                                //关继电器
  681.    goto start_2;
  682. R_1M:
  683.    do
  684.    {
  685.     send0(0x85);
  686.     numb=duqudata3(1);
  687.     if(numb<1)
  688.     {
  689.          if(numb<0.5) goto R_100K;
  690.          else
  691.      number=(4*numb)/(4.82-numb);
  692.      display_dat();
  693.      display(3,92,1,8,arrayadress3[6]);                      //M
  694.      display(3,100,1,16,arrayadress6[0]);                    //Ω
  695.     }
  696.     else goto R_10M;
  697.    }while(numb<1&key_back==1);
  698.    send0(0x00);                                //关继电器
  699.    goto start_2;
  700. R_10M:
  701.    do
  702.    {
  703.     send0(0x86);
  704.     numb=duqudata3(1);
  705.     if(numb<1)
  706.     {
  707.          if(numb<0.5) goto R_1M;
  708.          else
  709.      number=(40*numb)/(5.55-numb);
  710.      display_dat();
  711.      display(3,92,1,8,arrayadress3[6]);                      //M
  712.      display(3,100,1,16,arrayadress6[0]);                    //Ω
  713.     }
  714.     else
  715.     {
  716.          Clrscreen_data(0x00,3,30,18);
  717.          QU_ASCII(3,48,1,8,"0");
  718.          display(3,56,1,4,arrayadress0[0]);        //小数点显示
  719.          QU_ASCII(3,60,1,8,"0");
  720.          QU_ASCII(3,68,1,8,"0");
  721.          QU_ASCII(3,76,1,8,"0");
  722.          Clrscreen_data(0x00,3,84,42);
  723.         }
  724.    }while(numb<1&key_back==1);
  725.   }while(key_back==1);
  726.    send0(0x00);                                //关继电器
  727.    goto start_2;
  728.   }
  729. /**********************************************************************************************直流电压测量/

  730. ***********************************************************************************************************/
  731. start_3:
  732. display_start();
  733. start_3_0:
  734. do
  735. {
  736. //  W_G();
  737.   Clrscreen_data(0xff,4,0,72);                   //光标闪动
  738.   delay10ms(43);
  739.   display(4,0,6,12,arrayadress1[16]);
  740.   delay10ms(100);   
  741. }while(key_up==1&key_down==1&key_ok==1);        //按键判断
  742. if(key_up==0) goto start_2_0;                   //光标上移
  743. else if(key_down==0) goto start_4_0;            //光标下移
  744. else if(key_ok==0)                              //确认
  745.   {
  746. VOL:
  747.   display_VOL();

  748. ……………………

  749. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
(数字万用表)程序.zip (169.93 KB, 下载次数: 57)
回复

使用道具 举报

ID:203945 发表于 2017-7-7 06:18 | 显示全部楼层
不知道准确度怎么样。。
回复

使用道具 举报

ID:217754 发表于 2017-7-21 00:52 | 显示全部楼层
这个牛逼了。。得下玩玩
回复

使用道具 举报

ID:167337 发表于 2017-7-21 09:59 | 显示全部楼层
楼主,没有电路图,原理图难仿哦!
回复

使用道具 举报

ID:597472 发表于 2019-8-8 09:56 | 显示全部楼层
有原理图吗
回复

使用道具 举报

ID:688460 发表于 2020-4-24 23:37 | 显示全部楼层
楼主,能分享一下原理图就非常完美了!不过还是要感谢您的!谢谢!
回复

使用道具 举报

ID:686739 发表于 2020-4-25 07:25 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:1013588 发表于 2022-9-16 08:50 | 显示全部楼层
下载了看看能用不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表