找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13938|回复: 11
打印 上一主题 下一主题
收起左侧

开源,目前最发烧的逻辑笔 号称最小万用表

  [复制链接]
跳转到指定楼层
楼主
前段时间自制了一个逻辑笔自己玩.自我感觉良好.   后来在原有硬件电路上扩充软件功能就有了现在的版本  

到目前为止先发布这一个版本吧,   

目前功能有:1 直流电压测量,   2 通断测量,  3 二极管测量,  4 方波输出,

(逻辑判断 能测量大多数流行VCC电压电路. 如 : 5V, 4.5V, 3.3V, 2.5V,真正能作为调试工具使用)

供电电压:  5V  可以使用USB.  也可以可以使用有手动开关的移动电源供电
测量是共地的, 有9个发光管显示状态

看图:





















原理图:



说明书:

优酷地址:
http://i.youku.com/u/UNDU0OTU4MDUy
软件,PCB, 文档:  使用最自由的开源许可 MIT,  欢迎复制.改进....  转帖需要站长同意!
逻辑笔.rar (1.13 MB, 下载次数: 122)


自己有加工团队.加工产品方便多了...^_^

另外我也准备了一些套件,都装配好了.可以直接拿回去玩 点击这里  http://t.cn/R7IvOFP  22 一只.  比目前X宝销量最大的还便宜 5 快

