久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3740|回復: 2
收起左側

STC89C52RC單片機+串口+紅外控制16路舵機程序

[復制鏈接]
ID:424598 發表于 2019-5-29 22:27 | 顯示全部樓層 |閱讀模式
有程友給我留言說需要一個紅外控制舵機的程序
但我沒有直接控制舵機的,只有控制16路舵機的程序,現在發上來提供參考

舵機可以通過串口控制,也可以用紅外控制(具體使用請看程序內備注)

O1CN01cJzGiO1LdW7kGnP6b_!!2207691322.jpg

單片機源程序如下:
  1. #include "PCA9685_TJ.h"
  2. #include <stdio.h>
  3. #include <math.h>

  4. /*使用說明:
  5.         在main主程序
  6.                 PCA9685_init();
  7.         在main主程序的while加入
  8.                 PCA9685_main();                        //注: 必需放在UART1_main();的前面
  9. */

  10. #define PCA9685_adrr 0x80//  1+A5+A4+A3+A2+A1+A0+w/r

  11. #define PCA9685_SUBADR1 0x2
  12. #define PCA9685_SUBADR2 0x3
  13. #define PCA9685_SUBADR3 0x4

  14. #define PCA9685_MODE1 0x0
  15. #define PCA9685_PRESCALE 0xFE

  16. #define LED0_ON_L 0x6
  17. #define LED0_ON_H 0x7
  18. #define LED0_OFF_L 0x8
  19. #define LED0_OFF_H 0x9

  20. #define ALLLED_ON_L 0xFA
  21. #define ALLLED_ON_H 0xFB
  22. #define ALLLED_OFF_L 0xFC
  23. #define ALLLED_OFF_H 0xFD
  24.   
  25. uchar mm,nn;
  26. uint SERV0;                //存儲值

  27. /*---------------------------------------------------------------
  28.                  IIC初始化         
  29. ----------------------------------------------------------------*/
  30. void init()
  31. {
  32.         sda=1;                //sda scl使用前被拉高
  33.         delay100us(1);
  34.         scl=1;
  35.         delay100us(1);
  36. }

  37. /*---------------------------------------------------------------
  38.                  IIC啟動
  39. ----------------------------------------------------------------*/
  40. void start()
  41. {
  42.         sda=1;
  43.         delay100us(1);
  44.         scl=1;       //scl高 sda拉低 IIC啟動
  45.         delay100us(1);
  46.         sda=0;
  47.         delay100us(1);
  48.         scl=0;
  49.         delay100us(1);
  50. }
  51. /*---------------------------------------------------------------
  52.                  IIC停止
  53. ----------------------------------------------------------------*/
  54. void stop()
  55. {
  56.     sda=0;
  57.     delay100us(1);
  58.     scl=1;
  59.     delay100us(1);
  60.     sda=1;                  
  61.     delay100us(1);
  62. }
  63. /*---------------------------------------------------------------
  64.                  IIC應答
  65. ----------------------------------------------------------------*/
  66. void ACK()
  67. {
  68.         uchar i;
  69.         scl=1;
  70.         delay100us(1);
  71.         while((sda=1)&&(i<255)) {         
  72.                 i++;                     
  73.         }                  
  74.         scl=0;                                 
  75.         delay100us(1);
  76. }
  77. /*---------------------------------------------------------------
  78.               寫字節
  79. ----------------------------------------------------------------*/
  80. void write_byte(uchar byte)
  81. {
  82.         uchar i,temp;
  83.         temp=byte;
  84.         for(i=0;i<8;i++)
  85.         {
  86.                 temp=temp<<1;  
  87.                 scl=0;                  
  88.                 delay100us(1);
  89.                 sda=CY;                 
  90.                 delay100us(1);
  91.                 scl=1;           
  92.                 delay100us(1);
  93.         }
  94.         scl=0;                  
  95.         delay100us(1);
  96.         sda=1;                 
  97.         delay100us(1);
  98. }
  99. /*---------------------------------------------------------------
  100.               讀字節
  101. ----------------------------------------------------------------*/
  102. uchar read_byte()
  103. {
  104.         uchar i,j,k;
  105.         scl=0;
  106.         delay100us(1);
  107.         sda=1;
  108.         delay100us(1);
  109.         for(i=0;i<8;i++)        
  110.         {
  111.                 delay100us(1);
  112.                 scl=1;
  113.                 delay100us(1);
  114.                 if(sda==1)
  115.                 {
  116.                         j=1;
  117.                 }
  118.                 else j=0;
  119.                 k=(k<< 1)|j;  
  120.                 scl=0;            
  121.         }
  122.         delay100us(1);
  123.         return k;
  124. }
  125. /*---------------------------------------------------------------
  126.                 PCA9685
  127. ----------------------------------------------------------------*/
  128. /*---------------------------------------------------------------
  129.                寫數據到PCA9685
  130. ----------------------------------------------------------------*/
  131. void PCA9685_write(uchar address,uchar date)
  132. {
  133.         start();
  134.         write_byte(PCA9685_adrr);
  135.         ACK();                          
  136.         write_byte(address);
  137.         ACK();
  138.         write_byte(date);
  139.         ACK();
  140.         stop();
  141. }
  142. /*---------------------------------------------------------------
  143.             從PCA9685讀數據有返回值
  144. ----------------------------------------------------------------*/
  145. uchar PCA9685_read(uchar address)
  146. {
  147.         uchar date;
  148.         start();
  149.         write_byte(PCA9685_adrr);
  150.         ACK();
  151.         write_byte(address);
  152.         ACK();
  153.         start();
  154.         write_byte(PCA9685_adrr|0x01);
  155.         ACK();
  156.         date=read_byte();
  157.         stop();
  158.         return date;
  159. }
  160. /*---------------------------------------------------------------
  161.                         PCA9685復位
  162. ----------------------------------------------------------------*/
  163. void reset(void)
  164. {
  165.         PCA9685_write(PCA9685_MODE1,0x0);
  166. }


  167. void begin(void)
  168. {
  169.         reset();
  170. }
  171. /*---------------------------------------------------------------
  172.                  PCA9685修改頻率
  173. ----------------------------------------------------------------*/
  174. void setPWMFreq(float freq)
  175. {
  176.         uint prescale,oldmode,newmode;
  177.         float prescaleval;
  178.         freq *= 0.92;  // Correct for overshoot in the frequency setting
  179.         prescaleval = 25000000;
  180.         prescaleval /= 4096;
  181.         prescaleval /= freq;
  182.         prescaleval -= 1;
  183.         prescale = floor(prescaleval + 0.5);
  184.         
  185.         oldmode = PCA9685_read(PCA9685_MODE1);
  186.         newmode = (oldmode&0x7F) | 0x10; // sleep
  187.         PCA9685_write(PCA9685_MODE1, newmode); // go to sleep
  188.         PCA9685_write(PCA9685_PRESCALE, prescale); // set the prescaler
  189.         PCA9685_write(PCA9685_MODE1, oldmode);
  190.         delay1ms(10);
  191.         PCA9685_write(PCA9685_MODE1, oldmode | 0xa1);
  192. }

  193. void setPWM(uint num, uint on, uint off)
  194. {
  195.         PCA9685_write(LED0_ON_L+4*num,on);
  196.         PCA9685_write(LED0_ON_H+4*num,on>>8);
  197.         PCA9685_write(LED0_OFF_L+4*num,off);
  198.         PCA9685_write(LED0_OFF_H+4*num,off>>8);
  199. }

  200. void PCA9685_init() {
  201.         init();                                //初始化
  202.         begin();                        //初始化
  203.         setPWMFreq(50);    //設置50hz

  204.         for(nn=0;nn<16;nn++) { //初始化
  205.                 setPWM(nn, 0, SERVOMAX);
  206.         }
  207. }

  208. void PCA9685_main() {
  209.         if(buf1[0]!=0x00 && cmd1==1){
  210.                 switch(buf1[0])
  211.                 {
  212.                         case 0x31:                        //串口輸入1~
  213.                                 mm=0;break;      
  214.                         case 0x32:                        //串口輸入2~
  215.                                 mm=1;break;
  216.                         case 0x33:                        //串口輸入3~
  217.                                 mm=2;break;
  218.                         case 0x34:                        //串口輸入4~
  219.                                 mm=3;break;
  220.                         case 0x35:                        //串口輸入5~
  221.                                 mm=4;break;
  222.                         case 0x36:                        //串口輸入6~
  223.                                 mm=5;break;
  224.                         case 0x37:                        //串口輸入7~
  225.                                 mm=6;break;
  226.                         case 0x38:                        //串口輸入8~
  227.                                 mm=7;break;
  228.                         case 0x39:                        //串口輸入9~
  229.                                 mm=8;break;
  230.                         case 0x41:                        //串口輸入A~
  231.                                 mm=9;break;
  232.                         case 0x42:                        //串口輸入B~
  233.                                 mm=10;break;
  234.                         case 0x43:                        //串口輸入C~
  235.                                 mm=11;break;
  236.                         case 0x44:                        //串口輸入D~
  237.                                 mm=12;break;
  238.                         case 0x45:                        //串口輸入E~
  239.                                 mm=13;break;
  240.                         case 0x46:                        //串口輸入F~
  241.                                 mm=14;break;
  242.                         case 0x47:                        //串口輸入G~
  243.                                 mm=15;break;                                
  244.                         default:break;  //接受到其它數據,蜂鳴器響         
  245.                 }
  246.                 if(SERV0==SERVO110){ SERV0=SERVOMAX; } else { SERV0=SERVO110; }
  247.                 setPWM(mm, 0, SERV0);
  248.                 mm=999;
  249.         }
  250. }
