搜索
bottom↓
回复: 19

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

[复制链接]

出0入0汤圆

发表于 2012-12-2 09:25:47 | 显示全部楼层 |阅读模式
RT;帖子发了几次,都没有得到满意的结果,本人自学单片机,实在找不去问题,也折腾很久,没辙,再发一次,望大神们不吝赐教,本人不胜感激!!

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-12-2 09:32:23 | 显示全部楼层
压缩文件我用的是快压,可能有些解压工具打不开,请见谅,也可以加我QQ455238065,本人诚挚希望找一位单片机高手做师傅(本人机械专业,自学单片机)。

出0入0汤圆

发表于 2012-12-2 22:11:10 | 显示全部楼层
看不懂C,帮不了你。。。

出0入0汤圆

发表于 2012-12-2 23:15:09 | 显示全部楼层
本帖最后由 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. }

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

出0入0汤圆

 楼主| 发表于 2012-12-4 08:01:34 | 显示全部楼层
HeP028 发表于 2012-12-2 23:15
表示没看出何问题,重新创建一工程试一下呢?

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

出0入0汤圆

发表于 2012-12-4 08:08:38 | 显示全部楼层
希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的

出0入0汤圆

 楼主| 发表于 2012-12-4 10:18:08 | 显示全部楼层
metalmadman 发表于 2012-12-4 08:08
希望你能换过另外一种按键检测程序,一个delay() 加一个while()等待 很浪费资源的 ...

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

出0入0汤圆

发表于 2012-12-4 10:24:15 | 显示全部楼层
按键判断最好用状态机的方式

出0入0汤圆

 楼主| 发表于 2012-12-4 11:29:59 | 显示全部楼层
hansur 发表于 2012-12-4 10:24
按键判断最好用状态机的方式

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

void 1 部分()
{。。。}

void 2 部分()
{。。。}

感觉差不多吧?

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

出0入0汤圆

 楼主| 发表于 2012-12-6 16:55:34 | 显示全部楼层
怎么就没有想象中的那么多人呢?程序不是很难吧?高手在哪里?

出0入0汤圆

发表于 2012-12-7 10:47:12 | 显示全部楼层
不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-12-7 20:24:13 | 显示全部楼层
metalmadman 发表于 2012-12-7 10:47
不知LZ程序写好没有?我帮你写了一份,不知道是否符合要求,压缩包里面有个仿真文件,你可以试试 ...

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

出0入0汤圆

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

出0入0汤圆

发表于 2012-12-7 22:04:51 | 显示全部楼层
关键是不能让程序在那里干等按键释放,等一个按键释放了,那么第二个按键就检测不到(或不准)了。你的程序问题就出在这里。

出0入0汤圆

发表于 2012-12-7 22:11:02 | 显示全部楼层
按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html

出0入0汤圆

 楼主| 发表于 2012-12-8 09:25:09 | 显示全部楼层
adongliu 发表于 2012-12-7 22:11
按照这个思路做按键处理,就应该没有什么问题http://www.amobbs.com/thread-4308630-1-1.html ...

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

出0入0汤圆

 楼主| 发表于 2012-12-8 09:27:39 | 显示全部楼层
skyxjh 发表于 2012-12-7 21:55
给你一个思路:在10ms定时中断里检测两个按键,连续两次检测到低电平就认为按键按下,连续两次检测到高 ...

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

出0入0汤圆

发表于 2012-12-8 10:02:45 | 显示全部楼层
daxiaolijun 发表于 2012-12-7 20:24
不知道是效果不太明显(你在程序中加的指示灯也没亮,按键对两电机转速不起作用),也可能是硬件引脚什么 ...

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

出0入0汤圆

发表于 2013-3-14 22:01:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-4-10 12:05:39 | 显示全部楼层
还是不太了解你说的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表