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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5308|回復: 2
打印 上一主題 下一主題
收起左側

51單片機控制PCA9685源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:496997 發表于 2019-8-19 19:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51控制PCA9685,使用軟件模擬IIC,都在代碼里了。
目的是為了控制16X舵機,50HZ
單片機源程序如下:
  1. /*        PCA9685驅動程序        */
  2. /*        使用IO口模擬通信        */
  3. /*        16路PWM輸出                        */
  4. #include<reg52.h>           
  5. #include<intrins.h>

  6. sbit SCL=P1^0;                //定義時鐘引腳
  7. sbit SDA=P1^1;                //定義數據引腳

  8. #define PCA9685_adrr 0x80//1+A5+A4+A3+A2+A1+A0+w/r
  9. #define PCA9685_SUBADR1 0x2
  10. #define PCA9685_SUBADR2 0x3
  11. #define PCA9685_SUBADR3 0x4
  12. #define PCA9685_MODE1 0x0
  13. #define PCA9685_MODE2 0x1
  14. #define PCA9685_PRESCALE 0xFE
  15. #define pwm0_ON_L 0x6
  16. #define pwm0_ON_H 0x7
  17. #define pwm0_OFF_L 0x8
  18. #define pwm0_OFF_H 0x9
  19. #define ALLpwm_ON_L 0xFA
  20. #define ALLpwm_ON_H 0xFB
  21. #define ALLpwm_OFF_L 0xFC
  22. #define ALLpwm_OFF_H 0xFD

  23. void iic_delay()//延時5us
  24. {
  25.         _nop_();
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();
  29.         _nop_();
  30. }
  31. void iic_start()//scl高電平區間,sda一個下降沿啟動信號
  32. {
  33.         SDA=1;
  34.         iic_delay();
  35.         SCL=1;
  36.         iic_delay();
  37.         SDA=0;
  38.         iic_delay();
  39.         SCL=0;
  40.         iic_delay();
  41. }
  42. void iic_stop()//scl在高電平區間,sda一個上升沿信號
  43. {
  44.         SDA=0;
  45.         iic_delay();
  46.         SCL=1;
  47.         iic_delay();
  48.         SDA=1;
  49.         iic_delay();
  50. }
  51. void iic_wait_ack()//在scl高位時,從機拉低sda引腳表示應答
  52. {
  53.         unsigned char i=0;
  54.         SCL=1;
  55.         iic_delay();
  56.         while((SDA==1)&&(i<255))
  57.         {
  58.                 i++;
  59.         }
  60.         SCL=0;
  61.         iic_delay();
  62. }
  63. void iic_init()//初始化IIC通訊引腳
  64. {
  65.         SCL=1;
  66.         iic_delay();
  67.         SDA=1;
  68.         iic_delay();
  69. }
  70. void iic_send_ack(bit iic_ack)//接受完成之后,發送應答位,0應答繼續發送,1不應答停止發送
  71. {
  72.         SDA=iic_ack;
  73.         SCL=1;
  74.         iic_delay();
  75.         SCL=0;
  76.         iic_delay();
  77. }
  78. void iic_write_byte(unsigned char iic_byte)
  79. {
  80.         unsigned char i=0;
  81.         for(i=0;i<8;i++)
  82.         {
  83.                 SCL=0;
  84.                 iic_delay();
  85.                 SDA=iic_byte&0X80;
  86.                 iic_byte=iic_byte<<1;
  87.                 iic_delay();
  88.                 SCL=1;
  89.                 iic_delay();
  90.         }
  91.         SCL=0;
  92.         iic_delay();
  93.         SDA=1;
  94.         iic_wait_ack();
  95. }
  96. void iic_write(unsigned char slave_addr,unsigned char iic_addr,unsigned char iic_byte)
  97. {
  98.         iic_init();
  99.         iic_start();
  100.         iic_write_byte(slave_addr);
  101.         iic_write_byte(iic_addr);
  102.         iic_write_byte(iic_byte);
  103.         iic_stop();
  104. }
  105. unsigned char iic_read_byte()//讀字節,先讀高位,左移
  106. {
  107.         unsigned char i=0;
  108.         unsigned char iic_byte=0;
  109.         SCL=0;
  110.         iic_delay();
  111.         SDA=1;                                                                                        //確保主機釋放SDA
  112.         iic_delay();
  113.         for(;i<8;i++)
  114.         {
  115.                 iic_delay();
  116.                 SCL=1;
  117.                 iic_delay();
  118.                 iic_byte=(iic_byte<<1)|SDA;
  119.                 SCL=0;
  120.         }
  121.         iic_delay();
  122.         return iic_byte;
  123. }
  124. unsigned char iic_read(unsigned char slave_addr,unsigned char iic_addr)
  125. {
  126.         unsigned char iic_byte;
  127.         iic_init();
  128.         iic_start();
  129.         iic_write_byte(slave_addr);
  130.         iic_write_byte(iic_addr);
  131.         iic_start();
  132.         iic_write_byte(slave_addr|0x01);//發送設備地址+讀信號
  133.         iic_byte=iic_read_byte();
  134.         iic_send_ack(1);//發送非應答信號
  135.         iic_stop();
  136.         return iic_byte;
  137. }
  138. void pca_set_freq()//頻率設置為50hz(20ms)
  139. {
  140.         unsigned char prescale=132,oldmode,newmode;
  141.         iic_write(0x80,0x00,0x0);
  142.         oldmode=iic_read(0x80,0x00);
  143.         newmode=(oldmode&0x7F)|0x10;
  144.         iic_write(0x80,0x00,newmode);//進入sleep
  145.                                                                                                                          //設置頻率時pca9685應該進入睡眠狀態
  146.         iic_write(0x80,0xFE,prescale);
  147.         iic_write(0x80,0x00,oldmode);//退出sleep
  148.         iic_write(0x80,0x00,oldmode|0xA1);//立即重啟
  149. }
  150. void pca_set_pwm(unsigned char channel,unsigned char angle)
  151. {
  152.         unsigned int off=102+(angle*2.27);
  153.         iic_write(0x80,0x06+4*channel,0);
  154.         iic_write(0x80,0x07+4*channel,0);
  155.         iic_write(0x80,0x08+4*channel,off);
  156.         iic_write(0x80,0x09+4*channel,off>>8);
  157. }
  158. void delay(unsigned char delay_a)                //@11.0592MHz
  159. {
  160.         while(delay_a)
  161.         {
  162.                 unsigned char delay_b=255;
  163.                 while(delay_b)
  164.                 {
  165.                         iic_delay();
  166.                         iic_delay();
  167.                         delay_b--;
  168.                 }
  169.                 delay_a--;
  170.         }
  171. }
  172. int main()
  173. {
  174.         pca_set_freq();
  175.         delay(155);
  176.         pca_set_pwm(0,40);
  177.         pca_set_pwm(1,40);
  178.         delay(155);
  179.         pca_set_pwm(0,140);
  180.         pca_set_pwm(1,140);
  181.         delay(155);
  182.         pca_set_pwm(1,150);
  183.         delay(155);
  184.         pca_set_pwm(1,47);
  185.         delay(155);
  186.         pca_set_pwm(0,70);
  187.         while(1);
  188. }
