stc8a8k单片机+编码器控制PWM输出测试程序源码

[复制链接]
查看20 | 回复0 | 2021-7-12 00:58:25 | 显示全部楼层 |阅读模式

  1. #include "stc8.h"
  2. #include "intrins.h"

  3. //测试工作频率为11.0592MHz

  4. //sfr          INTCLKO  = 0x8f;
  5. #define      EX2        0x10
  6. #define      EX3        0x20
  7. #define      EX4        0x40

  8. #define    CYCLE       30000

  9. int val = 0;
  10. int val1 = 200;
  11. int val2 = 5;
  12. bit dir = 0;
  13. bit ccw = 0;
  14. bit cw  = 0;

  15. void PWM_init(void);
  16. void exint_init(void);
  17. /*****************************************************************/
  18. void Delay100us()                //@11.0592MHz
  19. {
  20.         unsigned char i, j;

  21.         _nop_();
  22.         _nop_();
  23.         i = 2;
  24.         j = 15;
  25.         do
  26.         {
  27.                 while (--j);
  28.         } while (--i);
  29. }

  30. void Delay500us()                //@11.0592MHz
  31. {
  32.         unsigned char i, j;

  33.         _nop_();
  34.         _nop_();
  35.         i = 6;
  36.         j = 93;
  37.         do
  38.         {
  39.                 while (--j);
  40.         } while (--i);
  41. }
  42. /**********************************************************************/
  43. void exint_init()       //外部中断初始化
  44. {
  45.               //   IT0 = 0; //使能INT0上升沿和下降沿中断

  46.          IT0 = 1;  //使能INT0下降沿中断

  47.          EX0 = 1; //使能INT0中断


  48.        //  IT1 = 0; //使能INT1上升沿和下降沿中断

  49.       // IT1 = 1;  //使能INT1下降沿中断

  50.       //   EX1 = 1; //使能INT1中断


  51.          INTCLKO  = EX2; //使能INT2下降沿中断

  52.          //INTCLKO |= EX3; //使能INT3下降沿中断

  53.          //INTCLKO |= EX4; //使能INT4下降沿中断

  54.         // EA = 1;
  55. }


  56. void PWM_init()     //PWM初始化设置
  57. {
  58.           P_SW2  = 0x80;
  59.     PWMCKS = 0x00; // PWM时钟为系统时钟

  60.     PWMC   = CYCLE; //设置PWM周期为

  61.     PWM0T1 = 0x0000;
  62.     PWM0T2 = 0x0001;
  63.     //PWM0CR = 0x88; //使能PWM0-P1.0输出                              
  64.     //PWM0CR = 0x80; //使能PWM0-P2.0输出               
  65.     PWM0CR = 0x90; //使能PWM0-P6.0输出
  66.                
  67.       
  68.           PWM1T1= 0x0000;
  69.     PWM1T2= 0x0001;
  70.     //PWM1CR = 0x88; //使能PWM1-P1.1输出                       
  71.     //PWM1CR = 0x80; //使能PWM1-P2.1输出               
  72.     PWM1CR = 0x90; //使能PWM1-P6.1输出

  73.           PWM2T1 = 0x0000;
  74.     PWM2T2 = 0x0001;
  75.                 //PWM2CR = 0x88; //使能PWM2-P1.2输出      
  76.     //PWM2CR = 0x80; //使能PWM2-P2.2输出               
  77.     PWM2CR = 0x90; //使能PWM2-P6.2输出

  78.           PWM3T1 = 0x0000;
  79.     PWM3T2 = 0x0001;
  80.     //PWM3CR = 0x88; //使能PWM2-P1.3输出                       
  81.     //PWM3CR = 0x80; //使能PWM2-P2.3输出               
  82.     PWM3CR = 0x90; //使能PWM2-P6.3输出

  83.           PWM4T1 = 0x0000;
  84.     PWM4T2 = 0x0001;
  85.                 //PWM4CR = 0x88; //使能PWM4-P1.4输出      
  86.     //PWM4CR = 0x80; //使能PWM4-P2.4输出               
  87.     PWM4CR = 0x90; //使能PWM4-P6.4输出
  88.                
  89.           PWM5T1 = 0x0000;
  90.     PWM5T2 = 0x0001;
  91.                 //PWM5CR = 0x88; //使能PWM5-P1.5输出
  92.     //PWM5CR = 0x80; //使能PWM5-P2.5输出               
  93.     PWM5CR = 0x90; //使能PWM5-P6.5输出
  94.                
  95.           PWM6T1 = 0x0000;
  96.     PWM6T2 = 0x0001;
  97.                 //PWM6CR = 0x88; //使能PWM5-P1.6输出
  98.     //PWM6CR = 0x80; //使能PWM6-P2.6输出               
  99.     PWM6CR= 0x90; //使能PWM6-P6.6输出
  100.                
  101.           PWM7T1 = 0x0000;
  102.     PWM7T2 = 0x0001;
  103.                 //PWM7CR = 0x88; //使能PWM7-P1.7输出
  104.     //PWM7CR = 0x80; //使能PWM7-P2.7输出               
  105.     PWM7CR = 0x90; //使能PWM7-P6.7输出
  106.                
  107.     P_SW2 = 0x00;

  108.     PWMCR = 0xc0; //启动PWM模块

  109.     //EA = 1;
  110. }               
  111. /*************************************************************/               
  112. void main()
  113. {
  114.          

  115. //      P0M0 = 0x00;   P0M1 = 0x00;                             //设置P0.0~P0.7为双向口模式      
  116. //      P1M0 = 0xff;   P1M1 = 0x00;                             //设置P1.0~P1.7为推挽输出模式      
  117. //      P2M0 = 0x00;   P2M1 = 0xff;                             //设置P2.0~P2.7为高阻输入模式      
  118. //      P3M0 = 0xff;   P3M1 = 0xff;                             //设置P3.0~P3.7为开漏模式      
  119. //      P4M0 = 0xff;   P4M1 = 0xff;                             //设置P4.0~P4.7为开漏模式               
  120. //      P5M0 = 0xff;   P5M1 = 0xff;                             //设置P5.0~P5.7为开漏模式               
  121. //      P6M0 = 0xff;   P6M1 = 0xff;                             //设置P6.0~P6.7为开漏模式               
  122. //      P7M0 = 0xff;   P7M1 = 0xff;                             //设置P7.0~P7.7为开漏模式
  123.       
  124.       
  125.             exint_init();
  126.             PWM_init();
  127.       
  128.                         EA = 1;        
  129.       
  130.       PCON = 0x02;  //MCU进入掉电模式               
  131.                                  
  132.       _nop_(); //掉电唤醒后立即进入中断服务程序

  133.       _nop_();

  134.      while (1)

  135.   {      
  136.                         if(P36==0)
  137.          
  138.         {
  139.            val+=val2;
  140.                                         Delay500us();
  141.            if (val >=30000) val=0 ;
  142.        }
  143.    }
  144. }

  145. /***********************************************************************/

  146. void PWM_Isr() interrupt 22
  147. {
  148.       //static bit dir = 1;
  149.       //static int val = 0;

  150.     if (PWMCFG & 0x80)

  151.                 {
  152.         PWMCFG &= ~0x80; //清中断标志
  153.                                        
  154.        _push_(P_SW2);
  155.                                        
  156.        P_SW2 |= 0x80;
  157.                                        
  158.        PWM0T2 = val;
  159.                          PWM1T2 = val;
  160.                          PWM2T2 = val;
  161.                          PWM3T2 = val;
  162.                          PWM4T2 = val;
  163.                          PWM5T2 = val;
  164.                          PWM6T2 = val;
  165.                          PWM7T2 = val;
  166.                                        
  167.        _pop_(P_SW2);
  168.     }
  169. }
  170.                  
  171.          
  172. /***********************************************************************/                 
  173. void INT0_Isr() interrupt 0   
  174. {
  175.      if((P32==0)&&(P33==1)) ccw=1,cw=0;
  176.            else ccw=0;

  177.      if((P32==0)&&(P33==0)) cw=1,ccw=0;
  178.                  else  cw=0;
  179.       
  180.                                 if(ccw==1)                 
  181.         {
  182.            val+=val1;
  183.            if (val >=30000) val=0 ;
  184.         }
  185.                         
  186.         if(cw==1)
  187.         {
  188.                                   val-=val1;
  189.           if (val <=0) val=30000;
  190.         }
  191. }


  192. /*
  193. void INT1_Isr() interrupt 2   
  194. {

  195. }
  196. */


  197. void INT2_Isr() interrupt 10   

  198. {        
  199.        P50=!P50;
  200.                          P51=!P51;
  201. }

  202.       
  203. /*
  204.       
  205. void INT3_Isr() interrupt 11   
  206.   {
  207.      P60 = !P60; //测试端口
  208.   }
  209.       
  210.       

  211. void INT4_Isr() interrupt 16   
  212.    {
  213.      P60 = !P60; //测试端口
  214.    }
  215. */
复制代码


回复

使用道具 举报

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

本版积分规则