补充:
移动电源可是有讲究的.  一般小负载没法托起, 电流太小了.
(市面上在售的移动电源,90%以上都是用了自动开机/关机设计,这里面90%以上关机电流是小于60mA.   60mA一下负载就关机啦.  有些蓝牙耳机,脱机编程器都不能直接用)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:85764 发表于 2015-7-18 15:04 | 只看该作者
  1. /*---------------------------------------------------------------------------------------------
  2. Projest:  电压逻辑笔
  3. Author: Wang Jiati [王家体]
  4. Note:

  5. 编译器版本: HOLTEK C V3.31.  09/05/2014发布

  6. Product    Name : ____________
  7. MCU        Name : HT66F04
  8. File       Name : D:\WANGJIATI\DESKTOP\逻辑笔\电压逻辑笔\电压逻辑笔.MTP
  9. HT-IDE     Ver. : V7.85
  10. Compiler   Ver. : HGASM 020
  11. Linker     Ver. : V8.6
  12. CFG        Ver. : V4.3
  13. ------------------------------------------------------------------------------------------------
  14. MTP File Checksum:[ DA00H ]
  15. Program Checksum:[ 76BEH ]
  16. Program+Option Checksum:[ 7771H ]
  17. Program+Option+Data Checksum:[ B731H ]
  18. ------------------------------------------------------------------------------------------------
  19. LVR Function                                                     Enable
  20. LVR Voltage Selection                                            2.55V
  21. High Speed/Low Speed System Oscillator Selection - fosc          HIRC+LIRC
  22. fsub clock source                                                LIRC
  23. HIRC frequency selection                                         8MHz @ Vdd=5V
  24. PTC clock source fptc                                            LIRC
  25. XTAL OSC(1~24MHZ) build-in R enable                              enable
  26. WDT clock Selection -fs                                          fsub
  27. Watchdog Timer Function                                          Enable
  28. CLRWDT Instructions Selection                                    1 instruction
  29. PA7/RES Pin Options                                              I/O pin
  30. ------------------------------------------------------------------------------------------------

  31. ------------------------------------------------------------------------------------------------*/

  32. /*--------------------------------------------------------------------------------------*/
  33. /*History   2014-9-22  V1.1  
  34. ----------------------------------------------------------------------------------------*/

  35. #include "HT66F04.h"
  36. /*----------------------------------------------------------------------------------------
  37.    宏定义
  38. ----------------------------------------------------------------------------------------*/
  39. #define  FREQ  8000000           //时钟速度

  40. #define  LED_9_PIN_H    _pa6
  41. #define  LED_9_PIN_CON  _pac6
  42. #define  LED_8_PIN_L    _pa6
  43. #define  LED_8_PIN_CON  _pac6
  44. #define  LED_7_PIN_H    _pa5
  45. #define  LED_7_PIN_CON  _pac5
  46. #define  LED_6_PIN_L    _pa5
  47. #define  LED_6_PIN_CON  _pac5
  48. #define  LED_5_PIN_H    _pa4
  49. #define  LED_5_PIN_CON  _pac4
  50. #define  LED_4_PIN_L    _pa4
  51. #define  LED_4_PIN_CON  _pac4
  52. #define  LED_3_PIN_H    _pa3
  53. #define  LED_3_PIN_CON  _pac3
  54. #define  LED_2_PIN_L    _pa3
  55. #define  LED_2_PIN_CON  _pac3
  56. #define  LED_1_PIN_H    _pa1
  57. #define  LED_1_PIN_CON  _pac1

  58. #define  Constant_PIN   _pa2

  59. #define  ADC_COUNTER    8          //中位值采样次数.ADC缓冲去长度
  60. #define  KEY_R_T0       40         //按键长按识别常熟

  61. #define  EE_first   0x01           //第一次上电识别,初始化
  62. #define  EE_vdd     0x08           //量程设置存储位置
  63. #define  EE_offset  EE_vdd+1       //偏置存储位置
  64. #define  EE_Gain    EE_offset+2    //增益系数存储位置

  65. /* BIT/BYTE MANIPULATION ---*/
  66. #define  FALSE 0
  67. #define  TRUE 1
  68. #define  MAKE8(var, offset)        (((var >> (offset*8)) & 0xff)
  69. #define  MAKE16(varhigh,varlow)    (unsigned int)((varhigh&0xff)*0x100 + (varlow&0xff))
  70. #define  WORD_LO(xxx)  ((unsigned char) ((unsigned int)(xxx) & 255))
  71. #define  WORD_HI(xxx)  ((unsigned char) ((unsigned int)(xxx) >> 8))
  72. /*----------------------------------------------------------------------------------------
  73.    全局变量
  74. ----------------------------------------------------------------------------------------*/

  75. static volatile unsigned char work_mode;                               //工作模式
  76. static volatile unsigned char KeyTime;                  //记录按键按下时长
  77. static volatile unsigned char power_time;               //上电时长
  78. static volatile unsigned int cycle_h_now;               //当前输出频率信号,高位
  79. static volatile unsigned int cycle_l;                   //设置频率输出信号
  80. static volatile unsigned int cycle_h;
  81. static volatile unsigned int vdd;                       //量程电压, 5V*8192 =40960
  82. static volatile unsigned int adc;                       //
  83. static volatile float voltage;                                           //采集来的电压

  84. static unsigned int ADC_buffer[ADC_COUNTER];                           //ADC缓冲
  85. static unsigned char vdd_step;                 //

  86. union {
  87.         unsigned char  data[2];
  88.         volatile unsigned int  O;                           //零点偏置
  89. } Offset;

  90. union {
  91.         unsigned char  data[3];
  92.         volatile float G;                                  //float 24bit
  93. } Gain;    //增益系数

  94. typedef struct {
  95.         unsigned  int  * volatile buffer;                   //缓冲区指针
  96.         unsigned  char counter;                   //队列计数器
  97. } queue;
  98. volatile queue Queue_adc;
  99. typedef struct {
  100.         unsigned char  _LED1:1;
  101.         unsigned char  _LED2:1;
  102.         unsigned char  _LED3:1;
  103.         unsigned char  _LED4:1;
  104.         unsigned char  _LED5:1;
  105.         unsigned char  _LED6:1;
  106.         unsigned char  _LED7:1;
  107.         unsigned char  _LED8:1;
  108.         unsigned char  _LED9:1;
  109.         unsigned char  :6;
  110.         unsigned char  _flag:1;
  111. } _display_bits;
  112. union {
  113.         _display_bits bits;
  114.         volatile unsigned int  data;
  115. } display_data;
  116. #define  LED9  display_data.bits._LED9
  117. #define  LED8  display_data.bits._LED8
  118. #define  LED7  display_data.bits._LED7
  119. #define  LED6  display_data.bits._LED6
  120. #define  LED5  display_data.bits._LED5
  121. #define  LED4  display_data.bits._LED4
  122. #define  LED3  display_data.bits._LED3
  123. #define  LED2  display_data.bits._LED2
  124. #define  LED1  display_data.bits._LED1
  125. #define  update_display_flag  display_data.bits._flag

  126. typedef struct {
  127.         unsigned char  _State0:3;
  128.         unsigned char  _State1:3;
  129.         unsigned char  _key:1;
  130.         unsigned char  _disp:1;
  131.         unsigned char  _time:4;
  132.         unsigned char  _scan:1;
  133.         unsigned char  _pow:1;
  134.         unsigned char  _flag:1;
  135.         unsigned char  _out:1;
  136. } _step_bits;

  137. union {
  138.         _step_bits bits;
  139.         volatile unsigned int  data;
  140. } step_data;

  141. #define  display_flag  step_data.bits._disp
  142. #define  pwoer_flag    step_data.bits._pow
  143. #define  output_flag   step_data.bits._out
  144. #define  KeyState      step_data.bits._State1
  145. #define  KeySave       step_data.bits._flag
  146. #define  key_input     step_data.bits._key
  147. #define  ferq_step     step_data.bits._State0
  148. #define  update_time   step_data.bits._time
  149. #define  key_scan      step_data.bits._scan  


  150. const unsigned int vdd_date[6] = {20480,24576,27033,29491,36044,40960};   //5V*8192 =40960
  151. //                                  2.5,  3,   3.3,  3.6,  4.4,  5

  152. const unsigned int freq_date[5] = {31250,3125,1250,2500,1250};
  153. //                                   2,   20,  50,  100, 200};

  154. /*----------------------------------------------------------------------------------------
  155.    原型声明
  156. ----------------------------------------------------------------------------------------*/
  157. unsigned int filter(unsigned char size, unsigned int buff[] );
  158. unsigned char queue_in(unsigned int* new_data, volatile queue* me);

  159. void setup_freq(unsigned char step);
  160. void DataEE_Read(unsigned char addr, unsigned char * _ram, unsigned char bytes);
  161. void DataEE_Write(unsigned char addr, unsigned char * _ram, unsigned char bytes);

  162. /*----------------------------------------------------------------------------------------
  163. Purpose:  time_0  ISR
  164. ----------------------------------------------------------------------------------------*/
  165. DEFINE_ISR(MF_0F, 0x0C){              //频率信号中断服务
  166.         if(_t0af == 1){
  167.                 _t0af = 0;

  168.                 if (output_flag ==1){
  169.                     output_flag = 0;
  170.                 Constant_PIN ^= 0x01;
  171.             }
  172.                  if (cycle_h_now >0){
  173.                          cycle_h_now--;
  174.                          _tm0al =255;
  175.                     _tm0ah = 3;
  176.                 }else{
  177.                     output_flag = 1;
  178.                     cycle_h_now = cycle_h;
  179.                     _tm0al = WORD_LO(cycle_l);
  180.                     _tm0ah = WORD_HI(cycle_l);               
  181.                 }
  182.         }
  183.         _mf0f = 0;
  184. }
  185. /*----------------------------------------------------------------------------------------
  186. Purpose:  time_base_1  ISR
  187. ----------------------------------------------------------------------------------------*/
  188. DEFINE_ISR(time_base_1_ISR, 0x20){      //时基中断TB1,每0.004096 秒中断
  189.         unsigned int temp;
  190.         /*--读ADC----*/
  191.         _adoff = 0;
  192.         _start = 0;
  193.         _start = 1;
  194.         _start = 0;
  195.         while(_eocb == 1){
  196.                 GCC_CLRWDT();
  197.         }
  198.     temp = MAKE16(_adrh,_adrl);       
  199.         _adoff = 1;
  200.        
  201.         /*--存入ADC缓存,中位值滤波,折算电压----*/
  202.         if(queue_in( &temp, &Queue_adc) == 1 )
  203.         {
  204.                 adc = filter( ADC_COUNTER, Queue_adc.buffer);
  205.                 if(adc > Offset.O){
  206.                         temp = adc - Offset.O;
  207.                 }else{
  208.                         temp = 0;
  209.                 }               
  210.                 voltage =  Gain.G * (float)(temp);
  211.         }       
  212. }
  213. /*----------------------------------------------------------------------------------------
  214. Purpose:  time_base_0  ISR
  215. ----------------------------------------------------------------------------------------*/
  216. DEFINE_ISR(time_base_0_ISR, 0x1c){     //时基中断TB0,每0.008192 秒中断
  217.         unsigned char temp;
  218.         unsigned int temp_int;       
  219.         float  temp_float2;
  220.        
  221.         //if(work_mode ==3){
  222.         //        _pac = 0xFA;
  223.         //}else{
  224.                 _pac = 0xFB;
  225.         //}
  226.         if(display_flag == 1){      //屏服务
  227.                 display_flag = 0;
  228.                 if(LED9 == 1){
  229.                         LED_9_PIN_CON = 0;
  230.                         LED_9_PIN_H = 1;
  231.                 }
  232.                 if(LED7 == 1){
  233.                         LED_7_PIN_CON = 0;
  234.                         LED_7_PIN_H = 1;
  235.                 }       
  236.                 if(LED5 == 1){
  237.                         LED_5_PIN_CON = 0;
  238.                         LED_5_PIN_H = 1;
  239.                 }
  240.                 if(LED3 == 1){
  241.                         LED_3_PIN_CON = 0;
  242.                         LED_3_PIN_H = 1;
  243.                 }               
  244.                 if(LED1 == 1){
  245.                         LED_1_PIN_CON = 0;
  246.                         LED_1_PIN_H = 1;
  247.                 }                               
  248.         }else{
  249.                 display_flag = 1;
  250.                 if(LED8 == 1){
  251.                         LED_8_PIN_CON = 0;
  252.                         LED_8_PIN_L = 0;               
  253.                 }
  254.                 if(LED6 == 1){
  255.                         LED_6_PIN_CON = 0;
  256.                         LED_6_PIN_L = 0;
  257.                 }
  258.                 if(LED4 == 1){
  259.                         LED_4_PIN_CON = 0;
  260.                         LED_4_PIN_L = 0;
  261.                 }       
  262.                 if(LED2 == 1){
  263.                         LED_2_PIN_CON = 0;
  264.                         LED_2_PIN_L = 0;
  265.                 }       
  266.         }
  267.        
  268.         if(++update_time == 6){          //6*8.192 = 49.152mS

  269.                 if(pwoer_flag == 1){         //上电计时,用于检测上电按键
  270.                         if(++power_time >=43){
  271.                                 pwoer_flag = 0;
  272.                         }
  273.                 }
  274.                 update_time = 0;
  275.                 key_scan = 1;
  276.                
  277.                 /*--刷显存----*/
  278.                 if(update_display_flag != 1){       
  279.                         switch(work_mode){
  280.                                 case 0:{   //电压测量
  281.                                                 display_data.data &= 0XFE00;
  282.                                                 temp_int = 0x0001;
  283.                                                 for(temp=11; temp>=3; temp--){
  284.                                                        
  285.                                                         temp_float2 = ((float)(vdd)/8192)*((float)(temp)/10);
  286.                                                        
  287.                                                         if(voltage >= temp_float2){
  288.                                                                 temp_int <<=  (temp-3);
  289.                                                                 display_data.data |= temp_int;
  290.                                                                 break;
  291.                                                         }else{
  292.                                                                 display_data.data |= 0;
  293.                                                         }
  294.                                                 }
  295.                             }break;
  296.                                 case 1:{   //通断
  297.                                                 display_data.data &=0xFE07;
  298.                                                 if(_cout ==1){
  299.                                                         display_data.data |= 0x01F0;
  300.                                                 }
  301.                             }break;         
  302.                                 case 2:{   //二极管
  303.                                                 display_data.data &=0xFE07;               
  304.                                                 temp_int = 0x0008;
  305.        
  306.                                                 for(temp=10; temp>=3; temp--){
  307.                                                         temp_float2 = (float)(temp)/10;
  308.                                                         if(temp==3){
  309.                                                                 display_data.data |= 0x01F0;
  310.                                                                 break;
  311.                                                         }
  312.                                                         else if(voltage >= temp_float2){
  313.                                                                 temp_int <<=  (temp-4);
  314.                                                                 display_data.data |= temp_int;
  315.                                                                 break;
  316.                                                         }else{
  317.                                                                 display_data.data |= 0;
  318.                                                         }
  319.                                                 }
  320.        
  321.        
  322.                             }break;
  323.                                 case 5:{   //校准偏置
  324.                                                 display_data.data &= 0XFE0A;
  325.                                                 if(adc > 40){
  326.                                                         LED9 = 1;
  327.                                                 }else if(adc > 20){
  328.                                                         LED8 = 1;
  329.                                                 }else if(adc > 10){
  330.                                                         LED7 = 1;
  331.                                                 }
  332.                                     }break;
  333.                                 case 6:{   //校准增益
  334.                                                 display_data.data &= 0XFE1A;
  335.                                                 if(adc > 3400){
  336.                                                         LED9 = 1;
  337.                                                 }else if(adc > 3000){
  338.                                                         LED8 = 1;
  339.                                                 }else if(adc > 2700){
  340.                                                         LED7 = 1;
  341.                                                 }
  342.                                     }break;                                                                                                                     
  343.                                 default: break;
  344.                         }               
  345.                 }                       
  346.         }       
  347. }

  348. void DataEE_Read(unsigned char addr, unsigned char * _ram, unsigned char bytes) {
  349.         unsigned char i;
  350.        
  351.         for (i = 0; i < bytes; i++, _ram++, addr++){
  352.             _eea = addr;  //读地址
  353.             _rden = 1;    //读使能
  354.             _rd = 1;      //开始读
  355.             //GCC_NOP();
  356.             while(_rd){   //等待完成
  357.                         GCC_CLRWDT();                   
  358.             }
  359.         *_ram =        _eed;
  360.         _rden = 0;    //清理
  361.         }
  362. }

  363. void DataEE_Write(unsigned char addr, unsigned char * _ram, unsigned char bytes) {
  364.         unsigned char i;
  365.                
  366.         for (i = 0; i < bytes; i++, _ram++, addr++){
  367.             _eea = addr;
  368.             _eed = *_ram;
  369.             _wren = 1;
  370.             _wr = 1;
  371.             //GCC_NOP();
  372.             while(_wr){
  373.                         GCC_CLRWDT();                            
  374.             }
  375.         _wren = 0;       
  376.         }
  377. }
  378. /*----------------------------------------------------------------------------------------
  379. Purpose: 频率转换 0.964HZ-250KHZ  @ 8M时钟
  380. ----------------------------------------------------------------------------------------*/
  381. void setup_freq(unsigned char step){
  382.     unsigned int temp;
  383.   
  384.           if (step <= 2)
  385.     {
  386.                 //temp = (FREQ/64/2) / freq_temp;
  387.                 _tm0c0 = 0b00111000;  //fH/16
  388.     }else{
  389.                 //temp = (FREQ/16/2) / freq_temp;
  390.                 _tm0c0 = 0b00101000;  //fH/16   
  391.     }
  392.     temp = freq_date[step];
  393.     _tm0c1 = 0b11000001;  //TM0比较器A匹配
  394.         cycle_l = temp & 1023;
  395.         cycle_h = temp >> 10;
  396.     _tm0al =255;
  397.     _tm0ah = 3;
  398.     cycle_h_now = cycle_h;
  399.     _t0on = 0;                                               
  400.         _t0on = 1;
  401.     output_flag = 0;
  402. }

  403. /*----------------------------------------------------------------------------------------
  404. Purpose:        无符号int型数组 中位值滤波 排序采用选择排序
  405. ----------------------------------------------------------------------------------------*/
  406. unsigned int filter(unsigned char size, unsigned int buff[] ){  //, unsigned char sensitive)
  407.     unsigned int temp;
  408.         unsigned char i,j,min;
  409.        
  410.     for( i=0;i<size;i++)
  411.     {
  412.       min=i;//先假设最小下标为i
  413.       
  414.       for(j=i+1;j<size;j++)
  415.          if(buff[j]<buff[min])  //对i之后的数进行扫描将最小的数赋予min
  416.             min=j;
  417.       if(min!=i)                //判断min与i是否相等,若=则说明原假设正确反之交换数值
  418.       {
  419.         temp=buff[i];
  420.         buff[i]= buff[min];
  421.         buff[min]=temp;
  422.       }
  423.     }       
  424.        
  425.         return  buff[size/2];
  426.        
  427. }

  428. /*----------------------------------------------------------------------------------------
  429. Purpose:        存入线性队列
  430. ----------------------------------------------------------------------------------------*/
  431. unsigned char queue_in(unsigned int* new_data, volatile queue* me){
  432.         me->buffer[me->counter] = *new_data;
  433.         me->counter ++;
  434.         if( me->counter >=  ADC_COUNTER)//me->size)
  435.         {
  436.                 me->counter = 0;
  437.                 return 1;
  438.         }
  439.         else
  440.         {
  441.                 return 0;
  442.         }
  443. }



  444. /*----------------------------------------------------------------------------------------
  445. Purpose: main
  446. ----------------------------------------------------------------------------------------*/
  447. void main(){
  448.         unsigned char temp;
  449.         unsigned int temp_int;       

  450.         //adc
  451.         _adcr0 = 0b00010000;
  452.         _adcr1 = 0b00000100;
  453.         _acerl = 0b00000001;

  454.         //TB
  455.         _tbc = 0b11000110;
  456.         _pac = 0xFB;   //pa2 输出模式
  457.         _cpc = 0b00101001;  //比较器设置       

  458.         _pac2 = 0;     
  459.         Constant_PIN = 1;     //禁止恒流输出

  460.         Queue_adc.counter = 0;
  461.            Queue_adc.buffer = ADC_buffer;

  462.            DataEE_Read(EE_first, &temp, sizeof(temp));
  463.            if(temp != 0xA5){   //第一次上电?
  464.                    vdd_step = 5;
  465.                    Offset.O = 0;
  466.                    Gain.G = 0.0016118633139910;
  467.                    temp = 0xA5;
  468.                    DataEE_Write(EE_first, &temp, sizeof(temp));
  469.                    DataEE_Write(EE_vdd, &vdd_step, sizeof(vdd_step));
  470.             DataEE_Write(EE_offset, &Offset.data[0], sizeof(Offset.O));
  471.             DataEE_Write(EE_Gain, &Gain.data[0], sizeof(Gain.G));                           

  472.            }else{
  473.                    DataEE_Read(EE_vdd, &vdd_step, sizeof(vdd_step));
  474.             DataEE_Read(EE_offset, &Offset.data[0], sizeof(Offset.O));
  475.             DataEE_Read(EE_Gain, &Gain.data[0], sizeof(Gain.G));          
  476.            }
  477.         vdd = vdd_date[vdd_step];
  478.         pwoer_flag = 1;
  479.        
  480.         _wdtc = 0b11110000;  //放狗,看门
  481.         _tb1e = TRUE;        //开TB1中断,测量电压
  482.         _tb0e = TRUE;        //开TB0中断,显示,按键,刷数
  483.         _emi = TRUE;
  484.        
  485.         while(1){
  486.                 if(key_scan ==1){
  487.                         key_scan = 0;
  488.                         /*--按键扫描----*/
  489.                         temp = 0;
  490.                     key_input = _pa7;       //读取按键
  491.                         switch(KeyState){
  492.                                 case 0:{
  493.                                                  if( key_input == 0 ){                            //判断是否有按键操作
  494.                                              KeySave = key_input;                                                //有,暂存当前按键
  495.                                              KeyState =1;
  496.                                      }
  497.                                 }break;
  498.                                 case 1:{
  499.                                                 if( key_input == KeySave  ){                                //按键抖动,
  500.                                             KeyState = 2;
  501.                                             KeyTime = KEY_R_T0 ;                                                //第一次按键长按反应时间
  502.                                     }else
  503.                                             KeyState = 0;                                                                
  504.                                 }break;  
  505.                                 case 2:{
  506.                                                 if( key_input == 0  ){
  507.                                                         if(--KeyTime <= 1 ){                                        //长按?
  508.                                                                 temp = 2;
  509.                                                                 KeyState = 3;       
  510.                                                         }                                               
  511.                                     }else{                                                                                               
  512.                                         temp =1;
  513.                                         KeyState = 0;
  514.                                     }
  515.                                 }break;
  516.                                 case 3:{
  517.                                                 if( key_input == 1  ){                                        //检查按键弹起       
  518.                                                         KeyState = 0;
  519.                                     }
  520.                                 }break;                        
  521.        
  522.                                 default: break;
  523.                         }
  524.                         if(temp !=0){
  525.                                 update_display_flag = 1;
  526.                
  527.                                 /*--短按操作----*/
  528.                                 if(        temp ==1){         
  529.                                         if(work_mode ==3){
  530.                                                 ++ferq_step;
  531.                                                 if( ferq_step>4){
  532.                                                         _mf0e = FALSE;
  533.                                                         _mf0f = FALSE;
  534.                                                         _t0ae = FALSE;  //禁止频率输出
  535.                                                         _t0af = FALSE;
  536.                                                         ferq_step = 0;
  537.                                                         work_mode = 0;
  538.                                                         Constant_PIN = 1;
  539.                                                 }                               
  540.                                         }else if(work_mode ==4){
  541.                                                 ++vdd_step;
  542.                                                 if( vdd_step>5){
  543.                                                         vdd_step = 0;
  544.                                                 }                       
  545.                                         }else if(work_mode ==7){
  546.                                                         work_mode = 0;
  547.        
  548.                                                         DataEE_Write(EE_offset, &Offset.data[0], sizeof(Offset.O));
  549.                                                     DataEE_Write(EE_Gain, &Gain.data[0], sizeof(Gain.G));
  550.                
  551.                                         }else{       
  552.                                                 ++work_mode;
  553.                                         }
  554.                                        
  555.                                 }
  556.                                 /*--长按操作----*/
  557.                                 else if(temp ==2) {
  558.                
  559.                                         if(pwoer_flag == 1){
  560.                                                 work_mode = 5;
  561.                                                 pwoer_flag = 0;
  562.                                         }else if(work_mode == 0){
  563.                                                 _tb1e = FALSE;
  564.                                                 work_mode = 4;
  565.                                         }else if(work_mode == 4){
  566.                                                 vdd = vdd_date[vdd_step];
  567.                                                 work_mode = 0;
  568.                                                 DataEE_Write(EE_vdd, &vdd_step, sizeof(vdd_step));
  569.                                         }       
  570.                                 }                       
  571.                                 /*--更新工作模式----*/
  572.                                 switch(work_mode){     
  573.                                         case 0:{   //电压测量
  574.                                                         display_data.data = 0;
  575.                                                         _acerl = 1;
  576.                                                         Queue_adc.counter = 0;
  577.                                                         voltage = 0;
  578.                                                         _tb1f = FALSE;
  579.                                                         _tb1e = TRUE;  //开TB0中断
  580.                                     }break;
  581.                                         case 1:{   //通断
  582.                                                         LED1 = 0;
  583.                                                         LED2 = 1;
  584.                                                         LED3 = 1;                                       
  585.                                                         _tb1e = FALSE;
  586.                                                         _tb1f = FALSE;
  587.                                                        
  588.                                                         _cpc = 0b11101001;
  589.                                                         Constant_PIN = 0;
  590.                                     }break;         
  591.                                         case 2:{   //二极管
  592.                                                         LED1 = 1;
  593.                                                         LED2 = 0;
  594.                                                         LED3 = 1;
  595.                                        
  596.                                                         _cpc = 0b00101001;  //比较器设置
  597.                                                         Constant_PIN = 0;
  598.                                                        
  599.                                                         _acerl = 1;
  600.                                                         Queue_adc.counter = 0;
  601.                                                         voltage = 0;                                                       
  602.                                                         _tb1f = FALSE;
  603.                                                         _tb1e = TRUE;           //开TB0中断                                                                               
  604.                                     }break;
  605.                                        
  606.                                         case 3:{   //频率输出(HZ)
  607.                                                         _tb1e = FALSE;
  608.                                                         _tb1f = FALSE;
  609.                                                         _acerl = 0;
  610.                                                         _pa0 = 0;
  611.                        
  612.                                                         display_data.data &= 0XFE00;
  613.                                                         LED1 = 1;
  614.                                                         LED2 = 1;
  615.                                                         LED3 = 1;               
  616.                                                         temp_int = 0x0010;
  617.                                                         temp_int <<=  ferq_step;
  618.                                                         display_data.data |= temp_int;
  619.                                                        
  620.                                                         setup_freq(ferq_step);
  621.                                                         _t0ae = TRUE;
  622.                                                         _mf0e = TRUE;
  623.                                     }break;
  624.                                 case 4:{   //设置量程
  625.                                         display_data.data &= 0XFE00;
  626.                                                 LED1 = 1;
  627.                                                 LED2 = 1;
  628.                                                 LED3 = 0;
  629.                                                 temp_int = 0x0008;
  630.                                                 temp_int <<=  vdd_step;
  631.                                                 display_data.data |= temp_int;
  632.                        
  633.                                 }break;
  634.                                         case 5:{   //校准偏置
  635.                                                         display_data.data &= 0XFE00;
  636.                                                         display_data.data |= 0x000A;
  637.                                     }break;
  638.                                 
  639.                                         case 6:{   //校准增益
  640.                                                         Offset.O = adc;
  641.                                                         display_data.data &= 0XFE00;
  642.                                                         display_data.data |= 0x001A;
  643.                                                 }break;
  644.                                        
  645.                                         case 7:{   //保存校准
  646.                                                         Gain.G = (float)(5.0/(adc-Offset.O));
  647.                                                         display_data.data &= 0XFE00;
  648.                                                         display_data.data |= 0x003A;                              
  649.                                     }break;                        
  650.                                         default: break;
  651.                                 }
  652.                                 update_display_flag = 0;

  653.                         }else {
  654.                                 update_display_flag = 0;
  655.                         }
  656.                 }
  657.                 GCC_CLRWDT();       //逗狗狗
  658.         }
  659. }

  660. /*END-------------------------------------------------------------------------*/