復制代碼
全部資料51hei下載地址:
STC89C52RC+串口+紅外控制16路舵機.zip (70.37 KB, 下載次數: 67)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:632112 發表于 2020-1-19 15:00 | 顯示全部樓層
好東西,謝謝樓主分享
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:99114 發表于 2020-4-4 10:13 | 顯示全部樓層
可以,我正好需要
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 欧美电影免费网站 | 日本精a在线观看 | 亚洲va国产日韩欧美精品色婷婷 | 欧美日韩福利视频 | 麻豆成人在线视频 | wwwxxx国产| 超碰人人91| 精品国产高清一区二区三区 | 成人国产精品免费观看视频 | 欧美色图另类 | www.天天干.com | 91精品久久久久久久久 | 久久9精品| 久久久女女女女999久久 | 日本在线看片 | 亚洲网址 | 欧美综合一区二区三区 | 日韩在线一区二区三区 | 欧洲国产精品视频 | av在线播放网站 | 亚洲风情在线观看 | 日本久久www成人免 成人久久久久 | 日韩欧美综合 | 亚洲精品黄色 | 亚洲精品久久久久久久不卡四虎 | 亚洲精品视频在线播放 | 亚洲 中文 欧美 日韩 在线观看 | 国产自产c区 | 久久99蜜桃综合影院免费观看 | 久久久久久久久久毛片 | 中文字幕国产精品 | 精品一区国产 | 国产成人在线视频免费观看 | 日本aaa视频 | 亚欧洲精品在线视频免费观看 | 欧美一区二区三区四区视频 | 精品欧美一区二区三区久久久 | 免费成年网站 | 超碰97免费在线 | 美女视频.|