新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機驅動伺服電機程序

        51單片機驅動伺服電機程序

        作者: 時間:2016-12-01 來源:網絡 收藏
        51單片機除了幾款加強版的帶pwm,很多都不帶,所以要用51控制伺服電機很多時候就要軟件模擬pwm。看了些代碼有的是通過延時來輸出pwm波,有的也用了定時器但是那些代碼要驅動多路伺服電路就顯得比較麻煩。下面的代碼是通過定時器0產生每0.5ms一次的提醒,程序在大循環中通過調用DJ()函數可以返還值給伺服電機信號引腳,DJ()函數可以定旋轉的角度,但是因為定時器設置是0.5ms的中斷這就決定了旋轉呢角度只能是-45,-90,0,45,90。如果要提高精度就要通過設置定時器的初值,改變函數的num值來達成。
        #include"reg52.h"
        unsigned int num=0;
        //舵機
        sbit DJ1=P3^6;
        sbit DJ2=P3^7; /*引腳定義*/
        int DJ(int a); //函數聲明
        timerinit() //定時器中斷初始化
        {
        TMOD=0x01; //設置定時器0為工作方式1
        EA=1; //開總中斷
        ET0=1; //定時器0中斷允許
        TH0 = (65536-500)/256; //初值使得定時器0.5毫秒溢出
        TL0 = (65536-500)%256;
        TR0=0;
        }
        main()
        {
        timerinit();
        while(1)
        {
        }
        }
        timer() interrupt 0 //0.5ms發生一次中斷,20ms后定時器置0重新計數
        {
        num++;
        DJ1=DJ(3);
        DJ2=DJ(3);
        if(num>=40)
        {
        num=0;
        TH0 = (65536-500)/256; //初值使得定時器0.5毫秒溢出
        TL0 = (65536-500)%256;
        return;
        }
        }
        int DJ(char a) //當a=3舵機所在的位置是0度a=2 a=1分別對應的位置是-45 -90度a=4 a=5對應位置為45 90度
        {
        if(num>=a||num>=5)
        return 0;
        if(num>=1)
        return 1;
        }
        時間倉促還沒有測試程序的可行性(通常是沒有問題呢,呵呵),等有時間的話會繼續完善程序加上可以控制舵機旋轉速度的功能。如果要弄機器人的話還是弄塊專業的驅動板吧,那樣調試起來會很直觀很方便呢減少許多不必要的麻煩呢。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黑河市| 桃源县| 连山| 清涧县| 平定县| 武乡县| 鹤庆县| 民权县| 阿合奇县| 名山县| 阿鲁科尔沁旗| 章丘市| 梅州市| 台湾省| 通城县| 靖州| 卢龙县| 古交市| 西乌珠穆沁旗| 商水县| 桃江县| 齐河县| 余干县| 建德市| 绥中县| 额敏县| 安塞县| 霞浦县| 读书| 策勒县| 红河县| 奉化市| 大关县| 微博| 祁连县| 广平县| 昌邑市| 嘉黎县| 建平县| 大田县| 丰宁|