数码之家

 找回密码
 立即注册
搜索
查看: 3350|回复: 51

[工仪] 用旋转编码器代替点焊机的输入按键开关(STC15F104W/源码完整/好用)

    [复制链接]
发表于 2023-2-23 07:37:54 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 林华信 于 2023-2-24 19:30 编辑

用旋转编码器代替点焊机的输入按键开关(STC15F104W/源码完整/好用)

再增加个鼠标的旋转编码开关信号波波图作参考
电焊机电路图.jpg
55cc976d9d122fdb.jpg
1d3c7c703b2ce644.jpg

打赏

参与人数 8家元 +254 收起 理由
刘明伟 + 50 謝謝分享
zto中通快递 + 18
作死的家伙 + 6 謝謝分享
jf201006 + 20 原創內容
不长叶子的树 + 100
邓穿石 + 20 謝謝分享
xushu + 20 楼主高手哈!代码看不懂也不会编译成固件..
aping365 + 20 謝謝分享

查看全部打赏

 楼主| 发表于 2023-2-23 07:39:43 | 显示全部楼层

  1. //8脚单片机,型号为 STC15F104W  SOP8封装,1.4元包邮。12MHz烧录(注意:烧录好以后才焊接单片机6脚的外围电路 ,否则不能烧录 )
  2. //要求:10档调节,单脉冲,点焊时间3--12ms可调,用1个LED 当作档位显示和点焊脉冲显示。用旋转编码开关 顺时针旋转为加,逆时针为减  ok  2023.2
  3.                                                         
  4.          #include<reg52.h>   //代入头文件//

  5.          #include <intrins.h>  // 用空操作  _nop_   时要加这句//


  6.      #define ulong unsigned long //宏定义变量类型    0----4294967295/

  7.          #define uint unsigned int //宏定义变量类型    0----65535/

  8.          #define uchar unsigned char//        宏定义变量类型          0-255/

  9.          uchar jlu;  //几率-----------------

  10.      uchar qian;hou;flag;  //前后电平记忆和旋转标志

  11.      uint t00,b00,t01,b01;  //X0输入滤波变量
  12.                                                   
  13.      uint t10,b10,t11,b11;  //X1输入滤波变量

  14.      uint t20,b20,t21,b21;  //X2输入滤波变量

  15.      uint b,k1,ks,b1,k2,ty,t3,b3,k3;  //标志量
  16.          
  17.      uint t0,t2;//长按加减键0.7秒也会变一档或停
  18.   

  19.      uint tx;//档位

  20.    
  21. uint lbcs=1;            //0--65535,输入滤波常数,可以为5到10毫秒,长按用300到700毫秒,一改全改。


  22. sfr P3M1=0xB1;  //A//

  23. sfr P3M0=0xB2;  //B//P3口特殊寄存器声明   sfr P3M1=0xb1; sfr P3M0=0xb2; B可用小写b吗?

  24.   //  P3M1=0x0;  //C//
  25.    // P3M0=0x4;  // D//   3.2脚为推挽输出,其他是准双向口,这两句放在主程序里
  26.                  //    如果全是准双向口,上面ABCD4句可以不要



  27.    
  28.                               //// 3个输入如下  用编码开关
  29.     sbit X0=P3^3;   //减   
  30.     sbit X1=P3^4;   //(点焊)     
  31.     sbit X2=P3^5;  //加   


  32.                      
  33.     sbit Y31=P3^1; //LED显示用,不对外输出。 档位和脉冲输出显示,烧录好以后才焊接6脚的外围电路 ,否则不能烧录            
  34.      

  35.       
  36.     sbit Y0=P3^2;      //1个输出 (点焊脉冲输出,低平点焊,高平停焊)   
  37.    



  38. void  main( )//主程序
  39. {
  40.        TMOD=0x01; //  TMOD=0x11;//设置定时器0为工作方式1//  
  41.             TH0=(65536-1000)/256;  //12MHZ,1MS一次中断,商//
  42.             TL0=(65536-1000)%256;  //低位装数=余数//
  43.                               
  44.         EA=1;       //开总中断//

  45.             ET0=1;      //开定时器0中断

  46.                 TR0=1;//启动定时器0//397//
  47.                                                              // X0=1;//把P3.3 复位脚 RST OUT-LOW 设置为高电平==========????????????????????????
  48.         Y0=1;//出0,停止

  49.     P3M1=0x0;// 高8位为0000 0000
  50.     P3M0=0x4;  //低8位为0000 0100   3.2脚为推挽输出,7脚串联1K电阻到地,有4毫安电流。其他是准双向口串联1K电阻到地只有13微安 ( 写成 P3M1=0x00;  P3M0=0x40;不行,已经验证了)。




  51.   while(1)//大循环
  52. {

  53.                         jlu=0;//几率------

  54.                                 //以下是你的编程区=========================================        
  55.                         


  56.                           
  57. //以下语句是获取旋转编码器的信息
  58.       qian=X0;     //把减键X0的电平映射给qian(前)   //-------------------------------------------


  59. while(!X2)   //X2加键低电平进入循环

  60.   {

  61.     hou=X0;  //把减键X0的电平映射给hou(后)
  62.         flag=1;  //标志量置1,表示编码开关被旋转了

  63.   }

  64.   if(flag==1)  //编码开关被旋转了,判断减键X0的电平在X2加键低电平时的前后变化来获取转向信息
  65.      {
  66.                   flag=0;   //标志量清零,过桥抽板
  67.           if(  (qian==0)&&(hou==1)   )  {  if(ks<10)ks++;  }   //前低后高,减键的上升沿为正(向右)旋转,记数ks加1

  68.           if(  (qian==1)&&(hou==0)   )  {  if(ks>0)ks--;  }    //前高后低,减键的下降沿则为反(向左)旋转,记数ks减1
  69.   
  70.   
  71.       }     //到这,KS值会运随编码器的加减键信号变化在0--10范围内变化-------------------------------
  72.    

  73. //到这,旋转编码器的信息获取完毕


  74.   


  75.                       //以下你不要编程=========================================

  76.                     while(jlu<1)          //几率-------
  77.                         
  78.                           {_nop_();  _nop_();         _nop_(); }
  79.                                     
  80.                                                 
  81.                 }

  82. }



  83.                                           

  84. void exter0() interrupt 1         //定时器0的中断程序//定时器1的中断程序 void exter1() interrupt 3//
  85. {           
  86.         TH0=(65536-1000)/256;         //重装数12MHz 1000=1ms,如果不重装,默认数是65536,不是想要的10000//
  87.         TL0=(65536-1000)%256;
  88.                
  89.                  
  90.              //X0滤波
  91.                 if(X0==0) {t00++;t01=0;}
  92.                 if(t00==lbcs){b00=1;b01=0; }        //b00=1,就是按下
  93.                 if(b00==1) t00=0;

  94.                 if(X0==1) {t01++;t00=0;}
  95.                 if(t01==lbcs){b01=1;b00=0; }  //b01=1,就是松手
  96.                 if(b01==1) t01=0;

  97.         //X1滤波
  98.                 if(X1==0) {t10++;t11=0;}
  99.                 if(t10==lbcs){b10=1;b11=0; }        //b10=1,就是按下
  100.                 if(b10==1) t10=0;

  101.                 if(X1==1) {t11++;t10=0;}
  102.                 if(t11==lbcs){b11=1;b10=0; }  //b11=1,就是松手
  103.                 if(b11==1) t11=0;   
  104.                  
  105.                
  106.                  //X2滤波
  107.                 if(X2==0) {t20++;t21=0;}
  108.                 if(t20==lbcs){b20=1;b21=0; }        //b20=1,就是按下
  109.                 if(b20==1) t20=0;

  110.                 if(X2==1) {t21++;t20=0;}
  111.                 if(t21==lbcs){b21=1;b20=0; }  //b21=1,就是松手
  112.                 if(b21==1) t21=0;  
  113.                
  114.         
  115.         

  116.         

  117. //以下是你的编程区=======================================




  118.   

  119. //到这,KS值会运随加减键在0--10范围变化,以下就根据ks值做相应工作
  120.    
  121. //-----------------------------------------------------//用1个LED做档位显示,连输出脉冲都显示    tx    Y31
  122. if(X0==0){tx=0 ; Y31=1;    }
  123. if(X1==0){tx=0 ; Y31=1;    }

  124. if(X2==0){tx=0 ; Y31=1;    }      //3个输入有一个按下就不显示,并清零


  125. if(X1!=0){                         //点焊按键没按下时候才显示档位---------------------------------------------------------

  126. if(ks==0) Y31=0;//0档时长亮,当作电源显示
  127.         
  128. if(ks>0)  tx++;          //公共显示开始  0.4秒1闪  是多少档就闪多少次
  129. if(tx==2)  Y31=1;   //灭了0档时的长亮


  130. if(tx==2000)  Y31=0;
  131. if(tx==2100)  Y31=1;//  1档

  132. if(tx==2400)  Y31=0;
  133.   if(tx==2500)  Y31=1;//  2

  134.   if(tx==2800)  Y31=0;
  135. if(tx==2900)  Y31=1;//  3

  136. if(tx==3200)  Y31=0;
  137. if(tx==3300)  Y31=1;//   4

  138. if(tx==3600)  Y31=0;
  139. if(tx==3700)  Y31=1;//   5

  140. if(tx==4000)  Y31=0;
  141. if(tx==4100)  Y31=1;//   6

  142. if(tx==4400)  Y31=0;
  143. if(tx==4500)  Y31=1;//    7

  144. if(tx==4800)  Y31=0;
  145. if(tx==4900)  Y31=1;//     8

  146. if(tx==5200)  Y31=0;
  147. if(tx==5300)  Y31=1; //   9

  148. if(tx==5600)  Y31=0;
  149. if(tx==5700)  Y31=1; //  10

  150. if(tx>=5701)  tx=0; // tx归零  ----------------公共显示结束



  151. if(ks==1) { if(tx==2100) tx=0; }// 1 档 --------------------各档显示控制

  152. if(ks==2) { if(tx==2500) tx=0; }// 2

  153. if(ks==3) { if(tx==2900) tx=0; }// 3

  154. if(ks==4) { if(tx==3300) tx=0; }// 4


  155. if(ks==5) { if(tx==3700) tx=0; }// 5


  156. if(ks==6) { if(tx==4100) tx=0; }// 6

  157. if(ks==7) { if(tx==4500) tx=0; }// 7

  158. if(ks==8) { if(tx==4900) tx=0; }// 8

  159. if(ks==9) { if(tx==5300) tx=0; }// 9

  160. if(ks==10) { if(tx==5700) tx=0; }// 10   ------------------
  161.             

  162. if (Y0==0)  tx=0;  //每次电焊时显示归零-----------------

  163.                }   //--------------------------------------------------------------------------------------------------------------------------------


  164. if( k3==1){                           
  165.                            
  166.                            if(Y0==0) Y31=0;

  167.                if(Y0==1) Y31=1;  //显示点焊脉冲======================================================================??????

  168.           }



  169. // 以下为焊接脉冲时长控制 1到10档,3到12毫秒,最少3毫秒(1档),每档加1毫秒。7脚输出低电平为焊接,高平为停焊
  170.                                                                        
  171. if(ks==1){                                             //1档开始  按下按键并松手,1秒后通电3ms,焊接时间

  172.                       if(b10==1){b3=1;k3=0;}

  173.                      if(b3==1){   if(b11==1)
  174.                                 {
  175.                                   b3=0;
  176.                                   k3=1;
  177.                                  }
  178.                               }

  179.                                          
  180.                       if(k3==1){  t3++;
  181.                              if(t3==1000) { Y0=0;  } //延迟1秒
  182.                              if(t3==1003) {Y0=1;   //差值为3ms焊接时间
  183.                                            t3=0;
  184.                                            k3=0;
  185.                                            }   
  186.                                 }
  187.                   
  188.           }                 //              //1档结束                                            
  189.                                       


  190.                                  
  191.   if(ks==2){                                             //2档开始

  192.                       if(b10==1){b3=1;k3=0;}

  193.                      if(b3==1){   if(b11==1)
  194.                                 {
  195.                                   b3=0;
  196.                                   k3=1;
  197.                                  }
  198.                               }


  199.                       if(k3==1){  t3++;
  200.                              if(t3==1000)  Y0=0;   //延迟1秒
  201.                              if(t3==1004) {Y0=1;   //4ms焊接时间
  202.                                            t3=0;
  203.                                            k3=0;
  204.                                            }   
  205.                                 }
  206.                   
  207.           }                 //        //2档结束   
  208.                                                 
  209.                                                                            
  210.                  
  211. if(ks==3){                                             //3档开始

  212.                       if(b10==1){b3=1;k3=0;}

  213.                      if(b3==1){   if(b11==1)
  214.                                 {
  215.                                   b3=0;
  216.                                   k3=1;
  217.                                  }
  218.                               }


  219.                       if(k3==1){  t3++;
  220.                              if(t3==1000)  Y0=0;   //延迟1秒
  221.                              if(t3==1005) {Y0=1;   //5ms焊接时间
  222.                                            t3=0;
  223.                                            k3=0;
  224.                                            }   
  225.                                 }
  226.                   
  227.           }                 //         //3档结束                                                                              

  228.   
  229.                                  
  230. if(ks==4){                                             //4档开始

  231.                       if(b10==1){b3=1;k3=0;}

  232.                      if(b3==1){   if(b11==1)
  233.                                 {
  234.                                   b3=0;
  235.                                   k3=1;
  236.                                  }
  237.                               }


  238.                       if(k3==1){  t3++;
  239.                              if(t3==1000)  Y0=0;   //延迟1秒
  240.                              if(t3==1006) {Y0=1;   //6ms焊接时间
  241.                                            t3=0;
  242.                                            k3=0;
  243.                                            }   
  244.                                 }
  245.                   
  246.           }                 //4档          //4档结束  



  247. if(ks==5){                                             //5档开始

  248.                       if(b10==1){b3=1;k3=0;}

  249.                      if(b3==1){   if(b11==1)
  250.                                 {
  251.                                   b3=0;
  252.                                   k3=1;
  253.                                  }
  254.                               }


  255.                       if(k3==1){  t3++;
  256.                              if(t3==1000)  Y0=0;   //延迟1秒
  257.                              if(t3==1007) {Y0=1;   //7ms焊接时间
  258.                                            t3=0;
  259.                                            k3=0;
  260.                                            }   
  261.                                 }
  262.                   
  263.           }                 //5档         //5档结束  

  264.   
  265. if(ks==6){                                             //6档开始

  266.                       if(b10==1){b3=1;k3=0;}

  267.                      if(b3==1){   if(b11==1)
  268.                                 {
  269.                                   b3=0;
  270.                                   k3=1;
  271.                                  }
  272.                               }


  273.                       if(k3==1){  t3++;
  274.                              if(t3==1000)  Y0=0;   //延迟1秒
  275.                              if(t3==1008) {Y0=1;   //8ms焊接时间
  276.                                            t3=0;
  277.                                            k3=0;
  278.                                            }   
  279.                                 }
  280.                   
  281.           }                 //        //6档结束         



  282. if(ks==7){                                             //7档开始

  283.                       if(b10==1){b3=1;k3=0;}

  284.                      if(b3==1){   if(b11==1)
  285.                                 {
  286.                                   b3=0;
  287.                                   k3=1;
  288.                                  }
  289.                               }


  290.                       if(k3==1){  t3++;
  291.                              if(t3==1000)  Y0=0;   //延迟1秒
  292.                              if(t3==1009) {Y0=1;   //9ms焊接时间
  293.                                            t3=0;
  294.                                            k3=0;
  295.                                            }   
  296.                                 }
  297.                   
  298.           }                 //7档          //7档结束  

  299. if(ks==8){                                             //8档开始

  300.                       if(b10==1){b3=1;k3=0;}

  301.                      if(b3==1){   if(b11==1)
  302.                                 {
  303.                                   b3=0;
  304.                                   k3=1;
  305.                                  }
  306.                               }


  307.                       if(k3==1){  t3++;
  308.                              if(t3==1000)  Y0=0;   //延迟1秒
  309.                              if(t3==1010) {Y0=1;   //10ms焊接时间
  310.                                            t3=0;
  311.                                            k3=0;
  312.                                            }   
  313.                                 }
  314.                   
  315.           }                 //8档          //8档结束  


  316. if(ks==9){                                             //9档开始

  317.                       if(b10==1){b3=1;k3=0;}

  318.                      if(b3==1){   if(b11==1)
  319.                                 {
  320.                                   b3=0;
  321.                                   k3=1;
  322.                                  }
  323.                               }


  324.                       if(k3==1){  t3++;
  325.                              if(t3==1000)  Y0=0;   //延迟1秒
  326.                              if(t3==1011) {Y0=1;   //11ms焊接时间
  327.                                            t3=0;
  328.                                            k3=0;
  329.                                            }   
  330.                                 }
  331.                   
  332.           }                 //9档            //9档结束


  333. if(ks==10){                                             //10档开始

  334.                       if(b10==1){b3=1;k3=0;}

  335.                      if(b3==1){   if(b11==1)
  336.                                 {
  337.                                   b3=0;
  338.                                   k3=1;
  339.                                  }
  340.                               }


  341.                       if(k3==1){  t3++;
  342.                              if(t3==1000)  Y0=0;   //延迟1秒
  343.                              if(t3==1012) {Y0=1;   //12ms焊接时间
  344.                                            t3=0;
  345.                                            k3=0;
  346.                                            }   
  347.                                 }
  348.                   
  349.           }                 //10档         //10档结束  


  350.    //以下你不要编程========================

  351.             jlu=1;//几率---------

  352.   }
