历史上的今天
返回首页

历史上的今天

今天是:2025年01月20日(星期一)

正在发生

2020年01月20日 | STC89C52RC单片机+串口+红外控制16路舵机程序

2020-01-20 来源:51hei

只有控制16路舵机的程序,现在发上来提供参考

舵机可以通过串口控制,也可以用红外控制

单片机源程序如下:

#include "PCA9685_TJ.h"

#include

#include


/*使用说明:

        在main主程序

                PCA9685_init();

        在main主程序的while加入

                PCA9685_main();                        //注: 必需放在UART1_main();的前面

*/


#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

  

uchar mm,nn;

uint SERV0;                //存储值


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

                 IIC初始化         

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

void init()

{

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

        delay100us(1);

        scl=1;

        delay100us(1);

}


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

                 IIC启动

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

void start()

{

        sda=1;

        delay100us(1);

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

        delay100us(1);

        sda=0;

        delay100us(1);

        scl=0;

        delay100us(1);

}

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

                 IIC停止

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

void stop()

{

    sda=0;

    delay100us(1);

    scl=1;

    delay100us(1);

    sda=1;                   

    delay100us(1);

}

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

                 IIC应答

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

void ACK()

{

        uchar i;

        scl=1;

        delay100us(1);

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

                i++;                     

        }                   

        scl=0;                                  

        delay100us(1);

}

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

              写字节

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

void write_byte(uchar byte)

{

        uchar i,temp;

        temp=byte;

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

        {

                temp=temp<<1;  

                scl=0;                  

                delay100us(1);

                sda=CY;                 

                delay100us(1);

                scl=1;           

                delay100us(1);

        }

        scl=0;                  

        delay100us(1);

        sda=1;                 

        delay100us(1);

}

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

              读字节

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

uchar read_byte()

{

        uchar i,j,k;

        scl=0;

        delay100us(1);

        sda=1;

        delay100us(1);

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

        {

                delay100us(1);

                scl=1;

                delay100us(1);

                if(sda==1)

                {

                        j=1;

                }

                else j=0;

                k=(k<< 1)|j;  

                scl=0;            

        }

        delay100us(1);

        return k;

}

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

                PCA9685

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

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

               写数据到PCA9685

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

void PCA9685_write(uchar address,uchar date)

{

        start();

        write_byte(PCA9685_adrr);

        ACK();                          

        write_byte(address);

        ACK();

        write_byte(date);

        ACK();

        stop();

}

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

            从PCA9685读数据有返回值

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

uchar PCA9685_read(uchar address)

