RT;帖子发了几次,都没有得到满意的结果,本人自学单片机,实在找不去问题,也折腾很久,没辙,再发一次,望大神们不吝赐教,本人不胜感激!!
【目的】一个按键控制一个直流电机的转速变化——长按(大于等于2秒)电机转速增加,短按(小于等于2秒)电机转速减小。【程序可行,达到目标】因此,在前面这些基础上想实现两个按键控制两个直流电机的转速,就出毛病了。
【毛病】两个按键控制两个电机时,按键时电机转速没变化,在该程序下撤去一个电机,按键作用全为减速,而且保持一会之后又速度自己加上去了。
【PS】直流电机周期为400us,程序在这方面应该没问题(我自己认为的。或许第二个程序里有些赋值有问题没发现)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- #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++;
- }
复制代码表示没看出何问题,重新创建一工程试一下呢?这两天有点事情,没及时回复,sorry!我看了你的程序,和我写的差不多,主要就是定时器1开启的时间一个是在判定键按下之后,一个就是松手检测之前,我觉得好像是一样的吧?再就是您写的是1秒判定和我写的2秒判定,能说说您改的理由吗?交流下心得。我一会试试您的程序。同时谢谢您的建议。
有例子参考下吗?谢谢,稍微写下也行,我试试。没感觉这个程序有多大,以前练习的时候也是这么写的。
一周热门 更多>