復制代碼

51_pca9685_iic.rar (1.33 KB, 下載次數: 63)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:164988 發表于 2020-4-22 23:29 | 只看該作者
下載后解壓縮時:提示找不到文件
回復

使用道具 舉報

板凳
ID:496997 發表于 2020-10-27 21:48 | 只看該作者
LXJ50 發表于 2020-4-22 23:29
下載后解壓縮時:提示找不到文件

??我試了一下可以呀,我壓縮軟件用的WINRAR。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一成年免费网站 | 放个毛片看看 | 99久久精品国产毛片 | 国产精品我不卡 | 丁香五月网久久综合 | 精品久久久久久久久久久久久久 | 日韩精品一区二区三区视频播放 | 欧美精品在欧美一区二区少妇 | 久久91 | 成人精品一区二区 | 在线视频一区二区 | 精品区| 国产视频中文字幕在线观看 | 欧洲成人免费视频 | 99精品视频免费在线观看 | 欧美亚洲一区二区三区 | 国产免费一区二区三区网站免费 | 久久久久亚洲精品中文字幕 | 欧美网址在线观看 | 色视频www在线播放国产人成 | 91在线精品秘密一区二区 | www.久| 国产一区二区在线播放 | 亚洲精品在线播放 | 亚洲一区在线免费观看 | 99久久精品免费看国产四区 | 欧美日韩综合一区 | 欧洲精品在线观看 | 亚洲一区二区三区免费在线 | 女同videos另类 | 正在播放国产精品 | 国产精品99视频 | 久久九九影视 | 亚洲网一区| www.狠狠操| 三级黄色片在线观看 | 青青草一区 | 日韩三级电影一区二区 | 精品综合久久久 | 亚洲一区二区三区四区五区午夜 | 国产精品视频一二三区 |