daxiaolijun 发表于 2012-12-2 09:25:47

大神看看问题出在哪???

RT;帖子发了几次,都没有得到满意的结果,本人自学单片机,实在找不去问题,也折腾很久,没辙,再发一次,望大神们不吝赐教,本人不胜感激!!

【目的】一个按键控制一个直流电机的转速变化——长按(大于等于2秒)电机转速增加,短按(小于等于2秒)电机转速减小。【程序可行,达到目标】因此,在前面这些基础上想实现两个按键控制两个直流电机的转速,就出毛病了。
【毛病】两个按键控制两个电机时,按键时电机转速没变化,在该程序下撤去一个电机,按键作用全为减速,而且保持一会之后又速度自己加上去了。
【PS】直流电机周期为400us,程序在这方面应该没问题(我自己认为的。或许第二个程序里有些赋值有问题没发现)。

daxiaolijun 发表于 2012-12-2 09:32:23

压缩文件我用的是快压,可能有些解压工具打不开,请见谅,也可以加我QQ455238065,本人诚挚希望找一位单片机高手做师傅(本人机械专业,自学单片机)。{:smile:}

lxa0 发表于 2012-12-2 22:11:10

看不懂C,帮不了你。。。

HeP028 发表于 2012-12-2 23:15:09

本帖最后由 HeP028 于 2012-12-2 23:17 编辑

#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 num1=0,num2=0,num1_speed,num2_speed,key1_time,key2_time;
uint numt;

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

void keyscan()
{
        if(KEY1 == 0)
        {
                delayms(10);
                if(KEY1 == 0)
                {
                        TR1=1;
                        while(KEY1 == 0);
                        TR1=0;
                        key1_time=numt;
                        numt=0;
                }

                if(key1_time >= 20)
                {
                        num1_speed += 2;               
                        if(num1_speed > 16)
                        num1_speed = 8;
                }               

                if(key1_time < 20)
                {
                        num1_speed -= 2;
                        if(num1_speed < 8)
                        num1_speed =8;
                }
                key1_time=0;
        }

        if(KEY2==0)
        {
                delayms(10);
                if(KEY2==0)
                {
                        TR1=1;
                        while(KEY2 == 0);
                        TR1=0;
                        key2_time=numt;
                        numt=0;
                }

                if(key2_time >= 20)
                {
                        num2_speed += 2;               
                        if(num2_speed>16)
                        num2_speed = 8;
                }               

                if(key2_time < 20)
                {
                        num2_speed -= 2;
                        if(num2_speed<8)
                        num2_speed = 8;
                }
                key2_time=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>16)
                        num1=0;

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

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

表示没看出何问题,重新创建一工程试一下呢?

daxiaolijun 发表于 2012-12-4 08:01:34

HeP028 发表于 2012-12-2 23:15 static/image/common/back.gif
表示没看出何问题,重新创建一工程试一下呢?

这两天有点事情,没及时回复,sorry!我看了你的程序,和我写的差不多,主要就是定时器1开启的时间一个是在判定键按下之后,一个就是松手检测之前,我觉得好像是一样的吧?再就是您写的是1秒判定和我写的2秒判定,能说说您改的理由吗?交流下心得。我一会试试您的程序。同时谢谢您的建议。

metalmadman 发表于 2012-12-4 08:08:38

希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的

daxiaolijun 发表于 2012-12-4 10:18:08

metalmadman 发表于 2012-12-4 08:08 static/image/common/back.gif
希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的 ...

有例子参考下吗?谢谢,稍微写下也行,我试试。没感觉这个程序有多大,以前练习的时候也是这么写的。

hansur 发表于 2012-12-4 10:24:15

按键判断最好用状态机的方式

daxiaolijun 发表于 2012-12-4 11:29:59

hansur 发表于 2012-12-4 10:24 static/image/common/back.gif
按键判断最好用状态机的方式

就是这种吗?
if(key1==0) 执行1部分程序;
if(key2==0) 执行2部分程序;

void 1 部分()
{。。。}

void 2 部分()
{。。。}

感觉差不多吧?

把你的想法说的详细点,我再试试,谢谢!

daxiaolijun 发表于 2012-12-6 16:55:34

怎么就没有想象中的那么多人呢?程序不是很难吧?高手在哪里?{:cry:}{:cry:}{:cry:}

metalmadman 发表于 2012-12-7 10:47:12

不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试

daxiaolijun 发表于 2012-12-7 20:24:13

metalmadman 发表于 2012-12-7 10:47 static/image/common/back.gif
不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试 ...

不知道是效果不太明显(你在程序中加的指示灯也没亮,按键对两电机转速不起作用),也可能是硬件引脚什么的不同,没有达到效果,转速没变化。本来以为是按键的问题,但我又写了两个按键控制两组流水灯之间的切换时按键没问题。但是非常感谢你的程序,对我的启发很大,因为是新手以前写程序都没用过状态机,我再结合电机本身仔细分析分析你的程序。祝福你,好人一生平安。{:smile:}

skyxjh 发表于 2012-12-7 21:55:32

给你一个思路:在10ms定时中断里检测两个按键,连续两次检测到低电平就认为按键按下,连续两次检测到高电平就认为按键释放,对按键按下到释放记时,超过2s(检测200次)就认为是长按,否则认为是短按,然后执行PWM占空比加减操作。两个按键可以同时检测。长按按键不放的话每隔一定时间PWM占空比增加一个步长。

skyxjh 发表于 2012-12-7 22:04:51

关键是不能让程序在那里干等按键释放,等一个按键释放了,那么第二个按键就检测不到(或不准)了。你的程序问题就出在这里。

adongliu 发表于 2012-12-7 22:11:02

按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html

daxiaolijun 发表于 2012-12-8 09:25:09

adongliu 发表于 2012-12-7 22:11 static/image/common/back.gif
按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html ...

果然是精华中的精华,先熟悉熟悉,非常感谢您的推荐。

daxiaolijun 发表于 2012-12-8 09:27:39

skyxjh 发表于 2012-12-7 21:55 static/image/common/back.gif
给你一个思路:在10ms定时中断里检测两个按键,连续两次检测到低电平就认为按键按下,连续两次检测到高 ...

非常感谢您的意见和建议,我会好好揣摩一下的。好人一生平安!

metalmadman 发表于 2012-12-8 10:02:45

daxiaolijun 发表于 2012-12-7 20:24 static/image/common/back.gif
不知道是效果不太明显(你在程序中加的指示灯也没亮,按键对两电机转速不起作用),也可能是硬件引脚什么 ...

不知LZ有没有收到我邮件?我在说一次吧,你在proteus 仿真的时候,看运行时间
左下角有个运行时间,你长按按键就看那个运行时间

zhb1510172127 发表于 2013-3-14 22:01:04

HUALIANG 发表于 2013-4-10 12:05:39

还是不太了解你说的问题
页: [1]
查看完整版本: 大神看看问题出在哪???