daxiaolijun 发表于 2012-11-21 14:54:06

有没有活跃一点的51交流QQ群呀?

      本人菜鸟一名,自学51一段时间(机械专业),其中很多不懂,有问题来论坛发帖也很久才有人回复,大多稍稍点到为止,所以本人想找个好一点的51QQ群,及时交流,更多更好的向51大神们学习。

另外发一下最近一直困扰我的一段程序,发了几次贴,问题还没有解决,再发一次,目的和问题都在里边,望大神们指点,本人不胜感激。

wkman 发表于 2012-11-21 15:10:37

q群是个最不方便交流的东西,,{:smile:}

daxiaolijun 发表于 2012-11-21 15:40:57

wkman 发表于 2012-11-21 15:10 static/image/common/back.gif
q群是个最不方便交流的东西,,

{:2_28:} {:2_25:} 关键是自己学,我觉得找个交流群总比自己想当然要好得多。

WXF_mabg 发表于 2012-11-21 15:47:14

没有东西啊

daxiaolijun 发表于 2012-11-21 16:08:39

WXF_mabg 发表于 2012-11-21 15:47 static/image/common/back.gif
没有东西啊

不会吧?我把hex文件压缩了,再传下吧

yuyu87 发表于 2012-11-21 16:14:37

活跃意味着全是新手

aureole 发表于 2012-11-21 16:31:45

qq群,一帮人问问题,即使有人回答,也都是日经问题,,没有一点积累。。。有问题还是论坛比较好

Anqi90 发表于 2012-11-21 16:39:26

感觉51没多少东西,做个数码管时钟基本就了解的差不多了,剩下的就是熟悉相关的外设了
要找个专门讨论51的恐怕不太容易吧

daxiaolijun 发表于 2012-11-21 17:12:07

yuyu87 发表于 2012-11-21 16:14 static/image/common/back.gif
活跃意味着全是新手

呵呵,好像是这样的

daxiaolijun 发表于 2012-11-21 17:15:23

Anqi90 发表于 2012-11-21 16:39 static/image/common/back.gif
感觉51没多少东西,做个数码管时钟基本就了解的差不多了,剩下的就是熟悉相关的外设了
要找个专门讨论51的 ...

我觉得你说的这些有道理,大部分我也按这个做的,但是到实际脱离书本自己想做点东西的时候还是好多无从下手。能看下我那个程序问题出在哪吗?谢谢!

daxiaolijun 发表于 2012-11-21 17:18:48

renpeng009 发表于 2012-11-21 16:30 static/image/common/back.gif
楼上说的是实情

哎,俺也知道事实就这样,但论坛我也发了,没什么结果,估计大神们都不屑看这些新手帖。帮我看下我的程序到底出在哪好吗?给点提示,谢谢。折腾我好久了。

daxiaolijun 发表于 2012-11-21 17:19:18

daxiaolijun 发表于 2012-11-21 17:15 static/image/common/back.gif
我觉得你说的这些有道理,大部分我也按这个做的,但是到实际脱离书本自己想做点东西的时候还是好多无从下 ...

给点提示吧,谢谢!!!

Anqi90 发表于 2012-11-21 17:20:23

不是用的rar打的包吗,怎么还要安什么软件...

daxiaolijun 发表于 2012-11-21 17:21:07

daxiaolijun 发表于 2012-11-21 17:12 static/image/common/back.gif
呵呵,好像是这样的

帮我看看问题出在哪,不一定非得找出来,给点你认为有问题的地方就OK,3Q!

TANK99 发表于 2012-11-21 17:43:18

只有卖开发板的才会建一些群,你找一下。

daxiaolijun 发表于 2012-11-21 18:34:43

Anqi90 发表于 2012-11-21 17:20 static/image/common/back.gif
不是用的rar打的包吗,怎么还要安什么软件...

压缩文件属性石Zip的,应该是一样的吧?能打开,直接点开里面就是hex的文本文档呀。

Anqi90 发表于 2012-11-21 18:45:13

只有一个说明:

尊敬的用户:

    您当前使用的压缩软件无法直接查看或解压这个压缩包,因其在打包过程中采用
了快压的超高压缩技术。

这里为您列出压缩包中的内容:
1、试验.c


    如要使用压缩包的全部内容,请您使用以下链接下载并安装快压压缩软件。
http://www.kuaizip.com/down/KuaiZip_installer.exe

=======================================================================
快压简介:快压(KuaiZip)是一款免费、方便、快速的压缩和解压缩利器,拥有
一流的压缩技术,是国内第一款具备自主压缩格式的软件。快压自身的压缩格式KZ
具有超大的压缩比和超快的压缩解压速度,兼容 RAR, ZIP 和 7Z 等40余种压缩文
件。快压特有的虚拟化技术,还可挂载压缩包、光驱镜像和虚拟机。
=======================================================================

像这种强行推广的软件我是不会用的

daxiaolijun 发表于 2012-11-21 19:04:55

Anqi90 发表于 2012-11-21 18:45 static/image/common/back.gif
只有一个说明:

尊敬的用户:


呵呵,对不起,我用的压缩文件就是快压的,没想到这软件这么霸道。我把程序发在下面吧,认为哪有问题希望大神不吝赐教。

//目的:两个按键控制两个直流电机的加速和减速,长按(>=2S)加速,短按减速,上电时两电机均有个初速。
//问题:在该程序下连接两个电机时按键操作没反应,去掉一个电机按键全都是减速,加速没反应。
//有人给的建议键盘扫描不要一起扫,我分开扫,毛病同上;有人说开关语句里没有default,我觉得不重要,但还是加了,毛病依然。
//(补充:我按这个程序写一个按键控制一个电机时达到目的,到两个按键就没反应了)        帖子发了几篇,还没解决问题,我也没辙了。               
#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,numt,num1_speed,num2_speed;

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

