找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7131|回复: 5
收起左侧

STC12C5A60S2片内PWM按键控制加减

  [复制链接]
ID:79544 发表于 2015-11-14 17:05 | 显示全部楼层 |阅读模式
  1. /*****************************************************
  2.         功能:通过按键控制STC12C5A60S2内部PWM通过
  3.                 P1.3和P1.4输出PWM控制LED并用数码管显示
  4.         单片机:STC12C5A60S2
  5.         晶振:11.0592M
  6.         作者:苏义江改编自网络
  7.         时间:2015-7-22
  8. ***************************************************/
  9. #include"12C5A.h"

  10. #define uint unsigned int
  11. #define uchar unsigned char  
  12. uchar code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  13.                                         0x82,0xf8,0x80,0x90,0x88,0x83,
  14.                                         0xc6,0xa1,0x86,0x8e,0x89,0x8c};

  15. sbit wei=P0^6;
  16. sbit duan=P0^7;
  17. sbit jiaPWM=P1^0;//通过P10低电平(按键)加PWM占空比
  18. sbit jianPWM=P1^1; //按键P11低电平 减PWM占空比
  19. sbit In1=P0^0;
  20. sbit In2=P0^1;
  21. sbit In3=P0^2;
  22. sbit In4=P0^3;

  23. void DelayMs(uchar ms);  
  24. void init_PWM(); //PWM 初始化
  25. void PWM0_change(uchar type,uchar change);//PWM调整函数
  26. void PWM0_set(uchar empty); //直接付PWM的值
  27. //stc10f系列 单周期指令的ms级延时
  28. void DelayMs(uchar ms) //这个延时可能不对,非关键部分,可自己修改
  29. {        
  30.         uint i;  while(ms--)  
  31.         {     
  32.                 for(i = 0; i < 850; i++);
  33.         }
  34. }
  35. void init_PWM()
  36. {     
  37.         CCON=0X00;   
  38.         CH=0;   
  39.         CL=0;
  40. //时钟分频也就是输出的频率。 0X00:以系统时钟/12 为时钟源,0X02:系统时钟/2,0x08:系统时钟     
  41.         CMOD=0X02;      
  42. //起始占空比,0XC0:占空比为25%,0X80:占空比为50%,0X40:占空比为75%   
  43.         PWM0_set(0X80); //
  44.         PCA_PWM1=0x00;
  45.         PCA_PWM0=0x00; //控制占空比的第九位为0   
  46. //0X42:8位PWM P1.3输出, P1.4输出,无中断;0X53:8位PWM输出,下降沿产生中断;
  47. //0X63:上升沿产生中断;0X73:跳变沿产生中断
  48.         CCAPM0=0X42;  
  49.         CCAPM1=0X42;
  50.         CR=1;          //计时器开始工作
  51. }
  52. void PWM0_set(uchar empty)  //直接设置占空比
  53. {      
  54.         CCAP0L=empty;   
  55.         CCAP0H=empty;
  56.         CCAP1L=empty;   
  57.         CCAP1H=empty;
  58. }
  59. //占空比调节函数
  60. void PWM0_change(uchar type,uchar change) //type=0减占空比,1增加占空比        
  61. //change: 0X0C 约5%,0X05约2%
  62. {        
  63.         if(type==0)   
  64.         {      
  65.                 if(CCAP0L<0XE6)   //<90%   
  66.                 {      
  67.                         CCAP0L+=change;     
  68.                           CCAP0H+=change;  
  69.                         CCAP1L+=change;     
  70.                           CCAP1H+=change;
  71.                   }          
  72.          }   
  73. else   
  74. {   
  75.           if(CCAP0L>0X19)  //>10%      
  76.         {      
  77.                 CCAP0L-=change;     
  78.                   CCAP0H-=change;  
  79.                 CCAP1L-=change;     
  80.                   CCAP1H-=change;
  81.         }        
  82. }

  83. }
  84. void display()
  85. {       
  86.         uchar bai,shi,ge;
  87.         bai=CCAP0L/100;
  88.         shi=CCAP0L/10%10;
  89.         ge=CCAP0L%10;
  90.         wei=1;
  91.         P2=0xfe;
  92.         wei=0;
  93.         duan=1;
  94.         P2=table[bai];
  95.         DelayMs(500);
  96.          P2=0xff;

  97.         wei=1;
  98.         P2=0xfd;
  99.         wei=0;
  100.         duan=1;
  101.         P2=table[shi];
  102.         DelayMs(500);
  103.          P2=0xff;

  104.         wei=1;
  105.         P2=0xfb;
  106.         wei=0;
  107.         duan=1;
  108.         P2=table[ge];
  109.         DelayMs(500);
  110.          P2=0xff;
  111. }
  112. void main()
  113. {   
  114.         init_PWM();      //初始化,PWM输出  
  115.           while(1)   
  116.           {  
  117.             if(jiaPWM==0) //按键减PWM占空比
  118.                   {   
  119.                             DelayMs(500);  //按键消抖   
  120.                            while(jiaPWM==0); //按键释放才跳出执行下一步   
  121.                         PWM0_change(1,0X0c); //change: 0X0C 约5%,0X05约2%
  122.                         display();                                
  123.                   }   
  124.                   if(jianPWM==0)//按键 增 PWM占空比
  125.                   {   
  126.                            DelayMs(500);  
  127.                      while(jianPWM==0);   
  128.                         PWM0_change(0,0X0c); //change: 0X0C 约5%,0X05约2%  
  129.                         display();
  130.                   }                        
  131.            }
  132. }
  133. //一下程序P13口和P14口直接赋PWM值,控制程序速度,直接给a和b赋值

  134. //      pwm初始化        */
  135. /*void initpwm()   
  136. {
  137.      CCAPM0=0x42;   //使能比较器,启动脉宽调节模式  
  138. //控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)
  139.         CCAP0L=0x50;      
  140.         CCAP0H=0x50;
  141.         //CL溢出时,CCAP0H自动装入CCAP0L   
  142.         CCAPM1=0x42;   //PWM1同上
  143.     CCAP1L=0x50;
  144.     CCAP1H=0x50;
  145.     CR=1;      //PCA计数启动
  146. }
  147. // --------     调速     ---------   
  148. void format(uchar a,uchar b)
  149. {
  150.     CCAP0L=a;//控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)   
  151.         CCAP0H=a;//CL溢出时,CCAP0H自动装入CCAP0L
  152.           CCAP1L=b;
  153.           CCAP1H=b;      
  154. }
  155. // --------     后退     ---------      
  156. void turnback(uchar a,uchar b)   
  157. {
  158.      format(a,b);
  159.      In1=0;In2=1;In3=0;In4=1;   
  160. }
  161. // --------     前进     ---------      
  162. void run(uchar a,uchar b)   
  163. {
  164.       format(a,b);
  165.      In1=1;In2=0;In3=1;In4=0;   
  166. }
  167. // --------     停止     ---------   
  168. void stop()   
  169. {
  170.      In1=1;In2=1;In3=1;In4=1;   
  171. }*/
复制代码


回复

使用道具 举报

ID:67336 发表于 2015-11-14 19:31 | 显示全部楼层
有难度。看不懂
回复

使用道具 举报

ID:79544 发表于 2015-11-15 13:27 | 显示全部楼层
STC单片机自带输出PWM功能。用PWM可以控制灯的渐亮和渐暗,也可以控制小车电机转动快慢。
回复

使用道具 举报

ID:144550 发表于 2016-10-26 15:17 | 显示全部楼层
谢谢楼主,可以用来研究下STC12C5A60S2的pwm。
回复

使用道具 举报

ID:103094 发表于 2016-10-31 21:43 | 显示全部楼层
头文件在KEIL编译器找不到,这怎么解决呢
回复

使用道具 举报

ID:79544 发表于 2016-11-5 12:45 | 显示全部楼层
45555mkkl 发表于 2016-10-31 21:43
头文件在KEIL编译器找不到,这怎么解决呢

论坛里有在keil里面添加STC头文件。你找一找
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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