复制代码


打赏

参与人数 1家元 +20 收起 理由
邓穿石 + 20 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-2-23 07:42:04 | 显示全部楼层
以上是全部完整的程序,无需用M币来获取。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 07:47:57 | 显示全部楼层
控制电路简单,用一只LED就可以显示1-10档,无需数码管。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-2-23 08:01:23 来自手机浏览器 | 显示全部楼层
林华信 发表于 2023-2-23 07:47
控制电路简单,用一只LED就可以显示1-10档,无需数码管。

烧录好程序后才可以把那只发光二极管装上去,否则不能正常烧录。上电后LED长亮,表示0档,也作电源指示。闪一下表示1档,闪两下表示2档,如此类推。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-23 08:04:44 来自手机浏览器 | 显示全部楼层
林华信 发表于 2023-2-23 08:01
烧录好程序后才可以把那只发光二极管装上去,否则不能正常烧录。上电后LED长亮,表示0档,也作电源指示。 ...

发本帖目的是为今后自己用手机查阅旋转编码器的程序编写提供方便。如果能对其他坛友提供启示,纯属意外。
回复 支持 反对

使用道具 举报

发表于 2023-2-23 08:06:21 | 显示全部楼层
高手在民间
回复 支持 反对

使用道具 举报

发表于 2023-2-23 08:09:14 | 显示全部楼层
楼主的注解给力,学习了,感谢分享!
回复 支持 反对

