历史上的今天
今天是: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度来回转即可,用的串口,蓝牙控制,很简单,给需要的朋友参考
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修改频率 ----------------------------------------------------------------*/
史海拾趣
|
摘 要:随着科技的不断向前发展,汽车电子化程度也越来越高,半导体技术也随之崛起。本文详尽的描述了硅技术的进步,微控制器在汽车应用上的发展以及硅产品在汽车网络所发挥的巨大潜力。最后作者希望汽车制造商和半导体生产商能够密切合作为 ...… 查看全部问答> |
|
湘潭钢铁集团公司(以下简称湘钢)煤气调度系统在改造前使用的都是 型淘汰仪表,截至改造前安装的 /0 块仪表因!电缆等原因已全部瘫痪。“六五”以来湘钢经过几次大的改造煤气用户大量增加,煤气测量点由原来的 12 多点已增至近/22 点,显然现有的煤 ...… 查看全部问答> |
|
sysAuxClkRateSet(int rate)函数中,rate只能设成(2,4,8,16,32,64,128,..,1024等等),我想精确定时到1ms或5ms、10ms该怎么办,或者有其它方法吗,请大家帮忙!… 查看全部问答> |
|
圈圈前面几个STM32的程序是直接拿例子来改的,但我们总不能每次都拿别人的例子来改吧?我们要学会如何自己来创建一个属于自己的IAR工程。 首先启动IAR开发环境。如果你的设置是在启动时出现Em ...… 查看全部问答> |
|
首先是@dontium 。共同讨论C2000系列中的CLA的一个计算方法。 图片截取自网络。其中第一项是比例项,第二项是积分项,第三项是微分项。对应的系数是kp,ki,kd。然后根据这个表达式的恒等变换可以得到最后一个表达式。如果计算第一个表达式。每次 ...… 查看全部问答> |




