找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2589|回复: 19
打印 上一主题 下一主题
收起左侧

求助帖,用单片机+独立按键控制电机无效

[复制链接]
跳转到指定楼层
楼主
像用独立按键控制电机,然后发现独立按键比如看k1按下去之后,除了P1^1从高电压变成低电压,别的地方没有任何变化,很苦恼,求大神指点。
//这是源代码

#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;

sbit k1=P1^6;
sbit k2=P1^7;
sbit k3=P3^6;
sbit k4=P3^7;

sbit in1=P1^1;
sbit in2=P1^2;
sbit in3=P1^3;
sbit in4=P1^4;

sbit in5=P2^1;
sbit in6=P2^2;
sbit in7=P2^3;
sbit in8=P2^4;

void delay10ms(void)
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
void button()
{
   if(k1==0)
         {delay10ms();
                 if(k1==0)//Ç°½ø
                 {
                        in1=1;
                        in2=0;
                        in3=1;
                        in4=0;
                        in5=1;
                        in6=0;
                        in7=1;
                        in8=0;
         while(!k1);
         delay10ms();
           }

         
   }

if(k2==0)
         {delay10ms();//oóíË
                 if(k2==0)
                 {
                        in1=0;
                        in2=1;
                        in3=0;
                        in4=1;
            in5=0;
                        in6=1;
                        in7=0;
                        in8=1;
           while(!k2);}
           delay10ms();
   }

if(k3==0)
         {delay10ms();//×ó×a
                 if(k3==0)
                 {
                        in1=0;
                        in2=1;
                        in3=0;
                        in4=1;
                  in5=1;
                        in6=0;
                        in7=1;
                        in8=0;
           while(!k3);}
           delay10ms();
   }


if(k4==0)
         {delay10ms();//óò×a
                 if(k4==0)
                 {
                        in1=1;
                        in2=0;
                        in3=1;
                        in4=0;
                        in5=0;
                        in6=1;
                        in7=0;
                        in8=1;
            while(!k4);
            delay10ms();}

         
   }

}

void main()
{
               
                        button();
            while(1);
}




51hei截图20200619172911.png (114.37 KB, 下载次数: 42)

51hei截图20200619172911.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:782419 发表于 2020-6-19 19:04 | 只看该作者
电机向芯片上接的时候应该是一根线拉out,另一端接电源正极或Gnd,如果你的程序没有问题的话,这样试试!
回复

使用道具 举报

板凳
ID:782419 发表于 2020-6-19 19:21 | 只看该作者
另外你们button函数不应该写在主函数main()内的while循环里边吗?
main()
{
  while(1)
  {
    button();
  }
}
回复

使用道具 举报

地板
ID:779880 发表于 2020-6-19 21:03 | 只看该作者
wufeng391 发表于 2020-6-19 19:04
电机向芯片上接的时候应该是一根线拉out,另一端接电源正极或Gnd,如果你的程序没有问题的话,这样试试!

这样不行吧,我是写的遥控车的一部分,如果电机的一根线拉正极或GND的话,就只能控制电机的启停,不能控制正反转了。
回复

使用道具 举报

5#
ID:332444 发表于 2020-6-20 09:02 | 只看该作者


回复

使用道具 举报

6#
ID:779880 发表于 2020-6-20 10:26 来自手机 | 只看该作者
xianfajushi 发表于 2020-6-20 09:02

大佬这什么意思啊,我刚学单片机10天,看不太懂,请指教
回复

使用道具 举报

7#
ID:332444 发表于 2020-6-20 11:02 | 只看该作者
别管那么多,照抄就是,获取些许经验,以后就会慢慢知道的。
回复

使用道具 举报

8#
ID:332444 发表于 2020-6-20 11:06 | 只看该作者
稍微解释:数组前4个元素是控制L298输入端的信号,同时控制2片L298,数组后8个是按键按下时的值,用于定义按键的功能。
回复

使用道具 举报

9#
ID:332444 发表于 2020-6-20 11:13 | 只看该作者
把数组中的值送给指定P就会出现想要的8个IO的高低电平,就这么简单,没虾米特别的道理。
回复

使用道具 举报

10#
ID:332444 发表于 2020-6-20 12:46 | 只看该作者
输入与输出都时一样的道理,赋值控制输出,按键按下读取即输入,都可以看作是一个值。
回复

使用道具 举报