使用道具 举报

发表于 2023-2-23 08:22:00 | 显示全部楼层
谢谢分享,太厉害了.
回复 支持 反对

使用道具 举报

发表于 2023-2-23 08:28:32 | 显示全部楼层
楼主高手哈!代码看不懂也不会编译成固件.
回复 支持 反对

使用道具 举报

发表于 2023-2-23 08:43:27 | 显示全部楼层
会程序的人就是好,什么都能用单片机替换
回复 支持 反对

使用道具 举报

发表于 2023-2-23 09:03:45 | 显示全部楼层
谢谢分享支持一下!
回复 支持 反对

使用道具 举报

发表于 2023-2-23 10:27:57 | 显示全部楼层
感谢分享!技术贴,支持!
回复 支持 反对

使用道具 举报

发表于 2023-2-23 10:34:15 | 显示全部楼层

楼主的注解给力,学习了,感谢分享!
回复 支持 反对

使用道具 举报

发表于 2023-2-23 10:36:50 | 显示全部楼层
会变成的都是高手
回复 支持 反对

使用道具 举报

发表于 2023-2-23 10:53:31 | 显示全部楼层
这个程序烧写到stc8k系列的 单片机里行不行  都是8pin的引脚  手上刚好有
回复 支持 反对

使用道具 举报

发表于 2023-2-23 11:15:06 来自手机浏览器 | 显示全部楼层
好详细的注释啊
回复 支持 反对

使用道具 举报

发表于 2023-2-23 11:35:19 | 显示全部楼层
机械与数码的完美结合,高手在民间。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 15:44 , Processed in 0.265200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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