芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

51单片机制作舵机的程序单片机解密

  1. 单片机解密/******************************************/
  2. //
  3. // 主频12MHz  !!!!
  4. //
  5. /******************************************/
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. // 定义常用数据类型别名
  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. #define u8 unsigned char
  12. #define u16  unsigned int
  13. #define int16 int
  14. // 定义PID参数
  15. #define KP 50  // 比例系数,可调整
  16. #define KI 10  // 积分系数,可调整
  17. #define KD 5   // 微分系数,可调整
  18. // 积分限幅
  19. #define INTEGRAL_LIMIT 1000
  20. //* STC15W408AS寄存器补充
  21. sfr AUXR1 = 0XA2;
  22. sfr AUXR = 0X8E;
  23. sfr TH2 = 0XD6;
  24. sfr TL2 = 0XD7;
  25. sfr P4 = 0xC0;
  26. sfr P5 = 0xC8;
  27. sfr SPSTAT = 0xCD;
  28. sfr SPCTL = 0xCE;
  29. sfr SPDAT = 0xCF;
  30. sfr P1M1 = 0x91;
  31. sfr P1M0 = 0x92;
  32. sfr P2M1 = 0x95;
  33. sfr P2M0 = 0x96;
  34. sfr P3M1 = 0xB1;
  35. sfr P3M0 = 0xB2;
  36. sfr P5M1 = 0xC9;
  37. sfr P5M0 = 0xCA;
  38. // 定时器2
  39. sfr T2H = 0xD6;
  40. sfr T2L = 0xD7;
  41. sfr IE2 = 0xAF;
  42. // ADC
  43. sfr ADC_CONTR = 0xBC;        // 带AD系列
  44. sfr ADC_RES = 0xBD;        // 带AD系列
  45. sfr ADC_RESL = 0xBE;        // 带AD系列
  46. sfr P1ASF = 0x9D;
  47. sfr PCON2 = 0x97;
  48. // ADC控制位定义
  49. #define ADC_POWER        0x80// ADC电源控制位
  50. #define ADC_FLAG        0x10// ADC完成标志
  51. #define ADC_START        0x08// ADC起始控制位
  52. #define ADC_SPEEDLL        0x00// 540个时钟转换一次
  53. #define ADC_SPEEDL        0x20// 360时钟
  54. #define ADC_SPEEDH        0x40// 180时钟
  55. #define ADC_SPEEDHH        0x60// 90时钟
  56. // 电机控制引脚
  57. sbit IA = P3^7;
  58. sbit IB = P3^6;
  59. // PPM信号相关变量
  60. u8 PPMCnt = 0;  // 收到PPM脉冲的次数
  61. bit PPMOK = 0;  // 是否收到一个PPM脉冲
  62. u16 time;       // PPM的高电平计数
  63. // ADC采样相关变量
  64. u16 ad[10];     // 存放10个ad数值的数组
  65. u16 ad1 = 0;    // 舵机的电位器的ad值
  66. u16 ad0 = 0;    // 舵机的电位器应该达到的AD值
  67. // 电机运行时间
  68. u8 t1;          // 电机运行持续毫秒数
  69. // PID相关变量
  70. int16 integral = 0; // 积分项
  71. int16 lastError = 0; // 上一次的误差
  72. int16 error;
  73. int16 derivative;
  74. /***************/
  75. /* 延时函数    */
  76. /***************/
  77. // 1ms延时函数
  78. void Delay1ms()                //@12.000MHz
  79. {
  80.      unsigned char i, j;
  81.      i = 12;
  82.      j = 169;
  83.      do
  84.      {
  85.          while (--j);
  86.      } while (--i);
  87. }
  88. // 毫秒级延时函数
  89. void delay_ms(unsigned char i)
  90. {
  91.      while (i--)
  92.      {
  93.          Delay1ms();
  94.      }
  95. }
  96. // 获取10位精度的ADC值
  97. u16 Get_ADC10bitResult(u8 channel)
  98. {
  99.      u16 adc;
  100.      if (channel > 7)        return 1024;        // 错误,返回1024, ADC通道号0~7,不能超过7        
  101.      ADC_RES = 0; // 高位ADC清零
  102.      ADC_RESL = 0; // 低位ADC清零
  103.      ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | channel; // 打开指定通道的ADC转换
  104.      _nop_();
  105.      _nop_();
  106.      _nop_();
  107.      _nop_(); // 对ADC_CONTR操作后要4T之后才能访问
  108.      while (!(ADC_CONTR & ADC_FLAG)); // 等待ADC转换完成
  109.      ADC_CONTR &= ~ADC_FLAG;        // ADC_FLAG手工清0,关闭 ADC
  110.      adc = ADC_RES;      // 得到高8位
  111.      adc <<= 2;
  112.      adc += ADC_RESL;     // 得到低2位
  113.      return adc;
  114. }
  115. // 定时器0初始化函数 当INT0也就是P3.2脚为高,定时器0才开始运行
  116. void Timer0Init(void)                //12.000MHz
  117. {
  118.      AUXR &= 0x7F;                // 定时器时钟12T模式
  119.      TMOD = 0x09;                // 16位不可重装模式        当INT0=1和TR0=1时,定时器0才能运行
  120.      TL0 = 0x00;                // 设置定时初值
  121.      TH0 = 0x00;                // 设置定时初值
  122.      TF0 = 0;                // 清除TF0标志
  123.      TR0 = 1;   // 定时器0开始计时
  124.      ET0 = 1;   // 允许ET0中断
  125.      EA = 1;           // 允许全部中断
  126. }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信