找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3745|回復: 19
收起左側

求助帖,用單片機+獨立按鍵控制電機無效

[復制鏈接]
ID:779880 發(fā)表于 2020-6-19 17:30 | 顯示全部樓層 |閱讀模式
像用獨立按鍵控制電機,然后發(fā)現(xiàn)獨立按鍵比如看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
回復

使用道具 舉報

ID:782419 發(fā)表于 2020-6-19 19:04 | 顯示全部樓層
電機向芯片上接的時候應該是一根線拉out,另一端接電源正極或Gnd,如果你的程序沒有問題的話,這樣試試!
回復

使用道具 舉報

ID:782419 發(fā)表于 2020-6-19 19:21 | 顯示全部樓層
另外你們button函數(shù)不應該寫在主函數(shù)main()內的while循環(huán)里邊嗎?
main()
{
  while(1)
  {
    button();
  }
}
回復

使用道具 舉報

ID:779880 發(fā)表于 2020-6-19 21:03 | 顯示全部樓層
wufeng391 發(fā)表于 2020-6-19 19:04
電機向芯片上接的時候應該是一根線拉out,另一端接電源正極或Gnd,如果你的程序沒有問題的話,這樣試試!

這樣不行吧,我是寫的遙控車的一部分,如果電機的一根線拉正極或GND的話,就只能控制電機的啟停,不能控制正反轉了。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 09:02 | 顯示全部樓層
無標題.png 無標題1.png

回復

使用道具 舉報

ID:779880 發(fā)表于 2020-6-20 10:26 來自手機 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-6-20 09:02

大佬這什么意思啊,我剛學單片機10天,看不太懂,請指教
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 11:02 | 顯示全部樓層
別管那么多,照抄就是,獲取些許經驗,以后就會慢慢知道的。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 11:06 | 顯示全部樓層
稍微解釋:數(shù)組前4個元素是控制L298輸入端的信號,同時控制2片L298,數(shù)組后8個是按鍵按下時的值,用于定義按鍵的功能。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 11:13 | 顯示全部樓層
把數(shù)組中的值送給指定P就會出現(xiàn)想要的8個IO的高低電平,就這么簡單,沒蝦米特別的道理。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 12:46 | 顯示全部樓層
輸入與輸出都時一樣的道理,賦值控制輸出,按鍵按下讀取即輸入,都可以看作是一個值。
回復

使用道具 舉報

ID:342822 發(fā)表于 2020-6-20 12:52 | 顯示全部樓層
wufeng391 發(fā)表于 2020-6-19 19:21
另外你們button函數(shù)不應該寫在主函數(shù)main()內的while循環(huán)里邊嗎?
main()
{

支持 :隨時掃描按鍵應寫在循環(huán)中
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-20 21:07 | 顯示全部樓層
4按鍵控制4電機.rar (68.8 KB, 下載次數(shù): 13)

回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-22 09:55 | 顯示全部樓層
錄像2_轉.gif
回復

使用道具 舉報

ID:97554 發(fā)表于 2020-6-26 09:27 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-6-20 11:06
稍微解釋:數(shù)組前4個元素是控制L298輸入端的信號,同時控制2片L298,數(shù)組后8個是按鍵按下時的值,用于定義 ...

數(shù)組用的是10進制數(shù),最后一個127就是十六進制的7F,意思是當P1.7口是低電平?是這個意思嗎?
回復

使用道具 舉報

ID:97554 發(fā)表于 2020-6-26 10:56 | 顯示全部樓層
白帥比 發(fā)表于 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進制的數(shù)組,把按鍵和鍵盤的IO口電平狀態(tài)放在里邊,直接在下邊調用了,比如他前邊的那P1= DJ雖然是電機的首拼,但是這里是檢測按鍵狀態(tài),后邊P2= 是驅動輸出狀態(tài)。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 11:35 | 顯示全部樓層
楊雪飛 發(fā)表于 2020-6-26 09:27
數(shù)組用的是10進制數(shù),最后一個127就是十六進制的7F,意思是當P1.7口是低電平?是這個意思嗎?

解釋寫得明白,就是按鍵按下的值,按鍵接地,自然是低電平。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-26 16:22 | 顯示全部樓層
有人如此解釋我的程序,忽然有一種感覺,就好像狄仁杰到深山古堡念的詩:爛柯終年無人行,意外今日遠客迎。莫道深山無知己,貴人臨堡夜風停。 夙山留鳳鳳自停,賤客遠游似浮萍。忽聞一陣香風過,吹來貴主好門庭。
回復

使用道具 舉報

ID:97554 發(fā)表于 2020-6-26 16:46 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-6-26 11:35
解釋寫得明白,就是按鍵按下的值,按鍵接地,自然是低電平。

我也是沒入門的業(yè)余愛好者,但是看了大佬寫的程序茅塞頓開,樓主的程序思路就是那些搞開發(fā)板的典型程序,我開始也是跟著開發(fā)板學,由于年紀過大,十多年了也沒入門,后來覺得不用開發(fā)板學倒是簡單了不少。大佬的程序還有一個地方請教,P3 = ++j;這句的用處是什么?想了半天沒想明白,還請賜教。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-27 07:36 | 顯示全部樓層
那只是為了觀察仿真用的是否加載正確,因為我寫的好幾個程序編譯同一個名稱,有時加載有問題,看圖上是沒接線的,讓其循環(huán)可直觀程序是否加載對否,當按鍵未操作時。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-27 07:57 | 顯示全部樓層
我也是嫌教程寫得過于啰嗦,看明白后就直接簡化掉了,8個IO口若有用單獨的一二個,可以單獨定義,能整合的盡量不用單獨去定義,直接使用整個8個口直接操作即可簡化很多。
另外如按鍵代碼也都是可以簡化的,通常的那按鍵一堆代碼就懶得去看,還有嵌套循環(huán)等這些凡是寫一大堆代碼的看著都累,而這些一堆代碼都是可以簡化的,不是不能簡化。
簡化后代碼量也少,邏輯看得也清晰,心情也舒暢,修改也方便。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表