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

2020-01-30 13:52发布

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

【目的】一个按键控制一个直流电机的转速变化——长按(大于等于2秒)电机转速增加,短按(小于等于2秒)电机转速减小。【程序可行,达到目标】因此,在前面这些基础上想实现两个按键控制两个直流电机的转速,就出毛病了。
【毛病】两个按键控制两个电机时,按键时电机转速没变化,在该程序下撤去一个电机,按键作用全为减速,而且保持一会之后又速度自己加上去了。
【PS】直流电机周期为400us,程序在这方面应该没问题(我自己认为的。或许第二个程序里有些赋值有问题没发现)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
daxiaolijun
1楼-- · 2020-01-30 19:25
压缩文件我用的是快压,可能有些解压工具打不开,请见谅,也可以加我QQ455238065,本人诚挚希望找一位单片机高手做师傅(本人机械专业,自学单片机)。
lxa0
2楼-- · 2020-01-30 21:10
看不懂C,帮不了你。。。
HeP028
3楼-- · 2020-01-31 00:33
本帖最后由 HeP028 于 2012-12-2 23:17 编辑
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit U1=P1^1;
  5. sbit U2=P1^2;
  6. sbit KEY1=P3^4;
  7. sbit KEY2=P3^3;

  8. uchar num1=0,num2=0,num1_speed,num2_speed,key1_time,key2_time;
  9. uint numt;

  10. void delayms(uint xms)
  11. {
  12.         uint i,j;
  13.         for(i=xms;i>0;i--)
  14.                 for(j=110;j>0;j--);
  15. }

  16. void keyscan()
  17. {
  18.         if(KEY1 == 0)
  19.         {
  20.                 delayms(10);
  21.                 if(KEY1 == 0)
  22.                 {
  23.                         TR1=1;
  24.                         while(KEY1 == 0);
  25.                         TR1=0;
  26.                         key1_time=numt;
  27.                         numt=0;
  28.                 }

  29.                 if(key1_time >= 20)
  30.                 {
  31.                         num1_speed += 2;               
  32.                         if(num1_speed > 16)
  33.                         num1_speed = 8;
  34.                 }               

  35.                 if(key1_time < 20)
  36.                 {
  37.                         num1_speed -= 2;
  38.                         if(num1_speed < 8)
  39.                         num1_speed =8;
  40.                 }
  41.                 key1_time=0;
  42.         }

  43.         if(KEY2==0)
  44.         {
  45.                 delayms(10);
  46.                 if(KEY2==0)
  47.                 {
  48.                         TR1=1;
  49.                         while(KEY2 == 0);
  50.                         TR1=0;
  51.                         key2_time=numt;
  52.                         numt=0;
  53.                 }

  54.                 if(key2_time >= 20)
  55.                 {
  56.                         num2_speed += 2;               
  57.                         if(num2_speed>16)
  58.                         num2_speed = 8;
  59.                 }               

  60.                 if(key2_time < 20)
  61.                 {
  62.                         num2_speed -= 2;
  63.                         if(num2_speed<8)
  64.                         num2_speed = 8;
  65.                 }
  66.                 key2_time=0;
  67.         }
  68. }

  69. void init()
  70. {
  71.         TMOD|=0x11;
  72.         TH0=(65536-20)/256;                //20us
  73.         TL0=(65536-20)%256;
  74.         TH1=(65536-45872)/256;
  75.         TL1=(65536-45872)%256;
  76.         EA=1;
  77.         ET0=1;                                //开定时器0中断
  78.         ET1=1;                                //开定时器1中断
  79.         TR0=1;                                //启动定时器0
  80. }

  81. void main()
  82. {       
  83.         init();
  84.         num1_speed=12;
  85.         num2_speed=12;
  86.         while(1)
  87.         {
  88.                 keyscan();
  89.         }
  90. }

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

  97.         if(num1<num1_speed)       
  98.                 U1=1;
  99.                 else U1=0;
  100.                 if(num1>16)
  101.                         num1=0;

  102.         if(num2<num2_speed)
  103.                 U2=1;
  104.                 else U2=0;
  105.                 if(num2>16)
  106.                         num2=0;
  107. }

  108. void Time1_Init() interrupt 3       
  109. {
  110.         TH1=(65536-45872)/256;
  111.         TL1=(65536-45872)%256;
  112.         numt++;                               
  113. }

复制代码表示没看出何问题,重新创建一工程试一下呢?
daxiaolijun
4楼-- · 2020-01-31 03:14
HeP028 发表于 2012-12-2 23:15
表示没看出何问题,重新创建一工程试一下呢?

这两天有点事情,没及时回复,sorry!我看了你的程序,和我写的差不多,主要就是定时器1开启的时间一个是在判定键按下之后,一个就是松手检测之前,我觉得好像是一样的吧?再就是您写的是1秒判定和我写的2秒判定,能说说您改的理由吗?交流下心得。我一会试试您的程序。同时谢谢您的建议。
metalmadman
5楼-- · 2020-01-31 03:26
 精彩回答 2  元偷偷看……
daxiaolijun
6楼-- · 2020-01-31 05:54
metalmadman 发表于 2012-12-4 08:08
希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的 ...

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

一周热门 更多>