历史上的今天
返回首页

历史上的今天

今天是:2024年11月20日(星期三)

正在发生

2019年11月20日 | 单片机iic+pca9685驱动控制9路舵机源程序

2019-11-20 来源:51hei

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

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,0x0);

}



void begin(void) 

{

                reset();

}

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

                                        PCA9685修改频率

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

推荐阅读

史海拾趣

ET Enterprises Ltd公司的发展小趣事

近年来,ET Enterprises Ltd公司经历了一系列的收购和战略合作。这些举措不仅进一步增强了公司的实力和市场地位,也为公司的未来发展注入了新的活力。例如,公司成为得克萨斯州Ludlum Measurements Inc.的子公司后,受益于美国光电倍增管生产商ADIT的生产设施和ET Enterprises的开发设施的综合资源,为公司的持续发展提供了有力支持。

以上五个故事概述了ET Enterprises Ltd公司的发展历程和关键阶段,展示了公司在电子行业中不断崛起和持续发展的过程。

台湾凌通(Generalplus)公司的发展小趣事
根据应用场合的光线变化范围和指示灯的响应要求,选择合适灵敏度的光敏元件。
Beckhoff Automation GmbH公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

Altera (Intel)公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

Hi-G Relays公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

ELM [ELM Electronics]公司的发展小趣事

随着产品线的不断扩张,ELM开始积极拓展市场,寻求更广阔的发展空间。公司制定了国际化战略,通过参加国际展会、建立海外销售渠道等方式,成功将产品打入国际市场。同时,ELM还积极与国际知名电子企业开展合作,共同研发新产品、开拓新市场。这些举措不仅为ELM带来了更多的商业机会,也提升了公司的国际影响力。

问答坊 | AI 解惑

硅技术引领汽车设计时代

摘  要:随着科技的不断向前发展,汽车电子化程度也越来越高,半导体技术也随之崛起。本文详尽的描述了硅技术的进步,微控制器在汽车应用上的发展以及硅产品在汽车网络所发挥的巨大潜力。最后作者希望汽车制造商和半导体生产商能够密切合作为 ...…

查看全部问答>

FOCS在煤调自动化系统中的应用

湘潭钢铁集团公司(以下简称湘钢)煤气调度系统在改造前使用的都是 型淘汰仪表,截至改造前安装的 /0 块仪表因!电缆等原因已全部瘫痪。“六五”以来湘钢经过几次大的改造煤气用户大量增加,煤气测量点由原来的 12 多点已增至近/22 点,显然现有的煤 ...…

查看全部问答>

建议一点

建议把资料共享区和技术交流区分开,通常下资料的都只是灌水,和技术交流混在一起感觉不便于聚集人气!…

查看全部问答>

2009年基本仪器和主要元器件清单20090827

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 2009年基本仪器和主要元器件清单20090827  …

查看全部问答>

vxworks辅助时钟定时问题,急急急急

sysAuxClkRateSet(int rate)函数中,rate只能设成(2,4,8,16,32,64,128,..,1024等等),我想精确定时到1ms或5ms、10ms该怎么办,或者有其它方法吗,请大家帮忙!…

查看全部问答>

自己动手创建一个基于万利STM32板的IAR工程

    圈圈前面几个STM32的程序是直接拿例子来改的,但我们总不能每次都拿别人的例子来改吧?我们要学会如何自己来创建一个属于自己的IAR工程。    首先启动IAR开发环境。如果你的设置是在启动时出现Em ...…

查看全部问答>

TDK 8G U盘到啦!晒一下!

祝我们的论坛越办越好!! [ 本帖最后由 anananjjj 于 2012-4-23 13:16 编辑 ]…

查看全部问答>

关于PID运算,一种10个时钟周期的另一种算法。

首先是@dontium 。共同讨论C2000系列中的CLA的一个计算方法。 图片截取自网络。其中第一项是比例项,第二项是积分项,第三项是微分项。对应的系数是kp,ki,kd。然后根据这个表达式的恒等变换可以得到最后一个表达式。如果计算第一个表达式。每次 ...…

查看全部问答>

AD转换检测的问题

AD转换时怎么检测上升沿下降沿,我是想让电压上升的时候让灯亮着,下降的时候灯灭,电压变化范围在1.2V~2.0V,是把先后采集到的数据进行比较吗,怎么把采集到的电压值储存起来再比较 …

查看全部问答>