void keyscan()
{
        uchar keynum=0;

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

                if(keytime>=40)
                {
                        switch(keynum)
                        {
                                case 1:       
                                {
                                        num1_speed=num1_speed+1;               
                                        if(num1_speed>17)
                                                num1_speed=8;
                                }
                                        keynum=0;
                                        break;

                                case 2:
                                {
                                        num2_speed=num2_speed+1;               
                                        if(num2_speed>17)
                                                num2_speed=8;
                                }       
                                        keynum=0;
                                        break;

                                default: break;                //keynum=0的情况直接跳出
                        }
                }

                if(keytime<40)
                {
                        switch(keynum)
                        {
                                case 1:       
                                {
                                        num1_speed=num1_speed-1;
                                        if(num1_speed<8)
                                                num1_speed=8;
                                }
                                        keynum=0;
                                        break;
                       
                                case 2:
                                {
                                        num2_speed=num2_speed-1;
                                        if(num2_speed<8)
                                                num2_speed=8;
                                }
                                        keynum=0;
                                        break;
                               
                                default: 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();
        num1_speed=12;
        num2_speed=12;
        while(1)
        {
                keyscan();
        }
}

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

        if(num1<num1_speed)       
                U1=1;
                else U1=0;
                if(num1>17)
                        num1=0;

        if(num2<num2_speed)
                U2=1;
                else U2=0;
                if(num2>17)
                        num2=0;
}

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

renpeng009 发表于 2012-11-22 01:53:19

我修改了下,Keil软仿通过。因为我没有你的实物,请自行测试。
#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,num1_speed,num2_speed;
volatile uint keytime,numt;

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

void keyscan()
{
      uchar keynum=0;

      if((KEY1==0)||(KEY2==0))
      {
                delayms(5);
                if((KEY1==0)||(KEY2==0))
                {
                        TR0=1;
                                                                                                while((!KEY1)||(!KEY2))
                        {
                              
                              if(KEY1==0) keynum=1;
                              else keynum=2;
                        }
                        TR0=0;
                        keytime=numt;
                        numt=0;
                }

                if(keytime>=40)
                {
                        switch(keynum)
                        {
                              case 1:      
                              {
                                        num1_speed=num1_speed+1;               
                                        if(num1_speed>17)
                                                num1_speed=8;
                              }
                                        keynum=0;
                                        break;

                              case 2:
                              {
                                        num2_speed=num2_speed+1;               
                                        if(num2_speed>17)
                                                num2_speed=8;
                              }      
                                        keynum=0;
                                        break;

                              default: break;                //keynum=0的情况直接跳出
                        }
                }

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

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

void main()
{      
      init();
      num1_speed=12;
      num2_speed=12;
      while(1)
      {
                keyscan();
      }
}

void Time0_Init() interrupt 1    using 1//定时器0作用是控制PWM
{

      TH0=(65536-45872)/256;
      TL0=(65536-45872)%256;
      numt++;   
}

void Time1_Init() interrupt 3   using 2   
{
      TH1=(65536-20)/256; //20us      
      TL1=(65536-20)%256;
      num1++;      
      num2++;

      if(num1<num1_speed)      
                U1=1;
                else U1=0;
                if(num1>17)
                        num1=0;

      if(num2<num2_speed)
                U2=1;
                else U2=0;
                if(num2>17)
                        num2=0;                  
}

daxiaolijun 发表于 2012-11-22 08:21:13

renpeng009 发表于 2012-11-22 01:53 static/image/common/back.gif
我修改了下,Keil软仿通过。因为我没有你的实物,请自行测试。

非常非常感谢,我会好好看看,好人一生平安!!!{:smile:}

Anqi90 发表于 2012-11-22 10:25:24

本帖最后由 Anqi90 于 2012-11-22 14:56 编辑

按键检测里最好加一个超时跳出,这里面: while((!KEY1)||(!KEY2))
这样就不会是松开按键以后才有反应,而是按到两秒就开始动作了
不过这样的话还要加一个标志位,标志按键按下后是否抬起来过,不然一循环又检测到按键按下了,其实是上次的还没抬起来

按键的记录最好也是分开保存, 而不是把两个按键都放一个变量里,这样两个键同时操作也没问题
当然相应的控制部分也需要变一下

总之就是设4个变量,比如key1_down, key2_down, key1_up, key2_up
只有在up之后才检测是否down,down之后只检测是否up

同样的按键时间也会用到两个,可以在按键按下的时候记录一个起始时间,抬起时再记录一个终止时间,这样就可以计算出按下时间,也不复杂


以上只是看了你的代码后的一些想法,可能对你目前的问题没有多大帮助,不过根据你的描述感觉可能和两个按键的检测有关
先把按键检测的逻辑理清楚吧,感觉问题不是很复杂,要有信心啊

=========修改错别字

上路新手 发表于 2012-11-22 11:17:42

170548848这个群还不错

daxiaolijun 发表于 2012-11-22 13:52:46

上路新手 发表于 2012-11-22 11:17 static/image/common/back.gif
170548848这个群还不错

{:victory:} 加进去看看。3Q

daxiaolijun 发表于 2012-11-22 13:57:19

Anqi90 发表于 2012-11-22 10:25 static/image/common/back.gif
按键检测里最好加一个超时跳出,这里面: while((!KEY1)||(!KEY2))
这样就不会是松开按键以后才有反应,而 ...

乍一听起来有点晕,得好好消化你的意见。非常感谢你的意见,好人一生平安!3Q!
页: [1]
查看完整版本: 有没有活跃一点的51交流QQ群呀?