找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机输出spwm源码 实测可行

[复制链接]
跳转到指定楼层
楼主
ID:226033 发表于 2017-8-9 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实测可行,stc12,13,14输出。
所有资料51hei提供下载:
swpm输出.docx (12.19 KB, 下载次数: 35)


单片机源程序如下:
  1. #include<STC12C5A60S2.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91
  5. ,80,69,59,50,42,34,27,20,15,10,6,3,1,0,
  6.      0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,
  7. 182,196,211,226,240,255
  8.      }; // 反正弦变化
  9. int index=0;
  10. sbit P13=P1^3;        //PCA模块0输出
  11. sbit P14=P1^4;        //PCA模块1输出

  12. bit zf=0;           //前后半周期标志
  13. void init_pca(void)//pca计数器初始化函数
  14. {
  15. CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能
  16. CCON=0x00;
  17. CCAPM0=0x42;//8位PWM输出,无中断
  18. CCAPM1=0x42;//8位PWM输出,无中断
  19. CL=0x00;//清零pca计数器
  20. CH=0x00;
  21. CCAP0L=pwm[50];    //初始化spwm输出的占空比!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  22. CCAP0H=pwm[0];
  23. CCAP1L=pwm[0];    //初始化spwm输出的占空比
  24. CCAP1H=pwm[0];
  25. CR=1;//运行pca计数器
  26. }
  27. void init_timer(void)//计数器初始化函数
  28. {
  29. TMOD= 0x01; //计数器0工作在方式模式1
  30. TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K
  31. TL0 = 0xFF;    //T1的计数值低位
  32. AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592M
  33. ET0 = 1; //开中计数器0断
  34. TR0 = 1; //开启计数器0
  35. }
  36. void int_timer0(void) interrupt 1//计数器1中断函数
  37. {
  38. TH0=0xF7; //重装计数值
  39. TL0=0xFF;
  40. index++; //查表索引
  41.   
  42. if(index==54) //半周期转换,每半周期分为60份
  43.   {
  44.      CR=0;    //关PCA计数
  45.      index=0;
  46.      zf=~zf;  //半周期标志,zf=0,前半周期,zf=1,后半周期  
  47.         if(zf)   //设置后半周期
  48.         {
  49.            P13=0;                    
  50.         CCAPM0=0X00;   //关闭模块0
  51.         CCAPM1=0X42;   //设置模块1工作方式
  52.          }
  53.         else               //设置前半周期
  54.          {
  55.            P14=0;
  56.         CCAPM1=0X00;   //关闭模块1
  57.         CCAPM0=0X42;   //设置模块0工作方式
  58.          }
  59.       CR=1;           //开PCA计数               
  60.   }
  61.   
  62. if(zf==0)          //将下一小格的占空比赋给相应值
  63.   {
  64. CCAP0H=pwm[index];
  65.   }
  66. else
  67.   {
  68.     CCAP1H=pwm[index];
  69. }
  70. }
  71. void main(void)
  72. {
  73. P14=0;
  74. P13=0;
  75. EA=1;//开总中断
  76. init_pca();
  77. init_timer();
  78. while(1)//主循环
  79. {//彩灯程序  和1602显示程序
  80. }
  81. }
复制代码




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

使用道具 举报

沙发
ID:360137 发表于 2019-4-14 22:30 | 只看该作者
楼主在吗?问个问题
计数器0的溢出为PCA计数器的时钟源,8位PWM的周期则为256*时钟源周期,也就是说PWM的周期大小是计数器0的计数周期的256倍,那岂不是和注释的相矛盾?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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