标题: 关于硬件电路按键问题 [打印本页]
作者: o小青年o 时间: 2016-6-25 09:27
标题: 关于硬件电路按键问题
最近做了一个直流电机闭环调速硬件电路,按键有4个,1.启动/停止
2.正转/反转
3.加一转(按住可以连续加转)
4.减一转(按住可以连续减转)
电路焊接完成后,按键1按一下本应该是启动,再按一下是停止。可是按一下后启动后立刻就停止了。求解答
以下是按键1的程序
if(!KEY1) //开始停止按键
{
Delay_ms(10);
if(!KEY1) //开始停止按键
{
i++;
if(i%2==0)
{
Motor_Speed(1);//开始
LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
}
if(i%2==1)
{
Motor_Speed(0);//停止
LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
}
while(!KEY1);
}
}
其中Motor_Speed(0);Motor_Speed(1);是电机运行状态子程序
作者: 腾飞的龙 时间: 2016-6-25 12:38
要加个变量或标志位的。标志位取反。
作者: yzwzfyz 时间: 2016-6-25 15:45
未细看你的程序.
应该是你防弹动失效.
作者: suizhenbo 时间: 2016-6-25 15:50
给你一个项目中用的:
static u8 st;
if(K1 == 0)
{
if(st == 0)
{
Delay(5000);
if(K1 == 0)
{
st = 1;
按键执行代码。
}
}
}
else
st = 0;
作者: WSHXM 时间: 2016-6-25 16:51
用标志位,防抖动
作者: zl2168 时间: 2016-6-25 17:12
本帖最后由 zl2168 于 2016-6-25 17:15 编辑
直流电机正反转及PWM调速
先Proteus仿真一下,确认有效。
实例100 直流电机正反转及调速.rar
(44.12 KB, 下载次数: 4)
按下Kp,电机正转(顺时针);按下Kn,电机反转(逆时针)。两位数码管显示PWM脉冲波占空比,初始值为70(脉冲高电平占比70%)。按一次加速键up,占空比加1;按住不放,快速加1;最大值100(显示00)。按一次减速键up,占空比减1;按住不放,快速减1;最小值20。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: o小青年o 时间: 2016-6-25 18:12
以下是除了1602以外的全部程序,求各位帮忙看看 哪有错误没!
#include<reg52.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
bit flag; //¶¨òå±ê־λ
unsigned long x,x1;
uint T0count; //′óT0μļÆêyμ¥ÔaÖD¶á衼ÆêyμÄêyÖμ
uint timecount;
unsigned char Motor_Count,Set_Count=199;
sbit KEY1 = P1^3;//°′¼ü11
sbit KEY2 = P1^4;//°′¼ü2
sbit KEY3 = P1^5;//°′¼ü3
sbit KEY4 = P1^6;//°′¼ü4
sbit IN1 = P2^0;//μç»ú¿ØÖƶË1
sbit IN2 = P2^1;//μç»ú¿ØÖƶË2
sbit EN = P2^2; //μç»úê1Äü¶Ë
void Timer(void);
//Ñóê±oˉêy
void Delay_ms(uint jj) //Ñóê±1oáÃë
{
uint ii;
while(jj--)
for(ii=0;ii<116;ii++);
}
void Motor_Speed(unsigned char Speed) //μç»ú×′ì¬
{
if(Speed==0) {IN1=0;IN2=0;}//í£Ö1
if(Speed==1) {IN1=0;IN2=1;}//Õy×a
if(Speed==2) {IN1=1;IN2=0;}//·′×a
}
void main() //
{
unsigned char Data[3];
unsigned int i,j;
unsigned char Set_x;
Timer(); //¶¨ê±Æ÷3õê¼»ˉ
LCD1602_init();//òo¾§3õê¼»ˉ
//////////////////////////0123456789ABCDEF
LCD1602_Disp_ZF(0x80,"Now Speed: r/s",16);//ÏÔê¾êμê±Ëù¶è
//0123456789ABCDEF
LCD1602_Disp_ZF(0x80+0X40,"Set: r/s ",16); //éèÖÃËù¶è
//LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
//LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
Motor_Speed(0);//??
Set_Count=1;
Set_x=30;
Data[0]='0'+Set_x/100; //ÏÔê¾éèÖÃËù¶è°ùλ
Data[1]='0'+(Set_x/10)%10; //ÏÔê¾éèÖÃËù¶èê®Î»
Data[2]='0'+Set_x%10; //ÏÔê¾éèÖÃËù¶è¸öλ
LCD1602_Disp_ZF(0x84+0x40,Data,3); //ÏÔê¾éèÖÃËù¶è
while(1)
{
if(flag==1)
{
flag=0; //Çå±ê־λ
x=T0count*65536+TH0*256+TL0; //è¡μÃê±¼ä¿í¶è2Îêy
x=x/5; //¼ÆËãËù¶è
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1; //TR0=1,¿ØÖÆ¿a1رÕoÏ£¬¼¼êõÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
Data[0]='0'+x/100; //ÏÔê¾μ±Ç°Ëù¶è
Data[1]='0'+(x/10)%10; //ÏÔê¾μ±Ç°Ëù¶è
Data[2]='0'+x%10; //ÏÔê¾μ±Ç°Ëù¶è
LCD1602_Disp_ZF(0x80,"Now Speed: r/s",16); //ÏÔê¾μ±Ç°Ëù¶è
LCD1602_Disp_ZF(0x8a,Data,3); //ÏÔê¾μ±Ç°Ëù¶è
if(x>Set_x)//Ëù¶èμ÷½ú
{
if(Set_Count==0)Set_Count=1;//¼õËù
Set_Count--;
}
if(x<Set_x) //Ëù¶èμ÷½ú
{
Set_Count++;
if(Set_Count==200)Set_Count=199;//¼óËù
}
}
if(!KEY1) //¿aê¼í£Ö1°′¼ü
{
Delay_ms(50);
if(!KEY1) //
{
i++;
if(i%2==0)
{
Motor_Speed(1);//¿aê¼
LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
}
if(i%2==1)
{
Motor_Speed(0);//í£Ö1
LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
}
while(!KEY1);
}
}
if(!KEY2) //Õy×a·′×a°′¼ü
{
Delay_ms(10);
if(!KEY2)
{
j++;
if(j%2==0)//Õy×a
{
Motor_Speed(1);
LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
}
if(j%2==1)//·′×a
{
Motor_Speed(2);
LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
}
while(!KEY2);
}
}
//////////////////////////////////
if(!KEY3) //éèÖüóËù
{
Delay_ms(50);
if(!KEY3)//
{
Set_x ++;
if(Set_x>30)Set_x=30;
Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
Data[2]='0'+Set_x%10; //??????
LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
}
}
if(!KEY4)//éèÖüõËù
{
Delay_ms(50);
if(!KEY4)//????
{
if(Set_x==0)Set_x=1;
Set_x --;
Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
Data[2]='0'+Set_x%10; //ÏÔê¾éèÖÃËù¶è
LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
}
}
/////////////////////////////////
/////////////////////
///////////////////////////
}
}
void t0() interrupt 1 using 0 //T0ÖD¶Ï·tÎñ
{
T0count++; //¶ÔP3.4¿úμÄÂö3å½øDD¼Æêy
}
void t1(void) interrupt 3 using 0 //T1ÖD¶Ï·tÎñ
{
TH1=(65536-368)/256; //¼Æêy3õÖμÖØ×°ÔØ
TL1=(65536-368)%256;
timecount++;
Motor_Count++;
if(Motor_Count==Set_Count) //μ÷½úËù¶è
{
EN=0;
}
if(Motor_Count==200) //μ÷½úËù¶è
{
EN=1;
Motor_Count=0;
}
if(timecount==249) //1s¼Æêy±êÖ¾
{ TR0=0;
timecount=0;
flag=1; // ÖÃλ±ê־λ
}
}
void Timer(void)
{
TMOD=0x15; //T01¤×÷Îa16λ¼ÆêyÆ÷£¨·½ê½1£©,T11¤×÷·½ê½Îa16λ¶¨ê±Æ÷
TH0=0; //¼ÆêyÎa65536
TL0=0; //
TH1=(65536-4000)/256; //¶¨ê±Æ÷2éóö¨ê±4ms,3õÖμÎa4000
TL1=(65536-4000)%256;
TR1=1; //TR1=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷,Æô¶ˉ¶¨ê±
TR0=1; //TR0=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
ET0=1; //¶¨ê±Æ÷0¿aÖD¶Ï
ET1=1; //¶¨ê±Æ÷1¿aÖD¶Ï
EA=1; //CPU¿aÖD¶Ï
}
作者: o小青年o 时间: 2016-6-25 18:15
以下是全部程序,编译后没有错误和警告,但是烧录到单片机后就出现我之前说的按键问题了,帮忙看看!谢谢!
#include<reg52.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
bit flag; //¶¨òå±ê־λ
unsigned long x,x1;
uint T0count; //′óT0μļÆêyμ¥ÔaÖD¶á衼ÆêyμÄêyÖμ
uint timecount;
unsigned char Motor_Count,Set_Count=199;
sbit KEY1 = P1^3;//°′¼ü11
sbit KEY2 = P1^4;//°′¼ü2
sbit KEY3 = P1^5;//°′¼ü3
sbit KEY4 = P1^6;//°′¼ü4
sbit IN1 = P2^0;//μç»ú¿ØÖƶË1
sbit IN2 = P2^1;//μç»ú¿ØÖƶË2
sbit EN = P2^2; //μç»úê1Äü¶Ë
void Timer(void);
//Ñóê±oˉêy
void Delay_ms(uint jj) //Ñóê±1oáÃë
{
uint ii;
while(jj--)
for(ii=0;ii<116;ii++);
}
void Motor_Speed(unsigned char Speed) //μç»ú×′ì¬
{
if(Speed==0) {IN1=0;IN2=0;}//í£Ö1
if(Speed==1) {IN1=0;IN2=1;}//Õy×a
if(Speed==2) {IN1=1;IN2=0;}//·′×a
}
void main() //
{
unsigned char Data[3];
unsigned int i,j;
unsigned char Set_x;
Timer(); //¶¨ê±Æ÷3õê¼»ˉ
LCD1602_init();//òo¾§3õê¼»ˉ
//////////////////////////0123456789ABCDEF
LCD1602_Disp_ZF(0x80,"Now Speed: r/s",16);//ÏÔê¾êμê±Ëù¶è
//0123456789ABCDEF
LCD1602_Disp_ZF(0x80+0X40,"Set: r/s ",16); //éèÖÃËù¶è
//LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
//LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
Motor_Speed(0);//??
Set_Count=1;
Set_x=30;
Data[0]='0'+Set_x/100; //ÏÔê¾éèÖÃËù¶è°ùλ
Data[1]='0'+(Set_x/10)%10; //ÏÔê¾éèÖÃËù¶èê®Î»
Data[2]='0'+Set_x%10; //ÏÔê¾éèÖÃËù¶è¸öλ
LCD1602_Disp_ZF(0x84+0x40,Data,3); //ÏÔê¾éèÖÃËù¶è
while(1)
{
if(flag==1)
{
flag=0; //Çå±ê־λ
x=T0count*65536+TH0*256+TL0; //è¡μÃê±¼ä¿í¶è2Îêy
x=x/5; //¼ÆËãËù¶è
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1; //TR0=1,¿ØÖÆ¿a1رÕoÏ£¬¼¼êõÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
Data[0]='0'+x/100; //ÏÔê¾μ±Ç°Ëù¶è
Data[1]='0'+(x/10)%10; //ÏÔê¾μ±Ç°Ëù¶è
Data[2]='0'+x%10; //ÏÔê¾μ±Ç°Ëù¶è
LCD1602_Disp_ZF(0x80,"Now Speed: r/s",16); //ÏÔê¾μ±Ç°Ëù¶è
LCD1602_Disp_ZF(0x8a,Data,3); //ÏÔê¾μ±Ç°Ëù¶è
if(x>Set_x)//Ëù¶èμ÷½ú
{
if(Set_Count==0)Set_Count=1;//¼õËù
Set_Count--;
}
if(x<Set_x) //Ëù¶èμ÷½ú
{
Set_Count++;
if(Set_Count==200)Set_Count=199;//¼óËù
}
}
if(!KEY1) //¿aê¼í£Ö1°′¼ü
{
Delay_ms(50);
if(!KEY1) //
{
i++;
if(i%2==0)
{
Motor_Speed(1);//¿aê¼
LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
}
if(i%2==1)
{
Motor_Speed(0);//í£Ö1
LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
}
while(!KEY1);
}
}
if(!KEY2) //Õy×a·′×a°′¼ü
{
Delay_ms(10);
if(!KEY2)
{
j++;
if(j%2==0)//Õy×a
{
Motor_Speed(1);
LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
}
if(j%2==1)//·′×a
{
Motor_Speed(2);
LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
}
while(!KEY2);
}
}
//////////////////////////////////
if(!KEY3) //éèÖüóËù
{
Delay_ms(50);
if(!KEY3)//
{
Set_x ++;
if(Set_x>30)Set_x=30;
Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
Data[2]='0'+Set_x%10; //??????
LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
}
}
if(!KEY4)//éèÖüõËù
{
Delay_ms(50);
if(!KEY4)//????
{
if(Set_x==0)Set_x=1;
Set_x --;
Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
Data[2]='0'+Set_x%10; //ÏÔê¾éèÖÃËù¶è
LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
}
}
/////////////////////////////////
/////////////////////
///////////////////////////
}
}
void t0() interrupt 1 using 0 //T0ÖD¶Ï·tÎñ
{
T0count++; //¶ÔP3.4¿úμÄÂö3å½øDD¼Æêy
}
void t1(void) interrupt 3 using 0 //T1ÖD¶Ï·tÎñ
{
TH1=(65536-368)/256; //¼Æêy3õÖμÖØ×°ÔØ
TL1=(65536-368)%256;
timecount++;
Motor_Count++;
if(Motor_Count==Set_Count) //μ÷½úËù¶è
{
EN=0;
}
if(Motor_Count==200) //μ÷½úËù¶è
{
EN=1;
Motor_Count=0;
}
if(timecount==249) //1s¼Æêy±êÖ¾
{ TR0=0;
timecount=0;
flag=1; // ÖÃλ±ê־λ
}
}
void Timer(void)
{
TMOD=0x15; //T01¤×÷Îa16λ¼ÆêyÆ÷£¨·½ê½1£©,T11¤×÷·½ê½Îa16λ¶¨ê±Æ÷
TH0=0; //¼ÆêyÎa65536
TL0=0; //
TH1=(65536-4000)/256; //¶¨ê±Æ÷2éóö¨ê±4ms,3õÖμÎa4000
TL1=(65536-4000)%256;
TR1=1; //TR1=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷,Æô¶ˉ¶¨ê±
TR0=1; //TR0=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
ET0=1; //¶¨ê±Æ÷0¿aÖD¶Ï
ET1=1; //¶¨ê±Æ÷1¿aÖD¶Ï
EA=1; //CPU¿aÖD¶Ï
}
作者: zl2168 时间: 2016-6-26 21:44
本帖最后由 zl2168 于 2016-6-27 19:47 编辑
你这个不是“闭环调速”,闭环是具有负反馈自动调节功能,是用输出信号反馈到输入端,形成一个闭合环形电路。
作者: o小青年o 时间: 2016-6-28 13:33
我这个是首先通过按键设置马达的速度,然后通过光耦开关检测马达的速度,然后经过程序比较,最后才实现的闭环调速。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |