- UID
- 934487
- 阅读权限
- 40
- 推广
-
- 幽默
-
- 注册时间
- 2016-7-16
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2021-10-22 15:04:21
|
显示全部楼层
//8脚 STC15F104W 5档调速程序,代替手把油门//达到要求,验证了,2021.10.19
//要求:用加速,减速,停,3个遥控键来控制车速。一个3键发射手柄灵一T1,一个接收模块灵一R1
#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; //几率-----------------=======
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; //标志量
uint t0,t2;//长按加减键0.7秒也会变一档或停
uint lbcs=5; //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句可以不要
sbit X0=P3^3; //减速 D0 // 3个输入
sbit X1=P3^4; //停 D1
sbit X2=P3^5; //加速 D2
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=0;//出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;//几率------
//以下是你的编程区=========================================
//以下你不要编程=========================================
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;
//以下是你的编程区=======================================
if(b20==1){b=1;k1=0;}
if(b==1){ if(b21==1)
{
b=0;
k1=1;
}
}
if(k1==1){ k1=0;
if(ks<5)ks++;
}
//X2 P3.5加速
if(b00==1){b1=1;k2=0;}
if(b1==1){ if(b01==1)
{
b1=0;
k2=1;
}
}
if(k2==1){ k2=0;
if(ks>0)ks--;
}
//X0 P3.3减速
if(b00==1)t0++;
if(t0>=700){t0=0;ks=0;Y0=0;}
if(b01==1){t0=0;} //减速键长按0.7秒就停
if(b20==1)t2++;
if(t2>=700){t2=0;ks=0;Y0=0;}
if(b21==1){t2=0;} //加速键长按0.7秒松手,就变 60/100 即是1档
if(b10==1){ ks=0; Y0=0; } //X1停按键 按下
ty++;
if(ty>10) {ty=0;} //设定一个0到10循环的时标钟,1毫秒进1.
if(ks==0) Y0=0;//灭,P3.2推挽 0/100 电源5.16V,出0V;
if(ks==1){ if(ty==0) Y0=1;
if(ty==6) Y0=0;
} // 60/100 电源5.16V,出1.88V;
if(ks==2){ if(ty==0) Y0=1;
if(ty==7) Y0=0;
} // 70/100 电源5.16V,出2.20V;
if(ks==3){ if(ty==0) Y0=1;
if(ty==8) Y0=0;
} // 80/100 电源5.16V,出2.52V;
if(ks==4){ if(ty==0) Y0=1;
if(ty==9) Y0=0;
} // 90/100 电源5.16V,出2.83V;
if(ks==5) Y0=1; // 100/100 电源5.16V,出3.46V;
//以下你不要编程=========================================
jlu=1;//几率---------
}
|
|