[KungFu8位 MCU] KF8F PWM小练2

[复制链接]
1087|0
 楼主| gaoxiansheng 发表于 2017-7-28 16:03 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. *
  3. * 文  件  名: main.c
  4. * 项  目  名: 06-General PWM-2
  5. * 版         本: v1.0
  6. * 日         期: 2016年05月16日 11时38分22秒
  7. * 作         者: Administrator
  8. * 程序说明:普通PWM参考例程
  9. *                         PWM时钟源可选择T1(Fsys/4),也可以选择系统时钟Fosc。
  10. * 适用芯片:KF8VXXX系列——KF8V111、KF8V120、KF8V200、KF8V204、KF8V211、KF8V216、
  11. *                                                  KF8V218、KF8V220、KF8V327、KF8V427、KF8V429
  12. ****************************************************************************************/
  13. #include<KF8V111.h>

  14. #define uchar unsigned char
  15. #define uint  unsigned int

  16. /****************************************************************************************
  17. * 函数名     :Delay_ms
  18. * 函数功能:长时间延时
  19. * 入口参数:延时基数 uchar ms_data
  20. * 返回          :无
  21. ****************************************************************************************/
  22. void Delay_ms(uint ms_data)
  23. {
  24.         uchar i;
  25.         while(ms_data--)
  26.         {
  27.                 i = 124;
  28.                 while(i--);
  29.         }
  30. }

  31. /****************************************************************************************
  32. * 函数名     :init_mcu
  33. * 函数功能:mcu初始化函数
  34. * 入口参数:无
  35. * 返回          :无
  36. ****************************************************************************************/
  37. void init_mcu()
  38. {
  39.         /***时钟初始化****/
  40.         OSCCTL = 0x50;          //设置为16M

  41.         /***端口初始化****/
  42.         TR0 = 0x08;                                //设置P03端口为输入,P0其他I/O口为输出
  43.         TR1 = 0x00;                                //设置P1端口为输出
  44.         TR2 = 0x00;                                //设置P2端口为输出
  45.         P0 = 0;
  46.         P1 = 0;
  47.         P2 = 0;
  48.         P0LR = 0;                                //P0口输出低电平
  49.         P1LR = 0;                                //P1口输出低电平
  50.         P2LR = 0;                                //P2口输出低电平
  51. }

  52. /****************************************************************************************
  53. * 函数名     :init_pwm
  54. * 函数功能:pwm初始化函数
  55. * 入口参数:无
  56. * 返回          :无
  57. ****************************************************************************************/
  58. void init_pwm()
  59. {
  60.         /***PWM相关寄存器初始化****/

  61.         //时钟选择T1。A01版本只能选择T1时钟源作为PWM的时钟。
  62.         T1CTL = 0X01;                        //T1预分频比=1,启动T1
  63.         T1L = 0;
  64.         T1H = 0;
  65.         PP1 = 0xff;                                //PWM1的周期寄存器 ,分辨率为255,T=(255+1)*4*(1/16MHz)*1=64us,F=1/T=15.6KHz
  66.         PP2 = 0xff;                                //PWM2的周期寄存器 ,分辨率为255,T=(255+1)*4*(1/16MHz)*1=64us,F=1/T=15.6KHz
  67.         PWM1L = PP1/2;                        //PWM1初始化占空比为50%
  68.         PWM2L = PP2/2;                        //PWM2初始化占空比为50%

  69.         PWMCTL = 0;                                //关闭PWM1、PWM2

  70. //        //选择MCU振荡时钟,通过PWMCTL的第2(PWM1CKS)、3(PWM2CKS)位选择
  71. //        PP1 = 0xff;                                //PWM1的周期寄存器 ,分辨率为255,T=(255+1)*(1/16MHz)=16us,F=1/T=62.5KHz
  72. //        PP2 = 0xff;                                //PWM2的周期寄存器 ,分辨率为255,T=(255+1)*(1/16MHz)=16us,F=1/T=62.5KHz
  73. //        PWM1L = PP1/2;                        //PWM1初始化占空比为50%
  74. //        PWM2L = PP2/2;                        //PWM2初始化占空比为50%
  75. //
  76. //        PWM1CKS=1;                                //PWM1时钟源选择MCU振荡时钟
  77. //        PWM2CKS=1;                                //PWM2时钟源选择MCU振荡时钟
  78. }

  79. /****************************************************************************************
  80. * 函数名     :init_pwm
  81. * 函数功能:pwm功能函数
  82. * 入口参数:无
  83. * 返回          :无
  84. ****************************************************************************************/
  85. void pwm_function()
  86. {
  87.         static uchar direction=0;
  88.         if(direction)
  89.         {
  90.                 PWM1L++;                                                //PWM1增大占空比
  91.                 PWM2L++;                                                //PWM2增大占空比
  92.                 if(PWM1L > (PP1-1) )
  93.                 {
  94.                         direction=0;                                //换向
  95.                 }
  96.         }
  97.         else
  98.         {
  99.                 PWM1L--;                                                //PWM1减小占空比
  100.                 PWM2L--;                                                //PWM1减小占空比
  101.                 if(PWM1L==0)
  102.                 {
  103.                         direction=1;                                //换向
  104.                 }
  105.         }
  106. }

  107. /****************************************************************************************
  108. * 函数名     :main
  109. * 函数功能:程序入口主函数
  110. * 入口参数:无
  111. * 返回          :无
  112. ****************************************************************************************/
  113. void main()
  114. {
  115.         init_mcu();
  116.         init_pwm();
  117.         Delay_ms(10);

  118.         PWM1ON=1;                                                        //开启PWM1
  119.         PWM2ON=1;                                                        //开启PWM2
  120.         while(1)
  121.         {
  122.                 pwm_function();
  123.                 Delay_ms(10);
  124.         }
  125. }

  126. //中断函数0:0X04入口地址
  127. void int_fun0() __interrupt (0)
  128. {

  129. }


  130. //中断函数1:0x14入口地址
  131. void int_fun1() __interrupt (1)
  132. {

  133. }


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

本版积分规则

22

主题

210

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部