单片机iic+pca9685驱动控制9路舵机源程序

2019-11-20来源: 51hei关键字:单片机  iic  pca9685  驱动控制  9路舵机

利用stc12c5a60s2单片机的iic通信,驱动pca9685,因为采用了9个舵机,所以不需要短接驱动板上的焊点,驱动的scl,sda对应接单片机的就好,vcc接3.3v,然后v+和gnd要给5v,插上9个舵机,我任务需要控制舵机90度来回转即可,用的串口,蓝牙控制,很简单,给需要的朋友参考
54178C63B4F4F37FB1F420379A1978C5.png

pca9685驱动板驱动9个舵机单片机源程序如下:

#include           

#include  

#include

#include

typedef  unsigned char  uchar;        

typedef  unsigned int   uint;        

unsigned char buf;

sbit scl=P2^6;                      

sbit sda=P2^7;                  

#define PCA9685_adrr 0x80//  1+A5+A4+A3+A2+A1+A0+w/r 


#define PCA9685_SUBADR1 0x2

#define PCA9685_SUBADR2 0x3

#define PCA9685_SUBADR3 0x4


#define PCA9685_MODE1 0x0

#define PCA9685_PRESCALE 0xFE


#define LED0_ON_L 0x6

#define LED0_ON_H 0x7

#define LED0_OFF_L 0x8

#define LED0_OFF_H 0x9


#define ALLLED_ON_L 0xFA

#define ALLLED_ON_H 0xFB

#define ALLLED_OFF_L 0xFC

#define ALLLED_OFF_H 0xFD


#define SERVOMIN  115 // this is the 'minimum' pulse length count (out of 4096)

#define SERVOMAX  590 // this is the 'maximum' pulse length count (out of 4096)

#define SERVO000  130 //0度

#define SERVO180  520 //180度

#define SERVO80   284 //80度

#define SERVO110  340//110度

void delayms(uint z)

{

  uint x,y;

  for(x=z;x>0;x--)

      for(y=148;y>0;y--);

}

void delayus()  //大于4.7us

{

          _nop_();         

                _nop_();

                _nop_();

                _nop_();

                _nop_();


}

/*---------------------------------------------------------------

                 IIC初始化         

----------------------------------------------------------------*/

void init()

{

    sda=1;                //sda scl使用前被拉高

    delayus();

    scl=1;

    delayus();

}

/*---------------------------------------------------------------

                 IIC????????

----------------------------------------------------------------*/

void start()

{

    sda=1;

    delayus();

    scl=1;       //scl高 sda拉低 ????IIC启动

    delayus();

    sda=0;

    delayus();

                scl=0;

                delayus();

}

/*---------------------------------------------------------------

                 IIC停止

----------------------------------------------------------------*/

void stop()

{

    sda=0;

    delayus();

    scl=1;                         //scl??? sda??????? ????IIC??

    delayus();

    sda=1;                   

    delayus();

}

/*---------------------------------------------------------------

                 IIC应答

----------------------------------------------------------------*/

void ACK()

{

    uchar i;

    scl=1;

    delayus();

    while((sda=1)&&(i<255))         

                i++;                                        

    scl=0;                                  

    delayus();

}

/*---------------------------------------------------------------

              写字节

----------------------------------------------------------------*/

void write_byte(uchar byte)

{

    uchar i,temp;

    temp=byte;

    for(i=0;i<8;i++)

    {

        temp=temp<<1;  

        scl=0;                  

                                delayus();

                                sda=CY;                 

                                delayus();

                                scl=1;           

                                delayus();

    }

    scl=0;                  

    delayus();

    sda=1;                 

    delayus();

}

/*---------------------------------------------------------------

              肚子节

----------------------------------------------------------------*/

uchar read_byte()

{

                uchar i,j,k;

                scl=0;

                delayus();

                sda=1;

                delayus();

                for(i=0;i<8;i++)        

                {

                                delayus();

                                scl=1;

                delayus();

                if(sda==1)

                {

                                j=1;

                }

                else j=0;

                k=(k<< 1)|j;  

                scl=0;            

                }

                delayus();

                return k;

}

/*---------------------------------------------------------------

                ??PCA9685?????

----------------------------------------------------------------*/

/*---------------------------------------------------------------

                ?PCA9685????,??

----------------------------------------------------------------*/

void PCA9685_write(uchar address,uchar date)

{

                start();

                write_byte(PCA9685_adrr);        //PCA9685

                ACK();                          

                write_byte(address);  //

                ACK();

                write_byte(date);          //

                ACK();

                stop();

}

/*---------------------------------------------------------------

            从PCA9685读数据有返回值

----------------------------------------------------------------*/

uchar PCA9685_read(uchar address)

{

                uchar date;

                start();

                write_byte(PCA9685_adrr); //PCA9685

                ACK();

                write_byte(address);

                ACK();

                start();

                write_byte(PCA9685_adrr|0x01);        //

                ACK();

                date=read_byte();

                stop();

                return date;

}

