国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

stc8a8k單片機+編碼器控制PWM輸出測試程序源碼

[復(fù)制鏈接]
樓主
coolice 發(fā)表于 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初始化設(shè)置
  57. {
  58.           P_SW2  = 0x80;
  59.     PWMCKS = 0x00; // PWM時鐘為系統(tǒng)時鐘

  60.     PWMC   = CYCLE; //設(shè)置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;                             //設(shè)置P0.0~P0.7為雙向口模式      
  116. //      P1M0 = 0xff;   P1M1 = 0x00;                             //設(shè)置P1.0~P1.7為推挽輸出模式      
  117. //      P2M0 = 0x00;   P2M1 = 0xff;                             //設(shè)置P2.0~P2.7為高阻輸入模式      
  118. //      P3M0 = 0xff;   P3M1 = 0xff;                             //設(shè)置P3.0~P3.7為開漏模式      
  119. //      P4M0 = 0xff;   P4M1 = 0xff;                             //設(shè)置P4.0~P4.7為開漏模式               
  120. //      P5M0 = 0xff;   P5M1 = 0xff;                             //設(shè)置P5.0~P5.7為開漏模式               
  121. //      P6M0 = 0xff;   P6M1 = 0xff;                             //設(shè)置P6.0~P6.7為開漏模式               
  122. //      P7M0 = 0xff;   P7M1 = 0xff;                             //設(shè)置P7.0~P7.7為開漏模式
  123.       
  124.       
  125.             exint_init();
  126.             PWM_init();
  127.       
  128.                         EA = 1;        
  129.       
  130.       PCON = 0x02;  //MCU進入掉電模式               
  131.                                  
  132.       _nop_(); //掉電喚醒后立即進入中斷服務(wù)程序

  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; //清中斷標(biāo)志
  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. */
復(fù)制代碼


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

本版積分規(guī)則

手機版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 02:12

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表