{

        uchar date;

        start();

        write_byte(PCA9685_adrr);

        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修改频率

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

void setPWMFreq(float freq) 

{

        uint prescale,oldmode,newmode;

        float prescaleval;

        freq *= 0.92;  // Correct for overshoot in the frequency setting 

        prescaleval = 25000000;

        prescaleval /= 4096;

        prescaleval /= freq;

        prescaleval -= 1;

        prescale = floor(prescaleval + 0.5);

        

        oldmode = PCA9685_read(PCA9685_MODE1);

        newmode = (oldmode&0x7F) | 0x10; // sleep

        PCA9685_write(PCA9685_MODE1, newmode); // go to sleep

        PCA9685_write(PCA9685_PRESCALE, prescale); // set the prescaler

        PCA9685_write(PCA9685_MODE1, oldmode);

        delay1ms(10);

        PCA9685_write(PCA9685_MODE1, oldmode | 0xa1); 

}


void setPWM(uint num, uint on, uint off) 

{

        PCA9685_write(LED0_ON_L+4*num,on);

        PCA9685_write(LED0_ON_H+4*num,on>>8);

        PCA9685_write(LED0_OFF_L+4*num,off);

        PCA9685_write(LED0_OFF_H+4*num,off>>8);

}


void PCA9685_init() {

        init();                                //初始化

        begin();                        //初始化

        setPWMFreq(50);    //设置50hz


        for(nn=0;nn<16;nn++) { //初始化

                setPWM(nn, 0, SERVOMAX);

        }

}


void PCA9685_main() {

        if(buf1[0]!=0x00 && cmd1==1){

推荐阅读

史海拾趣

ASC Capacitors公司的发展小趣事

ASC Capacitors一直注重技术研发和创新。在XXXX年,公司成功研发出了一种新型薄膜电容器,该电容器不仅具有优异的性能,而且寿命长达100,000小时以上。这一技术突破使得ASC Capacitors在电容器市场上取得了重大突破,也奠定了公司在行业内的领先地位。

Embedded Artists公司的发展小趣事

随着业务的不断发展,Embedded Artists公司开始考虑向国际市场扩张。他们与全球各地的合作伙伴建立了紧密的合作关系,共同开发适用于不同市场的嵌入式解决方案。同时,公司还积极参加国际展会和研讨会,与全球同行交流技术心得和市场动态。这些努力使Embedded Artists公司的品牌在国际市场上得到了广泛认可。

DEMMELPRODUCTS公司的发展小趣事

在追求技术创新和市场拓展的同时,DEMMELPRODUCTS公司始终将品质管理放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的质量控制。此外,公司还积极引入先进的生产设备和技术,不断提高生产效率和产品质量。通过持续改进和优化,DEMMELPRODUCTS公司的产品品质得到了客户和行业的广泛认可。

Grande Electronics Ltd公司的发展小趣事
如电池电量不足、电源线路断路或短路,导致发射电路无法正常工作。
Hongfa公司的发展小趣事

宏发公司的发展离不开自主研发和技术创新。1998年,宏发成立了精合公司,开启了自主研发自动化设备设计及制造的征程。此后,公司不断加大在技术研发上的投入,建立了博士后科研工作站和院士专家工作站,形成了从产品研发、模具制造、零件制造到自动化成品装配及在线检测的一体化全产业链。通过技术创新,宏发不仅提升了产品性能和质量,还成功打破了国外技术垄断,实现了高端继电器的自主研发和生产。

芯源半导体(CW)公司的发展小趣事

在电子行业的激烈竞争中,芯源半导体(CW)公司凭借其卓越的技术创新能力,成功在市场中脱颖而出。公司创始人李博士带领研发团队,针对当时市场上半导体产品的不足,开发出了一款高性能、低功耗的芯片产品。这款产品凭借其卓越的性能和稳定性,迅速获得了市场的认可,为芯源半导体(CW)公司的初期发展奠定了坚实基础。

问答坊 | AI 解惑

从开除沙僧和孙悟空想到的

从开除沙僧和孙悟空想到的 在网上经常看到有一些人在讨论这样一个问题."如果把西游记中的唐僧师徒看做是一个团队,当从这个团队中开除一个人时应该选谁?",我发现很多人选的是沙僧或孙悟空.在生活中也能看到一些很有能力的员工被领导们排挤 ...…

查看全部问答>

Wince环境下地图的问题

Wince环境下导入地图用什么控件,还是根本不需要用什么控件,还有显示地图有哪些基本操作呢?麻烦了~…

查看全部问答>

功能强劲的程序编辑器SourceInsight-v3.50.0050

功能强劲的程序编辑器SourceInsight-v3.50.0050 Source Insight是一个功能强劲的程序编辑器,他内置对C/C++,Java和x86汇编语言程序的解析;有自己的动态数据库在你编程时提供有用的文本提示,包括有关的函数,宏,参数等! 如今最好用的语言编辑 ...…

查看全部问答>

ZwSetInformationFile问题

NTSTATUS CoreyDDKDriverControl(IN PDEVICE_OBJECT pDevObj,                                                 &nb ...…

查看全部问答>

互联系列USB库例程何时出

                                 现在USB-OTG-FS库也不会用,水平太哇。不知道什么时候会有例程出来…

查看全部问答>

“驯服”振荡—电容性负载问题

在TI E2E社区中发现了几篇不错的文章,特意翻译过来分享给大家,其中Bruce Trump系列关于放大器有很好的见解,特此供大家学习和参考。 此篇是连载文章,欲知更多精彩内容,请查看我的其他分享! 摘要:鉴于反馈通路中相移(或者称作延迟)引起 ...…

查看全部问答>

CCS无法烧写程序

CCS调试过程中“cannot load from non-primitive location”是什么原因 …

查看全部问答>

Keil数组幅值问题

  Ref_Buffer[259] = Ref_Buffer[0];   for(z=1;z…

查看全部问答>

【LPC54100】第一周-分享部分原理图和blink跑起

本帖最后由 shower.xu 于 2015-3-24 00:05 编辑 几经破折,今天板子才拿到手,结果发现不是之前的那块板子,只有重新搜集资料。 找了半天,基本是大家的各种吐槽,算了吧万事总有开头,花了一晚上时间测量了几个外设的脚位接口,修改了之前板子 ...…

查看全部问答>

新手求助关于LPC1765低功耗模式的代码

我现在想关闭锁相环或是进入深睡眠模式。代码在while ((LPC_SC->PLL0STAT & (1…

查看全部问答>