/*---------------------------------------------------------------

                        PCA9685复位

----------------------------------------------------------------*/

void reset(void) 

{

PCA9685_write(PCA9685_MODE1,0

[1] [2]
关键字:单片机  iic  pca9685  驱动控制  9路舵机 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic480582.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机独立按键控制LED流水灯电路图与源程序
下一篇:单片机八层电梯控制系统 仿真图+源程序+电路原理图

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于51单片机的定时器程序设计
这个基于51单片机的定时器设计,使用共阴数码管显示,如果要换成共阳数码管只需要将程序内数组改为共阳数码管的数组,38译码器LSA,LSB,LSC分别接单片机的P2^2,P2^3,P2^4,蜂鸣器使用的是无源蜂鸣器,接单片机P1^5,三个低电平触发按键分别接的P3^1,P3^2,P3^3. sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key0=P3^1;  //定义P31口是k0sbit key1=P3^0;  //定义P33口是k1sbit key2=P3^2;  //定义P33口是k2sbit beep=P1
发表于 2020-01-20
基于51单片机的定时器程序设计
基于热敏电阻的单片机温度测量系统设计
本课题用一种基于单片机的数据采集系统方案,该方案根据热敏电阻随温度变化而变化的特性,采用串联分压电路。单片机采集热敏电阻的电压,通过A/D转换将模拟量电压信号转换成数字量电压信号,经过查表转换得到温度值,控制液晶屏实时显示温度值。本系统中所用到的器件是STC89C52单片机、NTC热敏电阻和LCD1602液晶显示屏。原理图如下单片机源程序如下:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit rs=P0^5;sbit rw=P0^6;sbit e=   
发表于 2020-01-20
基于热敏电阻的单片机温度测量系统设计
STC89C52RC单片机+串口+红外控制16路舵机程序
只有控制16路舵机的程序,现在发上来提供参考舵机可以通过串口控制,也可以用红外控制单片机源程序如下:#include "PCA9685_TJ.h"#include <stdio.h>#include <math.h>/*使用说明:        在main主程序                PCA9685_init();        在main主程序的while加入       
发表于 2020-01-20
STC89C52RC单片机+串口+红外控制16路舵机程序
51单片机交通灯系统设计(流程框图+硬件+源码)
这是老师要求做的项目,现在已经做好了,没有什么大问题。一, 设计要求与方案论证1.1设计要求:1.1.1基本要求:1、东西方向、南北方向均有红、黄、绿三种信号灯,初始红灯30秒,黄灯闪烁3秒,绿灯30秒,东西方向红灯时刻,南北方向绿灯,南北方向绿灯,东西方向红灯;2、按键调节与控制功能,通过按键,可以控制某一个方向长时间绿灯,另一个方向长时间红灯;通过按键可以控制某一个方向的红灯时长,比如调整东西方向红灯40秒,绿灯20秒,于此同时,南北方向红灯20秒,绿灯40秒。3、夜间模式按钮按下,所有方向显示黄灯闪烁4、实时提醒灯亮的剩余时间1.1.2拓展部分:目前还没拓展1.2系统基本方案选择和论证:1.2.1单片机芯片的选择方案和论证
发表于 2020-01-20
51单片机交通灯系统设计(流程框图+硬件+源码)
基于单片机的天然气泄漏报警系统设计论文
人们开发和研究传感器的重要方向。泄漏检测报警系统被广泛的应用于各个领域,如石油化工企业、石油运输管线、城市自来水地下管线、锅炉炉管、发动机箱体、缸盖等各种领域。泄漏检测技术在管道检测之中的应用得到了很好的发展。对于管道的泄漏检测要满足以下几个要求:1.准确可靠地判断泄漏的发生,并能够在较短的时间内判断出泄漏点具体的位置。2.准确可靠地判断泄漏程度,能对较小量的泄漏做出判断。3.检测原理简单,易于操作和维护。1基于单片机的天然气泄漏检测系统概述1.1天然气泄漏检测报警器的概述天然气泄漏检测报警器是燃气安全设备非常重要的一部分,它是由气敏传感器、单片机和报警器组成。它是安全使用城市燃气的最后一道保护设备。天然气泄漏检测报警器通过气敏传感器探测
发表于 2020-01-20
基于单片机的天然气泄漏报警系统设计论文
第一次偿试51单片机做个100分钟倒计时定时器
偿试着做了个100分钟倒计时定时器,原理图和代码都是东拼西凑来的(自己不会写啊),侵删制作出来的实物图如下: 电路原理图如下: 单片机源程序如下:#include <reg52.h>#include <intrins.H>#define uchar unsigned char#define uint  unsigned  int        uchar duan[16]={0xc0
发表于 2020-01-20
第一次偿试51单片机做个100分钟倒计时定时器
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved