/*********************

STC8H1K24-36I-LQFP32

外部8M晶振

openpnp控制输出500hz(2ms)

1%占空比(20us) - 1号动作 feed

2%占空比(40us) - 2号动作

3%占空比(60us) - 3号动作

8%占空比(160us) - 8号动作

。。。

64% - 连级8号板的8号动作

连级 9-16 id123决定

70%-95% 动作结束 post pick

90度为最远端

**/

#include <STC8H.H>
#include "intrins.h"#define        z0  (999 + 155)     //0度高电平时间0.5ms(0.25%PWM) (20ms对应40000,计算完减一)  20ms*0.025
#define   z90  2999     //90度高电平时间1.5ms(0.75%PWM)  20ms*0.075typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD; sbit INT0 = P3^2;
sbit L1 = P3^3;   //8mm=1  4mm=0
sbit L2 = P3^4;
sbit L3 = P3^5;
sbit L4 = P3^6;
sbit L5 = P3^7;
sbit L6 = P2^5;
sbit L7 = P2^7;
sbit L8 = P0^0;
sbit SW90 = P0^3;
sbit SW0 = P5^4;
sbit ID1 = P0^1;
sbit ID2 = P0^2;
sbit ID3 = P1^1;/**********************************
ID1=1 ID2=1 ID3=1 -----------第1个板
ID1=1 ID2=1 ID3=0 -----------第2个
ID1=1 ID2=0 ID3=1 -----------第3个
ID1=1 ID2=0 ID3=0 -----------第4个
ID1=0 ID2=1 ID3=1 -----------第5个
ID1=0 ID2=1 ID3=0 -----------第6个
ID1=0 ID2=0 ID3=1 -----------第7个
ID1=0 ID2=0 ID3=0 -----------第8个共64个feed
**********************************/BYTE fy1;  //t2溢出计数
DWORD z1,z2;
DWORD T1_sl,T1_sl1;
BYTE th0_1,tl0_1,zy2_1;
BYTE t1i=0;
BYTE dz=0; //动作 =1 1#; =2 2#; =0 不动
bit dz1=0;  //=1新动作
WORD pd1,pd2,pd3,pd4,pd5,pd6,pd7,pd8;  //频段void Timer0Init(void)     //TIME0 计算脉冲高电平时间
{AUXR |= 0x80;        //定时器时钟1T模式TMOD = 0x00;TL0 = 0;                               TH0 = 0;TF0 = 0;        //清除TF0标志TR0 = 1;
}
void Timer1Init(void)            //80毫秒@8MHz  //800ms输出一次频率
{AUXR &= 0xBF;        //定时器时钟12T模式TMOD &= 0x0F;        //设置定时器模式TL1 = 0xAB;        //设置定时初始值TH1 = 0x2F;        //设置定时初始值TF1 = 0;        //清除TF1标志TR1 = 1;        //定时器1开始计时
}void Delay600ms()        //@8MHz  500ms
{unsigned char i, j, k; _nop_();i = 21;j = 75;k = 189;do{do{while (--k);} while (--j);} while (--i);
}    void main()
{P0=0xff;P1=0xff;P2=0xff;P3=0xff;P4=0xff;P5=0xff;    //P0_Mode_HighZ(PIN_5);    P0_Mode_PullUp(PIN_0|PIN_1|PIN_2|PIN_3);//P1_Mode_HighZ(PIN_ALL);P1_Mode_PullUp(PIN_1);P1_Mode_OUT_PP(PIN_0|PIN_2);P2_Mode_PullUp(PIN_5|PIN_7);P2_Mode_OUT_PP(PIN_0|PIN_1|PIN_2|PIN_3|PIN_4|PIN_6);P3_Mode_PullUp(PIN_ALL);P4_Mode_PullUp(PIN_ALL);P5_Mode_PullUp(PIN_ALL);P_SW2 = 0x80;XOSCCR = 0xc0; //启动外部晶振while (!(XOSCCR & 1)); //等待时钟稳定CLKDIV = 0x00; //时钟不分频CKSEL = 0x01; //选择外部晶振P_SW2 = 0x80;PWMA_PS=0x50;  //pwma _1 _2        //pwma pin脚选择  pwm3 pwm4 换到_2PWMA_CCER1 = 0x00;                          //写CCMRx前必须先清零CCERx关闭通道PWMA_CCER2 = 0x00;                          //写CCMRx前必须先清零CCERx关闭通道        PWMA_CCMR1 = 0x60;                          //设置CC1为 PWMA输出模式1PWMA_CCMR2 = 0x60;PWMA_CCMR3 = 0x60;                          PWMA_CCMR4 = 0x60;                         //4PWMA_CCER1 = 0x11;  //2p 1PPWMA_CCER2 = 0x11;  //4P 3P 使能PWMA_PSCR = 3;   //4分频PWMB_PSCR = 3;   //4分频/***************************** //50HZ 舵机输出频率=时钟频率/((PWMA_PSCR+1) * (PWMA_ARR+1))50=8000000/(4 * (PWMA_ARR+1))50=8000000/(4*PWMA_ARR+4)8000000=200*PWMA_ARR+200200*PWMA_ARR = 7999800PWMA_ARR=39999*******************************/        PWMA_ARR = 39999;                          //设置周期时间 20msPWMB_ARR = 39999;PWMB_PS=0; PWMB_CCER1 = 0x00;                         PWMB_CCER2 = 0x00;                         PWMB_CCMR1 = 0x60;   // 5                     PWMB_CCMR2 = 0x60;                         PWMB_CCMR3 = 0x60;                         PWMB_CCMR4 = 0x60;   //8PWMB_CCER1 = 0x11;   //6p 5PPWMB_CCER2 = 0x11;  //8P 7P 使能PWMA_CCR1 = z90;    // pwm1高电平时间PWMA_CCR2 = z90;PWMA_CCR3 = z90;PWMA_CCR4 = z90;PWMB_CCR5 = z90;PWMB_CCR6 = z90;PWMB_CCR7 = z90;PWMB_CCR8 = z90;PWMA_ENO = 0x55;                            //使能PWM1P 2p 3p 4p端口输出PWMA_BKR = 0x80;                            //使能主输出PWMA_CR1 = 0x01;                            //开始计时PWMB_ENO = 0x55;                            //使能PWM5P 6p 7p 8p端口输出PWMB_BKR = 0x80;                            //使能主输出PWMB_CR1 = 0x01;                            //开始计时INT0 = 1;IT0 = 0;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)EX0 = 1;                    //使能INT0中断Timer0Init();ET0 = 1;                                    //使能定时器中断Timer1Init();ET1 = 1;EA=1;while(1){if(SW90==0){PWMA_CCR1 = z90;PWMA_CCR2 = z90;PWMA_CCR3 = z90;PWMA_CCR4 = z90;PWMB_CCR5 = z90;PWMB_CCR6 = z90;PWMB_CCR7 = z90;PWMB_CCR8 = z90;while(!SW90);}if(SW0==0){PWMA_CCR1 = z0;PWMA_CCR2 = z0;PWMA_CCR3 = z0;PWMA_CCR4 = z0;PWMB_CCR5 = z0;PWMB_CCR6 = z0;PWMB_CCR7 = z0;PWMB_CCR8 = z0;while(!SW0);}if(dz1==1&&dz==1){dz1=0;PWMA_CCR1 = z0;Delay600ms();PWMA_CCR1 = z90;if(L1==0){Delay600ms();PWMA_CCR1 = z0;Delay600ms();PWMA_CCR1 = z90;}}if(dz1==1&&dz==2){dz1=0;PWMA_CCR2 = z0;Delay600ms();PWMA_CCR2 = z90;if(L2==0){Delay600ms();PWMA_CCR2 = z0;Delay600ms();PWMA_CCR2 = z90;}}if(dz1==1&&dz==3){dz1=0;PWMA_CCR3 = z0;Delay600ms();PWMA_CCR3 = z90;if(L3==0){Delay600ms();PWMA_CCR3 = z0;Delay600ms();PWMA_CCR3 = z90;}}if(dz1==1&&dz==4){dz1=0;PWMA_CCR4 = z0;Delay600ms();PWMA_CCR4 = z90;if(L4==0){Delay600ms();PWMA_CCR4 = z0;Delay600ms();PWMA_CCR4 = z90;}}if(dz1==1&&dz==5){dz1=0;PWMB_CCR5 = z0;Delay600ms();PWMB_CCR5 = z90;if(L5==0){Delay600ms();PWMB_CCR5 = z0;Delay600ms();PWMB_CCR5 = z90;}}    if(dz1==1&&dz==6){dz1=0;PWMB_CCR6 = z0;Delay600ms();PWMB_CCR6 = z90;if(L6==0){Delay600ms();PWMB_CCR6 = z0;Delay600ms();PWMB_CCR6 = z90;}}if(dz1==1&&dz==7){dz1=0;PWMB_CCR7 = z0;Delay600ms();PWMB_CCR7 = z90;if(L7==0){Delay600ms();PWMB_CCR7 = z0;Delay600ms();PWMB_CCR7 = z90;}}if(dz1==1&&dz==8){dz1=0;PWMB_CCR8 = z0;Delay600ms();PWMB_CCR8 = z90;if(L8==0){Delay600ms();PWMB_CCR8 = z0;Delay600ms();PWMB_CCR8 = z90;}}    }
}        /*********************************************************************************************/
void TM0_Isr() interrupt 1           //中断入口
{fy1++;
}
/***********************************************************************************/
void TM1_Isr() interrupt 3      //80毫秒@8MHz  //80ms计算一次频率{t1i++;if(t1i>=1){t1i=0;//T1_sl=T1_sl1/8000000;  //sT1_sl=T1_sl1/8;  //us/*********************8M*******openpnp控制输出500hz(2ms)1%(20us)  2%(40us)  8%9%占空比(180us) - 第二个1动作10%占空比(200us) - 第二个2动作64%占空比(1280us) - 第八个8动作******************************//**********************************ID1=1 ID2=1 ID3=1 -----------第1个ID1=1 ID2=1 ID3=0 -----------第2个ID1=1 ID2=0 ID3=1 -----------第3个ID1=1 ID2=0 ID3=0 -----------第4个ID1=0 ID2=1 ID3=1 -----------第5个ID1=0 ID2=1 ID3=0 -----------第6个ID1=0 ID2=0 ID3=1 -----------第7个ID1=0 ID2=0 ID3=0 -----------第8个**********************************/if(ID1==1&&ID2==1&&ID3==1){pd1=20;pd2=40;pd3=60;pd4=80;pd5=100;pd6=120;pd7=140;pd8=160;} //---第1个if(ID1==1&&ID2==1&&ID3==0){pd1=180;pd2=200;pd3=220;pd4=240;pd5=260;pd6=280;pd7=300;pd8=320;} //---第2个if(ID1==1&&ID2==0&&ID3==1){pd1=340;pd2=360;pd3=380;pd4=400;pd5=420;pd6=440;pd7=460;pd8=480;} //---第3个if(ID1==1&&ID2==0&&ID3==0){pd1=500;pd2=520;pd3=540;pd4=560;pd5=580;pd6=600;pd7=620;pd8=640;} //---第4个if(ID1==0&&ID2==1&&ID3==1){pd1=660;pd2=680;pd3=700;pd4=720;pd5=740;pd6=760;pd7=780;pd8=800;} //---第5个if(ID1==0&&ID2==1&&ID3==0){pd1=820;pd2=840;pd3=860;pd4=880;pd5=900;pd6=920;pd7=940;pd8=960;} //---第6个if(ID1==0&&ID2==0&&ID3==1){pd1=980;pd2=1000;pd3=1020;pd4=1040;pd5=1060;pd6=1080;pd7=1100;pd8=1120;} //---第7个if(ID1==0&&ID2==0&&ID3==0){pd1=1140;pd2=1160;pd3=1180;pd4=1200;pd5=1220;pd6=1240;pd7=1260;pd8=1280;} //---第8个                    ///if(T1_sl>=pd1-10 && T1_sl<pd1+10){dz=1;}  //1else if(T1_sl>=pd2-10 && T1_sl<pd2+10){dz=2;}  //2else if(T1_sl>=pd3-10 && T1_sl<pd3+10){dz=3;}  //3else if(T1_sl>=pd4-10 && T1_sl<pd4+10){dz=4;}  //4else if(T1_sl>=pd5-10 && T1_sl<pd5+10){dz=5;}   //5else if(T1_sl>=pd6-10 && T1_sl<pd6+10){dz=6;}   //6else if(T1_sl>=pd7-10 && T1_sl<pd7+10){dz=7;}    //7else if(T1_sl>=pd8-10 && T1_sl<pd8+10){dz=8;}    //8else{dz1=1;dz=0;}  //新动作//if(dz_f!=dz){dz1=1;dz=0;}         //新动作}}
/***********************************************************************************/
void INT0_Isr() interrupt 0
{if (INT0)                                   //判断上升沿和下降沿{TR0 = 0;if(TF0) {fy1++;TF0=0;}th0_1=TH0;tl0_1=TL0;zy2_1=fy1;TR0 = 1;((BYTE *)&z1)[3] = tl0_1;  //保存本次的捕获值((BYTE *)&z1)[2] = th0_1;((BYTE *)&z1)[1] = zy2_1;((BYTE *)&z1)[0] = 0;}else{TR0 = 0;if(TF0) {fy1++;TF0=0;}th0_1=TH0;tl0_1=TL0;zy2_1=fy1;TR0 = 1;((BYTE *)&z2)[3] = tl0_1;  //保存本次的捕获值((BYTE *)&z2)[2] = th0_1;((BYTE *)&z2)[1] = zy2_1;((BYTE *)&z2)[0] = 0;T1_sl1 = z2 - z1;   //计算两次捕获的差值,即得到时间长度((BYTE *)&T1_sl1)[0] = 0;  }
}

低成本OpenPNP驱动0816飞达相关推荐

  1. Talk | 东京大学博士生刘海洋:多模态驱动谈话动作生成-质量与多样性

    本期为TechBeat人工智能社区第471期线上Talk! 北京时间2月1日(周三)20:00,东京大学情报理工系博士生--刘海洋的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主 ...

  2. 干货!一文读懂人工智能和机器学习有什么关系

    人工智能的演变 符号人工智能 人工智能作为计算机科学的一个分支出现于 20 世纪 50 年代.它的两个主要目标是:1) 通过在计算机上建模和模拟来研究人类智能,以及 2) 通过像人类一样解决复杂问题来 ...

  3. MP-2平面烟雾气体传感器介绍

    MP-2平面烟雾气体传感器简介 MP-2烟雾检测气体传感器采用多层厚膜制造工艺,在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层,封装在金属壳体内.当环境空气中有被检测气体存在时传 ...

  4. MP-4可燃气体传感器介绍

    MP-4可燃气体传感器简介 MP-4可燃气体传感器采用多层厚膜制造工艺,在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层,封装在金属壳体内.当环境空气中有被检测气体存在时传感器电导 ...

  5. Raspberry Pi Pico ADC配合MQ2测量可燃气体浓度

    " MQ-2气体传感器对丙烷.烟雾的灵敏度高,对天然气和其它可燃蒸气的检测也很理想.这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器." 01 - MQ-2可燃气体 ...

  6. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会...

    原标题:机器人操作系统(ROS)入门必备:机器人编程一学就会 ROS经过十几年的发展,已经得到了极大的推广和应用,尤其是在学术界.卡耐基梅隆大学机器人研究所的大部分实验室都是基于ROS编程的,现在所在 ...

  7. 《永磁无刷直流电机技术》笔记

    说明: 该笔记仅仅针对笔者本人知识上的漏洞,内容包括但并不完全包括该书上的重要知识点以及不理解之处,笔记内容会不定期更新,参考教材为机械工业出版社出版的<永磁无刷直流电机技术>,作者:谭建 ...

  8. 烟雾传感器模块资料(MQ-2)

    实物项目案例 1.产品概述         MQ-2 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2).当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增 ...

  9. 谁是房租暴涨的真正推手?

    据新华社8月20日报道,在一些热点城市,每年七八月,租房需求大量释放都会将房租推至季节性"波峰".然而,2018年这一波房租涨势比往年更"凶猛".近日在北京.上 ...

