久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8376|回復: 1
打印 上一主題 下一主題
收起左側(cè)

利用舵機制作簡單機械臂

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:162561 發(fā)表于 2017-12-13 17:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

**項目名稱:利用舵機制作簡單機械臂
**編寫時間:2017.07.11
**使用芯片:stc12c2052ad
**時鐘頻率:使用外部晶振頻率12MHz
**簡要說明:本次制作的機械臂共用了3個舵機,可以控制機械臂上下、左右移動和抓放動作。
#include <stc12c2052ad.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned short int u16;

sbit CTRL_u_d = P3^3;                                                //控制上、下方向的舵機控制端口
sbit CTRL_l_r = P3^4;                                                //控制左、右方向的舵機控制端口
sbit CTRL_g = P3^5;                                                        //控制抓起的舵機控制端口

void delay_20ms(u16 x);
u8 KeyScan();

u16 TIME = 20000;                                                                //PWM周期時間(單位us)
u16 Min = 700;                                                                        //高電平最小持續(xù)時間
u16 Max = 2300;                                                                        //高電平最大持續(xù)時間
u8 Degree = 50;                                                                        //單位時間寬度(最小是舵機死區(qū)設定大約10us)

u16 Times = 0;                                                                        //TIME/Degree(PWM周期除于單位時間寬度)

//高電平持續(xù)時間除于單位時間寬度
u16 cTimes_u_d = 0;       
u8 cTimes_l_r = 0;
u8 cTimes_g = 0;
u8 Min_cTimes = 0;
u8 Max_cTimes = 0;

u8 R_TH0 = 0, R_TL0 = 0;                                //定時器0計數(shù)重載值

u8 KeyValue = 0;                                                                //1-上、2-左、3-抓、4-右、5-下

void main()
{
        Times = TIME/Degree;       

        cTimes_u_d = 1500/Degree;
        cTimes_l_r = 1500/Degree;
        cTimes_g = Min_cTimes;
        Min_cTimes = Min/Degree;
        Max_cTimes = Max/Degree;       
       
        P1 = 0xff;
        CTRL_u_d = 0;
        CTRL_l_r = 0;
        CTRL_g = 0;                                                       

        R_TL0 = 65536 - Degree;
        R_TH0 = (65536 - Degree) >> 8;
       
        //設置定時器0
        TMOD = 0x01;                                                                        //16位計數(shù)
        TL0 = R_TL0;
        TH0 = R_TH0;
        ET0 = 1;                                                                                        //定時器0中斷開關打開
        TR0 = 1;                                                                                        //定時器0計數(shù)開始
       
        EA = 1;                                                                                                //中斷總開關打開
       
        while(1)
        {
                u8 temp = 0;
                KeyValue = KeyScan();
               
                switch(KeyValue)
                {
                        case 1:                                                                                //向上移動
                                cTimes_u_d = --cTimes_u_d < Min_cTimes ? Min_cTimes : cTimes_u_d;
                                break;
                        case 2:                                                                                //向左移動
                                cTimes_l_r = --cTimes_l_r < Min_cTimes ? Min_cTimes : cTimes_l_r;
                                break;
                        case 3:                                                                                //抓、放動作
                                if(cTimes_g == Min_cTimes)
                                        cTimes_g = Max_cTimes;
                                else
                                        cTimes_g = Min_cTimes;
                               
                                delay_20ms(15);
                                break;
                        case 4:                                                                                //向右移動
                                cTimes_l_r = ++cTimes_l_r > Max_cTimes ? Max_cTimes : cTimes_l_r;
                                break;
                        case 5:                                                                                //向下移動
                                cTimes_u_d = ++cTimes_u_d > Max_cTimes ? Max_cTimes : cTimes_u_d;
                                break;
                }
        }
}


u8 KeyScan()
{
        u8 key = 0;
        if(P1 != 0xff)
        {
                delay_20ms(2);
                if(P1 != 0xff)
                {
                        u8 temp  = P1;
                        key = 1;
                        while(temp & 0x01)
                        {
                                temp = temp >> 1;
                                key++;
                        }                       
                }
        }       
       
        return key;
}


void Delay20ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 234;
        k = 113;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void delay_20ms(u16 x)
{
        while(x--)  Delay20ms();
}


//定時器0中斷函數(shù)   每次進入中斷間隔時間為Degree(單位時間寬度)
void timer0() interrupt 1 using 1
{
        static u16 times = 0;
        TL0 = R_TL0;
        TH0 = R_TH0;
       
        //每次只控制一個舵機移動
        if(times == 0)
        {
                switch(KeyValue)
                {
                        case 1:
                        case 5:
                                CTRL_u_d = 1;
                                CTRL_l_r = 0;
                                CTRL_g = 0;
                                break;
                        case 2:
                        case 4:
                                CTRL_u_d = 0;
                                CTRL_l_r = 1;
                                CTRL_g = 0;
                                break;
                        case 3:
                                CTRL_u_d = 0;
                                CTRL_l_r = 0;
                                CTRL_g = 1;
                                break;
                }
        }
        else
        {
                switch(KeyValue)
                {
                        case 1:
                        case 5:
                                if(times >= cTimes_u_d)
                                {
                                        CTRL_u_d = 0;
                                }
                                break;
                        case 2:
                        case 4:
                                if(times >= cTimes_l_r)
                                {
                                        CTRL_l_r = 0;
                                }
                                break;
                        case 3:
                                if(times >= cTimes_g)
                                {
                                        CTRL_g = 0;
                                }       
                                break;
                }
        }
       
        times = ++times >= Times ? 0 : times;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:253033 發(fā)表于 2018-3-9 23:24 | 只看該作者
這個單用51單片機就可以實現(xiàn)嗎?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久婷婷国产麻豆91 | 亚洲精品中文字幕在线观看 | 人人九九精 | 国产精品三级 | 成人一级黄色毛片 | 亚洲成人免费视频 | 精品国产91亚洲一区二区三区www | 日韩a在线 | 久热m3u8| 欧美一区二区三区四区视频 | 精品视频在线免费观看 | 国产精品久久九九 | 91视频免费 | 久久伊人在 | 成人精品一区 | 精精国产xxxx视频在线播放 | 看真人视频一级毛片 | 久久亚洲国产精品日日av夜夜 | 欧美一区二区三区精品 | 神马久久av | 99久久婷婷国产精品综合 | 日本成人福利 | 中文字幕中文字幕 | 91久久精品国产91久久性色tv | 超碰97av| 国产精品国产a级 | 国产九九九 | 成人国产网站 | 亚洲码欧美码一区二区三区 | 99视频在线免费观看 | 91精品国产乱码久久久久久久久 | 人人擦人人 | 成人av网站在线观看 | 精品日韩 | 最新中文字幕久久 | 久久国内精品 | 欧美性视频在线播放 | 日韩成人精品一区二区三区 | 这里有精品 | 国产成人av免费看 | 成人久久网 |