搜索
bottom↓
回复: 11

实在不知道毛病出在哪?大神进来看看

[复制链接]

出0入0汤圆

发表于 2012-11-15 18:50:15 | 显示全部楼层 |阅读模式
确实不知道问题出在哪了,帖子都快沉下去了,也没解决问题,重新再发帖!!!

目的:两个按键控制两个直流电机调速,长按键(>=2s)时对应电机加速,相反减速。(补充:该程序在一个按键一个电机时达到要求,当程序中补充到两个电机两个按键时未达到要求,出现的问题是按键时间长短好像都是出现的减速,而且有时按好几下才减,在该程序下连接一个电机也是上述问题),望高手指点。
                                                                                                ————自学51小菜鸟


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit U1=P1^1;
sbit U2=P1^2;
sbit KEY1=P3^4;
sbit KEY2=P3^3;

uchar num,num1,num2,keytime,keynum,numt,numspeed1,numspeed2;

void delayms(uint xms)
{
          uint i,j;
          for(i=xms;i>0;i--)
                           for(j=110;j>0;j--);
}

void keyscan()
{
          if(KEY1==0||KEY2==0)
          {
                  delayms(10);
                  if(KEY1==0||KEY2==0)
                  {
                          if(KEY1==0) keynum=1;
                          if(KEY2==0) keynum=2;
                          while((!KEY1)||(!KEY2))
                          {
                                  TR1=1;
                          }
                          TR1=0;
                          keytime=numt;
                          numt=0;
                  }

                 if(keytime>=40)
                  {
                          switch(keynum)
                          {
                                  case 1:
                                  {        
                                         {
                                                  numspeed1=numspeed1+2;               
                                                if(numspeed1>16)
                                                          numspeed1=8;
                                          }
                                          keynum=0;
                                          break;
                                  }
                                 
                                 case 2:
                                  {        
                                         {
                                                  numspeed2=numspeed2+2;               
                                                if(numspeed2>16)
                                                          numspeed2=8;
                                          }
                                          keynum=0;
                                          break;
                                  }
                          }
                  }

                 if(keytime<40)
                  {
                          switch(keynum)
                          {
                                  case 1:
                                  {        
                                         {
                                                  numspeed1=numspeed1-2;
                                                  if(numspeed1<8)
                                                          numspeed1=8;
                                          }
                                          keynum=0;
                                          break;
                                  }
                          
                                case 2:
                                  {        
                                         {
                                                  numspeed2=numspeed2-2;
                                                  if(numspeed2<8)
                                                          numspeed2=8;
                                          }
                                          keynum=0;
                                          break;
                                  }
                          }
                  }
         
         keytime=0;
          }
}

void init()
{
          TMOD|=0x11;
          TH0=(65536-20)/256;                //20us
          TL0=(65536-20)%256;
          TH1=(65536-45872)/256;
          TL1=(65536-45872)%256;
          EA=1;
          ET0=1;                                //开定时器0中断
          ET1=1;                                //开定时器1中断
          TR0=1;                                //启动定时器0
}

void main()
{        
         init();
          U1=1;
          U2=1;
          numspeed1=12;
          numspeed2=12;
          while(1)
          {
                  keyscan();
          }
}

void Time0_Init() interrupt 1    //定时器0作用是控制PWM
{
          TH0=(65536-20)/256; //20us        
          TL0=(65536-20)%256;
          num1++;        
         num2++;

         if(num1<numspeed1)        
                 U1=1;
                  else U1=0;
                  if(num1>20)
                          num1=0;

         if(num2<numspeed2)
                  U2=1;
                  else U2=0;
                  if(num2>20)
                          num2=0;
}

void Time1_Init() interrupt 3        
{
          TH1=(65536-45872)/256;
          TL1=(65536-45872)%256;
          numt++;                                
}

有高手说把键盘扫描分开写,我也照做了,毛病依然如故,确实检查不出来了,高手们使劲把你们的观点提出来吧,本人不胜感激。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-11-15 18:57:43 | 显示全部楼层
本人在校学生,车辆专业,自学51不久,不太懂硬件,只看了些郭天祥视频,在此想找个单片机高手师傅学习指导,有意者可以加Q:455238065.

出0入0汤圆

发表于 2012-11-15 20:40:20 | 显示全部楼层
同情楼主
首先,排除电机干扰问题:把电机换作LED灯(串联限流电阻)。

出0入0汤圆

 楼主| 发表于 2012-11-16 08:20:39 | 显示全部楼层
lcw_swust 发表于 2012-11-15 20:40
同情楼主
首先,排除电机干扰问题:把电机换作LED灯(串联限流电阻)。

谢谢你的建议,我试试。

出0入0汤圆

发表于 2012-11-16 08:26:18 | 显示全部楼层
把程序压缩后上传,明天帮你看看.

出0入0汤圆

发表于 2012-11-16 09:47:00 | 显示全部楼层
看半天只看出来:
   几个 switch 语句没有 default 项。
   case里的语句没必要用两个大括号括起来。

出0入0汤圆

 楼主| 发表于 2012-11-16 09:50:06 | 显示全部楼层
hell-prototypes 发表于 2012-11-16 09:47
看半天只看出来:
   几个 switch 语句没有 default 项。
   case里的语句没必要用两个大括号括起来。 ...

好像没注意到这些细节,谢谢你的提示。我一会试下。

出0入0汤圆

发表于 2012-11-16 09:51:58 | 显示全部楼层
肯定不能实现长按,每10毫秒numt就被清零,keytime长不上去
建议看看马潮老师在他的版面有个帖子专门讨论按键

if(KEY1==0||KEY2==0)
          {
                  delayms(10);
                  if(KEY1==0||KEY2==0)
                  {
                   ......
                          keytime=numt;
                          numt=0;
                   }
      }

出0入0汤圆

 楼主| 发表于 2012-11-16 10:01:55 | 显示全部楼层
sf49ers 发表于 2012-11-16 09:51
肯定不能实现长按,每10毫秒numt就被清零,keytime长不上去
建议看看马潮老师在他的版面有个帖子专门讨论按 ...

非常感谢,我会看那帖子。但是我一个电机和一个按键控制加减速时键盘扫描也是这么写的,但是加减速都正常实现,程序加到两个电机时按键和加减速才不行的。

出0入0汤圆

发表于 2012-11-16 10:25:49 | 显示全部楼层
daxiaolijun 发表于 2012-11-16 10:01
非常感谢,我会看那帖子。但是我一个电机和一个按键控制加减速时键盘扫描也是这么写的,但是加减速都正常 ...

sorry,我刚才说错了,没注意到while((!KEY1)||(!KEY2))用的是while

出0入0汤圆

 楼主| 发表于 2012-11-16 15:17:23 | 显示全部楼层
hell-prototypes 发表于 2012-11-16 09:47
看半天只看出来:
   几个 switch 语句没有 default 项。
   case里的语句没必要用两个大括号括起来。 ...

呵呵,针对你的建议我试了下,毛病还在。后来我翻了下书,书上说了switch语句中default部分并不是必须有的,没有这一部分,执行完所有的case语句就直接退出switch语句。还是谢谢你。

出0入0汤圆

 楼主| 发表于 2012-11-18 10:45:35 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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