最新文章

  1. Adaboost通俗易懂入门教程
  2. 如何修改控件边框的样式_Excel如何设置表格边框样式,记住这几个关键属性就懂了...
  3. Struts2中的拦截器
  4. 苏格拉底的oracle,苏格拉底的五个经典故事
  5. sql server left join 重复数据原因图
  6. Vue2.x通用条件搜索组件的封装及应用
  7. ULONGLONG乘法分析
  8. 循环语句:For循环
  9. c语言封闭曲线分割平面_餐饮空间设计之平面合理布局
  10. Golang channel 快速入门
  11. redis实现分页排序
  12. ember.js 101 入门教程 第一课
  13. c语言入门级小游戏·飞机(1.0版)| 激发你的编程兴趣(50~100行代码)
  14. 处理minidump文件用到的“工具”的分享
  15. 波形发生器设计c语言文件,波形发生器设计方案.doc
  16. 方框加对勾怎么输入_Word怎么输入对号和方框对勾
  17. 达梦数据库报网络通讯异常排查步骤
  18. 计算机主板复位电路的组成,电脑主板复位电路工作原理
  19. 基于词频求两篇从文件读入的英文文章的相似度
  20. Scaled-YOLOv4: Scaling Cross Stage Partial Network

热门文章

  1. CIO40: IT男之日常工作(点线面体)
  2. Linux之4G模块串口通信
  3. Linux命令 - ps命令
  4. 在计算机桌面如何切换成大图标,win7系统桌面图标怎么设置大小 win7电脑桌面图标大小更改方法...
  5. 接口测试,利用charles修改app的任意字段
  6. 【五、反向代理及其相关配置】
  7. 痛心!华为高管丁耘去世,享年 53 岁
  8. 软件测试工程师书籍介绍(精华)
  9. birthday中文是什么_birthday是什么意思_birthday在线翻译_英语_读音_用法_例句_海词词典...
  10. 15_MySQL存储过程与存储函数