历史上的今天
今天是: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){
史海拾趣
|
从开除沙僧和孙悟空想到的 在网上经常看到有一些人在讨论这样一个问题."如果把西游记中的唐僧师徒看做是一个团队,当从这个团队中开除一个人时应该选谁?",我发现很多人选的是沙僧或孙悟空.在生活中也能看到一些很有能力的员工被领导们排挤 ...… 查看全部问答> |
|
功能强劲的程序编辑器SourceInsight-v3.50.0050 功能强劲的程序编辑器SourceInsight-v3.50.0050 Source Insight是一个功能强劲的程序编辑器,他内置对C/C++,Java和x86汇编语言程序的解析;有自己的动态数据库在你编程时提供有用的文本提示,包括有关的函数,宏,参数等! 如今最好用的语言编辑 ...… 查看全部问答> |
|
在TI E2E社区中发现了几篇不错的文章,特意翻译过来分享给大家,其中Bruce Trump系列关于放大器有很好的见解,特此供大家学习和参考。 此篇是连载文章,欲知更多精彩内容,请查看我的其他分享! 摘要:鉴于反馈通路中相移(或者称作延迟)引起 ...… 查看全部问答> |
|
本帖最后由 shower.xu 于 2015-3-24 00:05 编辑 几经破折,今天板子才拿到手,结果发现不是之前的那块板子,只有重新搜集资料。 找了半天,基本是大家的各种吐槽,算了吧万事总有开头,花了一晚上时间测量了几个外设的脚位接口,修改了之前板子 ...… 查看全部问答> |




