清翔51单片机+PCA9685例程

使用PCA9685的0和1通道,用四个独立按键控制两个舵机正反转。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
sbit s1=P3^0;
sbit s2=P3^1;
bit flag0_right=0,flag0_left=0,flag1_right=0,flag1_left=0;
void delay() { ;; }
void delay1ms(uint z)
{
    uint x,y;
 for(x=z;x>0;x--)
     for(y=114;y>0;y--);
}
void i2c_init()
{
    sda=1;
    delay();
    scl=1;
    delay();
}
void i2c_start()
{
    sda=1;
    delay();
    scl=1;
    delay();
    sda=0;
    delay();
}
void i2c_stop()
{
    sda=0;
    delay();
    scl=1;
    delay();
    sda=1;
    delay();
}
void respons()
{
    uchar i=0;
    scl=1;
    delay();
    while((sda==1)&&(i<255))
    {
        i++;
    }
    scl=0;
    delay();
}
void write_byte(uchar date)
{
    uchar temp,i=0;
    temp=date;
    for(i=0;i<8;i++)
    {
        temp=temp<<1;
        scl=0;
        delay();
        sda=CY;
        delay();
        scl=1;
        delay();
    }
    scl=0;
    delay();
    sda=1;
    delay();
}
void writeadd(uchar address,uchar date)
{
    i2c_start();
    write_byte(0x80);
    respons();
    write_byte(address);
    respons();
    write_byte(date);
    respons();
    i2c_stop();
}
void pca_start()
{
    writeadd(0x00,0x10);//SMOD1休眠
    delay1ms(20);
    writeadd(0xfe,0x84);//PRE_SCLAE
    delay1ms(20);
    writeadd(0x00,0);
    delay1ms(20);
    writeadd(0x07,0);//LED0_ON为0
    delay1ms(20);
    writeadd(0x06,0);
    delay1ms(20);
    writeadd(0x0b,0);//LED1_ON为0
    delay1ms(20);
    writeadd(0x0a,0);
    delay1ms(20);
}
void main()
{
    i2c_init();
    pca_start();
    while(1)
    {
        P3 = 0xff;//判断独立按键
  	if(P3 != 0xff)
    	{
    	 delay1ms(5);//软件消抖
   	  if( P3 != 0xff)
   	  {
	     switch(P3)
	      {
	       case 0xfe: flag0_right=1; break;
	       case 0xfd: flag0_left=1; break;
	       case 0xfb: flag1_right=1; break;
	       case 0xf7: flag1_left=1; break;
	      }
	      while(P3 != 0xff);//松手检测
    	  }
        }
        if(flag0_right==1)
        {
            flag0_right=0;
            writeadd(0x09,0x00);
            delay1ms(20);
            writeadd(0x08,0x66);
            delay1ms(20);
        }
        if(flag0_left==1)
        {
            flag0_left=0;
            writeadd(0x09,0x01);
            delay1ms(20);
            writeadd(0x08,0x9a);
            delay1ms(20);
        }
        if(flag1_right==1)
        {
            flag1_right=0;
            writeadd(0x0d,0x00);
            delay1ms(20);
            writeadd(0x0c,0x66);
            delay1ms(20);
        }
        if(flag1_left==1)
        {
            flag1_left=0;
            writeadd(0x0d,0x01);
            delay1ms(20);
            writeadd(0x0c,0x9a);
            delay1ms(20);
        }
    }
}
发布了5 篇原创文章 · 获赞 4 · 访问量 2670

猜你喜欢

转载自blog.csdn.net/npuqiyi/article/details/104406242
今日推荐