大神看看问题出在哪???
RT;帖子发了几次,都没有得到满意的结果,本人自学单片机,实在找不去问题,也折腾很久,没辙,再发一次,望大神们不吝赐教,本人不胜感激!!【目的】一个按键控制一个直流电机的转速变化——长按(大于等于2秒)电机转速增加,短按(小于等于2秒)电机转速减小。【程序可行,达到目标】因此,在前面这些基础上想实现两个按键控制两个直流电机的转速,就出毛病了。
【毛病】两个按键控制两个电机时,按键时电机转速没变化,在该程序下撤去一个电机,按键作用全为减速,而且保持一会之后又速度自己加上去了。
【PS】直流电机周期为400us,程序在这方面应该没问题(我自己认为的。或许第二个程序里有些赋值有问题没发现)。 压缩文件我用的是快压,可能有些解压工具打不开,请见谅,也可以加我QQ455238065,本人诚挚希望找一位单片机高手做师傅(本人机械专业,自学单片机)。{:smile:} 看不懂C,帮不了你。。。 本帖最后由 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++;
}
表示没看出何问题,重新创建一工程试一下呢? HeP028 发表于 2012-12-2 23:15 static/image/common/back.gif
表示没看出何问题,重新创建一工程试一下呢?
这两天有点事情,没及时回复,sorry!我看了你的程序,和我写的差不多,主要就是定时器1开启的时间一个是在判定键按下之后,一个就是松手检测之前,我觉得好像是一样的吧?再就是您写的是1秒判定和我写的2秒判定,能说说您改的理由吗?交流下心得。我一会试试您的程序。同时谢谢您的建议。 希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的 metalmadman 发表于 2012-12-4 08:08 static/image/common/back.gif
希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的 ...
有例子参考下吗?谢谢,稍微写下也行,我试试。没感觉这个程序有多大,以前练习的时候也是这么写的。 按键判断最好用状态机的方式 hansur 发表于 2012-12-4 10:24 static/image/common/back.gif
按键判断最好用状态机的方式
就是这种吗?
if(key1==0) 执行1部分程序;
if(key2==0) 执行2部分程序;
void 1 部分()
{。。。}
void 2 部分()
{。。。}
感觉差不多吧?
把你的想法说的详细点,我再试试,谢谢! 怎么就没有想象中的那么多人呢?程序不是很难吧?高手在哪里?{:cry:}{:cry:}{:cry:} 不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试 metalmadman 发表于 2012-12-7 10:47 static/image/common/back.gif
不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试 ...
不知道是效果不太明显(你在程序中加的指示灯也没亮,按键对两电机转速不起作用),也可能是硬件引脚什么的不同,没有达到效果,转速没变化。本来以为是按键的问题,但我又写了两个按键控制两组流水灯之间的切换时按键没问题。但是非常感谢你的程序,对我的启发很大,因为是新手以前写程序都没用过状态机,我再结合电机本身仔细分析分析你的程序。祝福你,好人一生平安。{:smile:} 给你一个思路:在10ms定时中断里检测两个按键,连续两次检测到低电平就认为按键按下,连续两次检测到高电平就认为按键释放,对按键按下到释放记时,超过2s(检测200次)就认为是长按,否则认为是短按,然后执行PWM占空比加减操作。两个按键可以同时检测。长按按键不放的话每隔一定时间PWM占空比增加一个步长。 关键是不能让程序在那里干等按键释放,等一个按键释放了,那么第二个按键就检测不到(或不准)了。你的程序问题就出在这里。 按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html adongliu 发表于 2012-12-7 22:11 static/image/common/back.gif
按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html ...
果然是精华中的精华,先熟悉熟悉,非常感谢您的推荐。 skyxjh 发表于 2012-12-7 21:55 static/image/common/back.gif
给你一个思路:在10ms定时中断里检测两个按键,连续两次检测到低电平就认为按键按下,连续两次检测到高 ...
非常感谢您的意见和建议,我会好好揣摩一下的。好人一生平安! daxiaolijun 发表于 2012-12-7 20:24 static/image/common/back.gif
不知道是效果不太明显(你在程序中加的指示灯也没亮,按键对两电机转速不起作用),也可能是硬件引脚什么 ...
不知LZ有没有收到我邮件?我在说一次吧,你在proteus 仿真的时候,看运行时间
左下角有个运行时间,你长按按键就看那个运行时间 还是不太了解你说的问题
页:
[1]