找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4733|回复: 1
收起左侧

STC单片机的PWM,AD采集测试程序

[复制链接]
ID:103513 发表于 2016-1-17 04:00 | 显示全部楼层 |阅读模式

  1. /*******************************************************************
  2. *工程名称: STC的PWM,AD采集测试
  3. *创建人:  张大伟
  4. *创建时间: 2012年5月19号
  5. *隶属模块: STC.C
  6. *产考资料:STC手册
  7. *模块说明: STC8位PWM测试,上电以后LED出现呼吸灯效应。 采集一路电压,设定3个稳压值分别是1V,3.3V ,4.2V,让单片机通过AD采集后
  8. 驱动PWM0控制稳压电路出现一个设定值。稳压电路用一个采样电阻连接到AD的采样端这样形成一个闭环系统、!
  9. ********************************************************************/
  10. #include <STC12C52.H>
  11. /*******************************************************************
  12. *函数名称:
  13. *入口参数:
  14. *出口参数:
  15. *函数说明: 全局变量和位定义     
  16. ********************************************************************/
  17. #define unchar unsigned char
  18. #define unint unsigned int
  19. #define DUTYCYCLE(x)   (256-(128*x/50))//占空比计算公式256-(80/x=50/128)=XX,  ** 占空比**
  20. #define PDXBIT(x)           (0x01<<x)
  21. #define REGBIT(x)           (0x01<<x)
  22. unchar  yi=1;
  23. unchar  er=0;

  24. sbit KEY1=P3^4;
  25. unint CYCLE;
  26. /*******************************************************************
  27. *函数名称: void Delay(unint x)
  28. *入口参数: x:延时长度
  29. *出口参数:
  30. *函数说明: 不精确的延时
  31. ********************************************************************/
  32. void Delay(unint x)    //延时子函数      
  33. {
  34.    unint y;      //定义一个Y变量
  35.    for(;x>0;x--)    //如果X大于0,那么X就减1.
  36.     for(y=500;y>0;y--);//给Y赋值为500,当Y大于0那么Y就减1.  *******注意前面的for的语句后面没有引号,那么会把后面的FOR语句
  37. //也认为是他的内部语句。也就是说X执行一次那么Y就得执行500次。
  38. }
  39. /*******************************************************************
  40. *函数名称: void MainInt()      
  41. *入口参数:
  42. *出口参数:
  43. *函数说明: 主函数初始化
  44. ****************************** **************************************/
  45. void MainInt()        //
  46. {      
  47.     //P4SW|==REGBIT(4);//将P4口设置为输出
  48.         //AUXR1|=REGBIT(6);//将PWM0和PWM1从P1.3/P1.4移到P4.2/P4.3
  49.         P1M1=0x00;
  50.         P1M0|=REGBIT(4)|REGBIT(3);//设置P1.4,3口为强推挽输出
  51.         CMOD|=REGBIT(1);//选择SYSCLK为PWM的时钟源//控制PWM波的频率
  52.         CCAPM0|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM0
  53.         CCAPM1|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM1
  54.         CL=0x00;//计数器清零
  55.         CH=0x00;
  56.         CCAP0L=0x00;//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
  57.         CCAP0H=0x00; //   CCAPOL  CCAPOH  为PWM0的最高占空比和最低占空比。
  58.         CCAP1L=0x00; //猜也猜到了这个是PWM1的低占空比。
  59.         CCAP1H=0x00; //这个也是我猜的哈哈PWM1的高占空比。
  60.         CCON|=REGBIT(6);//启动PWM
  61. }
  62. /*******************************************************************
  63. *函数名称: void KeyScan(void)      
  64. *入口参数:
  65. *出口参数:
  66. *函数说明: 按键检查函数,用来调节PWM的占空比0%-100%
  67. ********************************************************************/
  68. void KeyScan(void)
  69. {
  70.    if(KEY1==0)
  71.     {
  72.           Delay(500);
  73.           if(KEY1==0);   
  74.           CYCLE+=1;
  75.           if(CYCLE>100)
  76.            CYCLE=0;
  77.       CCAP0L=DUTYCYCLE(CYCLE);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
  78.       CCAP0H=DUTYCYCLE(CYCLE);//占空比计算公式256-(80/x=50/128)=XX,
  79.       CCAP1L=DUTYCYCLE(CYCLE);
  80.       CCAP1H=DUTYCYCLE(CYCLE);
  81.         }
  82. }
  83. /*******************************************************************
  84. *函数名称: void main(void)
  85. *入口参数:
  86. *出口参数:
  87. *函数说明: 主函数
  88. ********************************************************************/
  89. void main(void)
  90. {
  91.    MainInt();
  92.     CYCLE=100;
  93.    while(1)
  94.     {
  95. //****************下面语句是不断加减CYCLE的数值来调节占空比输出的。
  96.            if(yi==1)
  97.      {
  98.       Delay(30);
  99.    CYCLE--;
  100.    if(CYCLE==1)
  101.    er=1,yi=0;
  102.      }
  103.      if(er==1)
  104.      {
  105.       Delay(50);
  106.    CYCLE++;
  107.    if(CYCLE==100)
  108.    er=0,yi=1;
  109.      }
  110.    
  111.      
  112.          
  113.    CCAP0L=DUTYCYCLE(CYCLE);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
  114.       CCAP0H=DUTYCYCLE(CYCLE);//占空比计算公式256-(80/x=50/128)=XX,
  115.       CCAP1L=DUTYCYCLE(CYCLE);
  116.       CCAP1H=DUTYCYCLE(CYCLE);
  117.    
  118.         }
  119. }
复制代码


回复

使用道具 举报

ID:65237 发表于 2021-10-4 15:29 | 显示全部楼层
楼主谢谢你的分享最近在学这个 主要是AD部分能发过完整的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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