找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2673|回复: 1
打印 上一主题 下一主题
收起左侧

STC15F2K60S2单片机可调脉冲数反应式步进电机驱动器程序

[复制链接]
跳转到指定楼层
楼主
ID:168165 发表于 2019-3-21 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源码:

  1. #include <STC15.h>
  2. #include <INTRINS.h>
  3. sbit PWMOUT = P3^7;
  4. sbit CHFWD = P3^6;

  5. unsigned char HighRH = 0; //高电平重载值的高字节
  6. unsigned char HighRL = 0; //高电平重载值的低字节
  7. unsigned char LowRH = 0; //低电平重载值的高字节
  8. unsigned char LowRL = 0; //低电平重载值的低字节
  9. void Delay500ms();
  10. void ConfigPWM(unsigned int fr, unsigned char dc);
  11. void ClosePWM();
  12. void Delay20ms();                //@6.000MHz
  13. void DigDisplay();
  14. unsigned int i;
  15. typedef unsigned int u16;   
  16. typedef unsigned char u8;
  17. unsigned int cou;
  18. u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳

  19. void delay(u16 i)
  20. {
  21.         while(i--);        
  22. }

  23. void main(){
  24.                                 AUXR &= 0X7f;//12T
  25.                                 P3M1 &= 0x00;
  26.                                 P3M0 |= 0xc0;//强推挽
  27.                                 cou = 1260;
  28.                                 IT0 = 1;
  29.                                 EX0 = 1;
  30.                                 IT1 = 1;
  31.                                 EX1 = 1;        
  32.                                 EA = 1; //开总中断

  33. while (1){
  34. ConfigPWM(15, 50); //频率 15Hz,占空比 50%
  35. while(i <= 45){DigDisplay();};
  36. i = 0;
  37. ClosePWM();
  38. ConfigPWM(20, 50); //频率 20Hz,占空比 50%
  39. while(i <= 60){DigDisplay();};
  40. i = 0;
  41. ClosePWM();
  42. ConfigPWM(36, 50); //频率 55Hz,占空比 50%
  43. while(i <= cou){DigDisplay();};
  44. i = 0;
  45. ClosePWM(); //关闭 PWM
  46. ConfigPWM(20, 50); //频率 20Hz,占空比 50%
  47. while(i <= 60){DigDisplay();};
  48. i = 0;
  49. ClosePWM();
  50. ConfigPWM(15, 50); //频率 15Hz,占空比50%
  51. while(i <= 45){DigDisplay();};
  52. i = 0;
  53. ClosePWM(); //关闭 PWM,相当于占空比 100%
  54. CHFWD = ~CHFWD;
  55. Delay500ms();
  56. }
  57. }
  58. /* 数码管显示*/
  59. void DigDisplay()
  60. {
  61.         u16 s;
  62.         for(s=0;s<4;s++)
  63.         {
  64.                 switch(s)      
  65.                 {
  66.                         case(0):
  67.                                 P2 = 0xfe;P0 = smgduan[0]; break;
  68.                         case(1):
  69.                                                                                                                                 P2 = 0xfd;P0 = smgduan[(cou/10)%10];  break;
  70.                         case(2):
  71.                                 P2 = 0xfb;P0 = smgduan[(cou/100)%10];  break;
  72.                         case(3):
  73.                                 P2 = 0xf7;P0 = smgduan[(cou/1000)];  break;
  74.                 }
  75.                 delay(3);     
  76.                 P0=0xFF;
  77.         }
  78. }

  79. void Delay27ms()                //@6.000MHz
  80. {
  81.         unsigned char i, j, k;

  82.         _nop_();
  83.         _nop_();
  84.         i = 1;
  85.         j = 158;
  86.         k = 145;
  87.         do
  88.         {
  89.                 do
  90.                 {
  91.                         while (--k);
  92.                 } while (--j);
  93.         } while (--i);
  94. }

  95. void Delay500ms()                //@6.000MHz
  96. {
  97.         unsigned char i, j, k;
  98.         
  99.         _nop_();
  100.         _nop_();
  101.         i = 12;
  102.         j = 103;
  103.         k = 57;
  104.         PWMOUT = 0;
  105.         do
  106.         {        
  107.                 do
  108.                 {        DigDisplay();
  109.                         while (--k);
  110.                 } while (--j);
  111.         } while (--i);
  112. }

  113. /* 配置并启动 PWM,fr-频率,dc-占空比 */
  114. void ConfigPWM(unsigned int fr, unsigned char dc){
  115. unsigned int high, low;
  116. unsigned long tmp;

  117. tmp = (6000000/12) / fr; //计算一个周期所需的计数值
  118. high = (tmp*dc) / 100; //计算高电平所需的计数值
  119. low = tmp - high; //计算低电平所需的计数值
  120. high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
  121. low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时

  122. HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
  123. HighRL = (unsigned char)high;
  124. LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
  125. LowRL = (unsigned char)low;

  126. TMOD &= 0x0F; //清零 T1 的控制位
  127. TMOD |= 0x10; //配置 T1 为模式 1
  128. TH1 = HighRH; //加载 T1 重载值
  129. TL1 = HighRL;
  130. ET1 = 1; //使能 T1 中断
  131. TR1 = 1; //启动 T1
  132. PWMOUT = 1; //输出高电平
  133. }
  134. /* 关闭 PWM */
  135. void ClosePWM(){
  136. TR1 = 0; //停止定时器
  137. ET1 = 0; //禁止中断
  138. PWMOUT = 1; //输出高电平
  139. }
  140. void Add() interrupt 0
  141. {
  142.         EX0 = 0;
  143.         Delay27ms();
  144.         if(P3^2 == 0){
  145.         cou = cou + 10;
  146.         }
  147.         //while(!P3^2);
  148.         EX0 = 1;
  149. }
  150. void Sub() interrupt 2
  151. {
  152.         EX1 = 0;
  153.         Delay27ms();
  154.         if(P3^3 == 0){
  155.         cou = cou - 10;
  156.         }
  157.         //while(!P3^3);
  158.         EX1 = 1;
  159. }
  160. /* T0 中断服务函数,产生 PWM 输出 */
  161. void InterruptTimer1() interrupt 3{
  162. if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
  163. TH1 = LowRH;
  164. TL1 = LowRL;
  165. i++;
  166. PWMOUT = 0;
  167. //DigDisplay();
  168. }else{ //当前输出为低电平时,装载高电平值并输出高电平
  169. TH1 = HighRH;
  170. TL1 = HighRL;
  171. PWMOUT = 1;
  172. //DigDisplay();
  173. }
  174. }
复制代码

huasheng_3jieh.rar

33.87 KB, 下载次数: 38, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:465279 发表于 2020-6-10 22:26 | 只看该作者
来学习的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表