|

楼主 |
发表于 2023-2-23 07:39:43
|
显示全部楼层
- //8脚单片机,型号为 STC15F104W SOP8封装,1.4元包邮。12MHz烧录(注意:烧录好以后才焊接单片机6脚的外围电路 ,否则不能烧录 )
- //要求:10档调节,单脉冲,点焊时间3--12ms可调,用1个LED 当作档位显示和点焊脉冲显示。用旋转编码开关 顺时针旋转为加,逆时针为减 ok 2023.2
-
- #include<reg52.h> //代入头文件//
- #include <intrins.h> // 用空操作 _nop_ 时要加这句//
- #define ulong unsigned long //宏定义变量类型 0----4294967295/
- #define uint unsigned int //宏定义变量类型 0----65535/
- #define uchar unsigned char// 宏定义变量类型 0-255/
- uchar jlu; //几率-----------------
- uchar qian;hou;flag; //前后电平记忆和旋转标志
- uint t00,b00,t01,b01; //X0输入滤波变量
-
- uint t10,b10,t11,b11; //X1输入滤波变量
- uint t20,b20,t21,b21; //X2输入滤波变量
- uint b,k1,ks,b1,k2,ty,t3,b3,k3; //标志量
-
- uint t0,t2;//长按加减键0.7秒也会变一档或停
-
-
- uint tx;//档位
-
- uint lbcs=1; //0--65535,输入滤波常数,可以为5到10毫秒,长按用300到700毫秒,一改全改。
- sfr P3M1=0xB1; //A//
- sfr P3M0=0xB2; //B//P3口特殊寄存器声明 sfr P3M1=0xb1; sfr P3M0=0xb2; B可用小写b吗?
- // P3M1=0x0; //C//
- // P3M0=0x4; // D// 3.2脚为推挽输出,其他是准双向口,这两句放在主程序里
- // 如果全是准双向口,上面ABCD4句可以不要
-
- //// 3个输入如下 用编码开关
- sbit X0=P3^3; //减
- sbit X1=P3^4; //(点焊)
- sbit X2=P3^5; //加
-
- sbit Y31=P3^1; //LED显示用,不对外输出。 档位和脉冲输出显示,烧录好以后才焊接6脚的外围电路 ,否则不能烧录
-
-
- sbit Y0=P3^2; //1个输出 (点焊脉冲输出,低平点焊,高平停焊)
-
- void main( )//主程序
- {
- TMOD=0x01; // TMOD=0x11;//设置定时器0为工作方式1//
- TH0=(65536-1000)/256; //12MHZ,1MS一次中断,商//
- TL0=(65536-1000)%256; //低位装数=余数//
-
- EA=1; //开总中断//
- ET0=1; //开定时器0中断
- TR0=1;//启动定时器0//397//
- // X0=1;//把P3.3 复位脚 RST OUT-LOW 设置为高电平==========????????????????????????
- Y0=1;//出0,停止
- P3M1=0x0;// 高8位为0000 0000
- P3M0=0x4; //低8位为0000 0100 3.2脚为推挽输出,7脚串联1K电阻到地,有4毫安电流。其他是准双向口串联1K电阻到地只有13微安 ( 写成 P3M1=0x00; P3M0=0x40;不行,已经验证了)。
-
- while(1)//大循环
- {
- jlu=0;//几率------
- //以下是你的编程区=========================================
-
-
- //以下语句是获取旋转编码器的信息
- qian=X0; //把减键X0的电平映射给qian(前) //-------------------------------------------
- while(!X2) //X2加键低电平进入循环
- {
- hou=X0; //把减键X0的电平映射给hou(后)
- flag=1; //标志量置1,表示编码开关被旋转了
- }
- if(flag==1) //编码开关被旋转了,判断减键X0的电平在X2加键低电平时的前后变化来获取转向信息
- {
- flag=0; //标志量清零,过桥抽板
- if( (qian==0)&&(hou==1) ) { if(ks<10)ks++; } //前低后高,减键的上升沿为正(向右)旋转,记数ks加1
- if( (qian==1)&&(hou==0) ) { if(ks>0)ks--; } //前高后低,减键的下降沿则为反(向左)旋转,记数ks减1
-
-
- } //到这,KS值会运随编码器的加减键信号变化在0--10范围内变化-------------------------------
-
- //到这,旋转编码器的信息获取完毕
-
- //以下你不要编程=========================================
- while(jlu<1) //几率-------
-
- {_nop_(); _nop_(); _nop_(); }
-
-
- }
- }
-
-
- void exter0() interrupt 1 //定时器0的中断程序//定时器1的中断程序 void exter1() interrupt 3//
- {
- TH0=(65536-1000)/256; //重装数12MHz 1000=1ms,如果不重装,默认数是65536,不是想要的10000//
- TL0=(65536-1000)%256;
-
-
- //X0滤波
- if(X0==0) {t00++;t01=0;}
- if(t00==lbcs){b00=1;b01=0; } //b00=1,就是按下
- if(b00==1) t00=0;
- if(X0==1) {t01++;t00=0;}
- if(t01==lbcs){b01=1;b00=0; } //b01=1,就是松手
- if(b01==1) t01=0;
- //X1滤波
- if(X1==0) {t10++;t11=0;}
- if(t10==lbcs){b10=1;b11=0; } //b10=1,就是按下
- if(b10==1) t10=0;
- if(X1==1) {t11++;t10=0;}
- if(t11==lbcs){b11=1;b10=0; } //b11=1,就是松手
- if(b11==1) t11=0;
-
-
- //X2滤波
- if(X2==0) {t20++;t21=0;}
- if(t20==lbcs){b20=1;b21=0; } //b20=1,就是按下
- if(b20==1) t20=0;
- if(X2==1) {t21++;t20=0;}
- if(t21==lbcs){b21=1;b20=0; } //b21=1,就是松手
- if(b21==1) t21=0;
-
-
-
-
- //以下是你的编程区=======================================
-
- //到这,KS值会运随加减键在0--10范围变化,以下就根据ks值做相应工作
-
- //-----------------------------------------------------//用1个LED做档位显示,连输出脉冲都显示 tx Y31
- if(X0==0){tx=0 ; Y31=1; }
- if(X1==0){tx=0 ; Y31=1; }
- if(X2==0){tx=0 ; Y31=1; } //3个输入有一个按下就不显示,并清零
- if(X1!=0){ //点焊按键没按下时候才显示档位---------------------------------------------------------
- if(ks==0) Y31=0;//0档时长亮,当作电源显示
-
- if(ks>0) tx++; //公共显示开始 0.4秒1闪 是多少档就闪多少次
- if(tx==2) Y31=1; //灭了0档时的长亮
- if(tx==2000) Y31=0;
- if(tx==2100) Y31=1;// 1档
- if(tx==2400) Y31=0;
- if(tx==2500) Y31=1;// 2
- if(tx==2800) Y31=0;
- if(tx==2900) Y31=1;// 3
- if(tx==3200) Y31=0;
- if(tx==3300) Y31=1;// 4
- if(tx==3600) Y31=0;
- if(tx==3700) Y31=1;// 5
- if(tx==4000) Y31=0;
- if(tx==4100) Y31=1;// 6
- if(tx==4400) Y31=0;
- if(tx==4500) Y31=1;// 7
- if(tx==4800) Y31=0;
- if(tx==4900) Y31=1;// 8
- if(tx==5200) Y31=0;
- if(tx==5300) Y31=1; // 9
- if(tx==5600) Y31=0;
- if(tx==5700) Y31=1; // 10
- if(tx>=5701) tx=0; // tx归零 ----------------公共显示结束
- if(ks==1) { if(tx==2100) tx=0; }// 1 档 --------------------各档显示控制
- if(ks==2) { if(tx==2500) tx=0; }// 2
- if(ks==3) { if(tx==2900) tx=0; }// 3
- if(ks==4) { if(tx==3300) tx=0; }// 4
- if(ks==5) { if(tx==3700) tx=0; }// 5
-
- if(ks==6) { if(tx==4100) tx=0; }// 6
- if(ks==7) { if(tx==4500) tx=0; }// 7
- if(ks==8) { if(tx==4900) tx=0; }// 8
- if(ks==9) { if(tx==5300) tx=0; }// 9
- if(ks==10) { if(tx==5700) tx=0; }// 10 ------------------
-
-
- if (Y0==0) tx=0; //每次电焊时显示归零-----------------
- } //--------------------------------------------------------------------------------------------------------------------------------
- if( k3==1){
-
- if(Y0==0) Y31=0;
- if(Y0==1) Y31=1; //显示点焊脉冲======================================================================??????
- }
- // 以下为焊接脉冲时长控制 1到10档,3到12毫秒,最少3毫秒(1档),每档加1毫秒。7脚输出低电平为焊接,高平为停焊
-
- if(ks==1){ //1档开始 按下按键并松手,1秒后通电3ms,焊接时间
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
-
- if(k3==1){ t3++;
- if(t3==1000) { Y0=0; } //延迟1秒
- if(t3==1003) {Y0=1; //差值为3ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } // //1档结束
-
-
- if(ks==2){ //2档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1004) {Y0=1; //4ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } // //2档结束
-
-
-
- if(ks==3){ //3档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1005) {Y0=1; //5ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } // //3档结束
-
-
-
- if(ks==4){ //4档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1006) {Y0=1; //6ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //4档 //4档结束
- if(ks==5){ //5档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1007) {Y0=1; //7ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //5档 //5档结束
-
- if(ks==6){ //6档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1008) {Y0=1; //8ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } // //6档结束
- if(ks==7){ //7档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1009) {Y0=1; //9ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //7档 //7档结束
- if(ks==8){ //8档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1010) {Y0=1; //10ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //8档 //8档结束
- if(ks==9){ //9档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1011) {Y0=1; //11ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //9档 //9档结束
-
- if(ks==10){ //10档开始
- if(b10==1){b3=1;k3=0;}
- if(b3==1){ if(b11==1)
- {
- b3=0;
- k3=1;
- }
- }
- if(k3==1){ t3++;
- if(t3==1000) Y0=0; //延迟1秒
- if(t3==1012) {Y0=1; //12ms焊接时间
- t3=0;
- k3=0;
- }
- }
-
- } //10档 //10档结束
- //以下你不要编程========================
- jlu=1;//几率---------
- }
复制代码
|
打赏
-
查看全部打赏
|