复制代码
回复

使用道具 举报

板凳
ID:96881 发表于 2015-12-31 14:42 | 只看该作者
这个做得好精致啊,好漂亮,非常喜欢
回复

使用道具 举报

地板
ID:97704 发表于 2016-1-4 11:21 | 只看该作者
漂亮,学习一下。
回复

使用道具 举报

5#
ID:147215 发表于 2016-12-29 08:36 | 只看该作者
谢谢分享!,,51黑有你更精彩!!!
回复

使用道具 举报

6#
ID:166138 发表于 2017-2-28 12:38 | 只看该作者
好是好,但是这个数值读认要查表,谁能记得那么多呀?太困难了。建议修改显示方式,如3.5V 显示 3颗灯亮,然后显示一个其他颜色的灯做小数点,然后再亮5颗灯。   如此循环显示,比较好读。如是30.5 则亮3颗灯时,在前面空一格,从第二位开始,用来区别。或者干脆再用颗其他颜色的LED来表示10位还是个位。个人想法,仅做抛砖引玉,还望楼主产品更实用和完善。
回复

使用道具 举报

7#
ID:151348 发表于 2017-3-13 21:43 | 只看该作者
这估计是最苗条的万用表
回复

使用道具 举报

8#
ID:162757 发表于 2018-12-18 16:51 | 只看该作者
这个哪里有卖的
回复

使用道具 举报

9#
ID:33806 发表于 2019-1-4 12:02 | 只看该作者
原购买链接失效,有现成的电路板比较漂亮!楼主能不能重新发布一下!
回复

使用道具 举报

10#
ID:491340 发表于 2019-5-15 16:48 | 只看该作者
这个做的很纤细啊
回复

使用道具 举报

11#
ID:300101 发表于 2019-10-7 18:45 | 只看该作者
好精致啊,这么可爱的一定要仿制一枚
回复

使用道具 举报

12#
ID:493097 发表于 2020-1-4 13:40 | 只看该作者
好精致啊,一定要仿制一个玩玩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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