历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | 51单片机PCA9685驱动9个舵机
2020-02-12 来源:51hei
51单片机PCA9685驱动板驱动舵机
单片机源程序如下:
#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修改频率 ----------------------------------------------------------------*/
下一篇:51单片机控制两个步进电机
史海拾趣
|
DSP是一种高性能的数字信号处理器。由于其具有快速的计算能力和强大的信息处理能力,因此被广泛地应用到工业自动化、国防科研等领域中。与常规单片机相比,DSP的内部结构和时序发生了很大的变化。所以单片机适用的接口芯片,DSP并不一定适用。对于非常 ...… 查看全部问答> |
|
最近正在做一个小实验,就是利用51连接8255控制端口输出。 简言之,我想控制8个二极管,以前是直接用P1口控制,比如输入P1=0xfe;我现在想试试将8255与51相连,8个灯与8255的PA口相连,但小弟不知两点:1、8255与51引脚如何连线;2、51如何通过控制 ...… 查看全部问答> |
|
#include \"hw_memmap.h\"#include \"hw_types.h\"#include \"hw_ints.h\"#include \"interrupt.h\"#include \"sysctl.h\"#include \"gpio.h\"#include \"pwm.h\" unsigned long Sysclk = 12000000UL;#define PB0_PWM2 GPIO_PIN_0&nb ...… 查看全部问答> |
|
如题,做ARM-LINUX 嵌入式开发,不是有ADS这个工具嘛,在WINDOWS 环境下,用ADS这个编译工具,写完并且编译好需要下载到开发板中的程序,然后,还能用AXD这个工具进行在线调试开发板,这是不是就够了呢。 那为什么还需要在LINUX环境中,比如RED HA ...… 查看全部问答> |




