×
单片机 > 单片机程序设计 > 详情

51单片机6自由度机械臂调试程序,带LCD1602PWM显示

发布时间:2021-01-20 发布时间:
|

以前学习51的时候为了调试机械臂角度编写的程序,用在开发板上也比较方便,但是由于是普通的舵机,不是总线的,所以需要自己洞洞板焊一个供电带电路。

单片机源程序如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int


sbit duoji0=P2^0;          //PWM输出

sbit duoji1=P2^1;

sbit duoji2=P2^2;

sbit duoji3=P2^3;

sbit duoji4=P3^1;

sbit duoji5=P3^0;


#define GPIO_KEY P1


unsigned int k0;   

unsigned int k1; 

unsigned int k2; 

unsigned int k4; 

unsigned int k3; 

unsigned int k5;         //定义下降沿节点


uint dsip[8]={0};

uint j=0;

unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','D',' '};


void delayms(uint xms)

{

  uchar j;

        uint i;

        for(i=xms;i>0;i--)

        for(j=112;j>0;j--);

}


void time0() interrupt 1   

{

        static uint ii0=0;

  TH0=(65536-100)/256;      //以20ms为一个周期,以0.1ms为一个脉冲宽度

  TL0=(65536-100)%256;

  ii0++;

  

        if(ii0<=k0)                      

    duoji0=1;    //0号舵机pwm输出 

  else

    duoji0=0;   

        

        if(ii0<=k1)    //1号舵机pwm输出                     

    duoji1=1;

  else

    duoji1=0;


  if(ii0<=k2)    //2号舵机pwm输出                       

    duoji2=1;

  else

    duoji2=0;  


if(ii0<=k3)     //3号舵机pwm输出                    

    duoji3=1;

  else

    duoji3=0;

        

         if(ii0<=k4)   //4号舵机pwm输出                      

    duoji4=1;

  else

    duoji4=0;

        

         if(ii0<=k5)   //5号舵机pwm输出                     

    duoji5=1;

  else

    duoji5=0;

        

        if(ii0==200)

    ii0=0;

}


void time0init()

{

  TMOD=0x01;

  TH0=(65536-100)/256;

  TL0=(65536-100)%256;

  TR0=1;

  ET0=1;

  EA=1;

}



char KeyDown()

{

        uchar KeyValue=20;

        uchar a=0;

        GPIO_KEY=0x0f;

        if(GPIO_KEY!=0x0f)//读取按键是否按下

        {

                delayms(10);//延时10ms进行消抖

                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

                {        

                        //测试列

                        GPIO_KEY=0X0F;

                        switch(GPIO_KEY)

                        {

                                case(0X07):        KeyValue=0;break;

                                case(0X0b):        KeyValue=1;break;

                                case(0X0d): KeyValue=2;break;

                                case(0X0e):        KeyValue=3;break;

                        }

                        //测试行

                        GPIO_KEY=0XF0;

                        switch(GPIO_KEY)

                        {

                                case(0X70):        KeyValue=KeyValue;break;

                                case(0Xb0):        KeyValue=KeyValue+4;break;

                                case(0Xd0): KeyValue=KeyValue+8;break;

                                case(0Xe0):        KeyValue=KeyValue+12;break;

                        }

                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测,当按键等于0xf时候跳出循环

                        {

                                delayms(100);

                                a++;

                        }

                }

        }

        return KeyValue;

}


void count()

{

        

          LcdWriteData(ASCII[0]);

          LcdWriteData(ASCII[11]);

    LcdWriteData(ASCII[k0/10]);        

                LcdWriteData(ASCII[k0%10]);        

          LcdWriteData(ASCII[12]);

        

          LcdWriteData(ASCII[1]);        

          LcdWriteData(ASCII[11]);

                LcdWriteData(ASCII[k1/10]);        

                LcdWriteData(ASCII[k1%10]);        

          LcdWriteCom(0x80+0x40);

        

          LcdWriteData(ASCII[2]);        

          LcdWriteData(ASCII[11]);

                LcdWriteData(ASCII[k2/10]);        

                LcdWriteData(ASCII[k2%10]);        

    LcdWriteData(ASCII[12]);

        

          LcdWriteData(ASCII[3]);

          LcdWriteData(ASCII[11]);

                LcdWriteData(ASCII[k3/10]);        

                LcdWriteData(ASCII[k3%10]);

                

}


void main()

{          

  time0init();

        k0=15;

        k1=9;

        k2=16;

        k3=14;

        k4=8;

        k5=8;

        LcdInit();

        count();

        

        while(1)

  {

                uchar KeyValue1=20;

          KeyValue1=KeyDown();

                

        

        

        

                        

        

                

                if(KeyValue1==0&&k0<=20&&k0>=8)        //0号舵机高电平时间增加

          { 

                     k0++;        

                     if(k0==21)

                                         k0=20;

                                 KeyValue1=20;LcdWriteCom(0x01);        count();

    }                

        

if(Ke


关键字:51单片机  6自由度机械臂  LCD1602PWM显示

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C8051F020的UART