11#
ID:342822 发表于 2020-6-20 12:52 | 只看该作者
wufeng391 发表于 2020-6-19 19:21
另外你们button函数不应该写在主函数main()内的while循环里边吗?
main()
{

支持 :随时扫描按键应写在循环中
回复

使用道具 举报

12#
ID:332444 发表于 2020-6-20 21:07 | 只看该作者
4按键控制4电机.rar (68.8 KB, 下载次数: 13)

回复

使用道具 举报

13#
ID:332444 发表于 2020-6-22 09:55 | 只看该作者

回复

使用道具 举报

14#
ID:97554 发表于 2020-6-26 09:27 | 只看该作者
xianfajushi 发表于 2020-6-20 11:06
稍微解释:数组前4个元素是控制L298输入端的信号,同时控制2片L298,数组后8个是按键按下时的值,用于定义 ...

数组用的是10进制数,最后一个127就是十六进制的7F,意思是当P1.7口是低电平?是这个意思吗?
回复

使用道具 举报

15#
ID:97554 发表于 2020-6-26 10:56 | 只看该作者
白帅比 发表于 2020-6-20 10:26
大佬这什么意思啊,我刚学单片机10天,看不太懂,请指教

大佬的意思就是把你
                        in1=0;
                        in2=1;
                        in3=0;
                        in4=1;
                        in5=1;
                        in6=0;
                        in7=1;
                        in8=0;
这种驱动298的写法改成用一个IO口的八条线,比如你的in1  --  in8分别依次接入P1口的P1^0   P1^2 -- P1^7,你上边的01011010就是5A,换成十进制就是90,另外的三组分别是A5    55    AA,对应的十进制就是165   85   170,也就是说按照大佬给的接线图,用P2口做驱动,P1口做按键。那你的                        in1=0;
                        in2=1;
                        in3=0;
                        in4=1;
                        in5=1;
                        in6=0;
                        in7=1;
                        in8=0;
就可以简单的写成:
                       P2 = 5A;
大佬直接做了个10进制的数组,把按键和键盘的IO口电平状态放在里边,直接在下边调用了,比如他前边的那P1= DJ虽然是电机的首拼,但是这里是检测按键状态,后边P2= 是驱动输出状态。
回复

使用道具 举报

16#
ID:332444 发表于 2020-6-26 11:35 | 只看该作者
杨雪飞 发表于 2020-6-26 09:27
数组用的是10进制数,最后一个127就是十六进制的7F,意思是当P1.7口是低电平?是这个意思吗?

解释写得明白,就是按键按下的值,按键接地,自然是低电平。
回复

使用道具 举报

17#
ID:332444 发表于 2020-6-26 16:22 | 只看该作者
有人如此解释我的程序,忽然有一种感觉,就好像狄仁杰到深山古堡念的诗:烂柯终年无人行,意外今日远客迎。莫道深山无知己,贵人临堡夜风停。 夙山留凤凤自停,贱客远游似浮萍。忽闻一阵香风过,吹来贵主好门庭。
回复

使用道具 举报

18#
ID:97554 发表于 2020-6-26 16:46 | 只看该作者
xianfajushi 发表于 2020-6-26 11:35
解释写得明白,就是按键按下的值,按键接地,自然是低电平。

我也是没入门的业余爱好者,但是看了大佬写的程序茅塞顿开,楼主的程序思路就是那些搞开发板的典型程序,我开始也是跟着开发板学,由于年纪过大,十多年了也没入门,后来觉得不用开发板学倒是简单了不少。大佬的程序还有一个地方请教,P3 = ++j;这句的用处是什么?想了半天没想明白,还请赐教。
回复

使用道具 举报

19#
ID:332444 发表于 2020-6-27 07:36 | 只看该作者
那只是为了观察仿真用的是否加载正确,因为我写的好几个程序编译同一个名称,有时加载有问题,看图上是没接线的,让其循环可直观程序是否加载对否,当按键未操作时。
回复

使用道具 举报

20#
ID:332444 发表于 2020-6-27 07:57 | 只看该作者
我也是嫌教程写得过于啰嗦,看明白后就直接简化掉了,8个IO口若有用单独的一二个,可以单独定义,能整合的尽量不用单独去定义,直接使用整个8个口直接操作即可简化很多。
另外如按键代码也都是可以简化的,通常的那按键一堆代码就懒得去看,还有嵌套循环等这些凡是写一大堆代码的看着都累,而这些一堆代码都是可以简化的,不是不能简化。
简化后代码量也少,逻辑看得也清晰,心情也舒畅,修改也方便。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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