找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2416|回复: 0
收起左侧

用52单片机定时中断2做的一个简单LED_PWM调节

[复制链接]
ID:364354 发表于 2018-8-31 07:48 | 显示全部楼层 |阅读模式
  1. #include"reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sfr T2MOD =0xC9;  //定时器中断2TMOD必须定义


  5. /*-----------------------PWM定义---------------------------*/

  6. uchar PWM_T=0;//PWM脉冲周期PWM_T(max)=256*中断定时时间

  7. //PWM物理地址通道定义,物理地址根据需要自由定义
  8. sbit PWM_IO0 = P1^0;
  9. sbit PWM_IO1 = P1^1;
  10. sbit PWM_IO2 = P1^2;
  11. sbit PWM_IO3 = P1^3;

  12. //PWM脉冲占空比
  13. uchar PWM_IO0_ZKB=10;  //脉冲占空比,0~255,=0时输出最大
  14. uchar PWM_IO1_ZKB=10;
  15. uchar PWM_IO2_ZKB=10;
  16. uchar PWM_IO3_ZKB=10;

  17. /*---------------------------------------------------------*/

  18. sbit s0 = P3^0;
  19. sbit s1 = P3^1;


  20. /*---------------定时器2初始化-------------------*/
  21. void timer2_init()//定时器2初始化
  22. {
  23.         RCAP2H=0xff;  //16位计数器,定时39us
  24.         RCAP2L=0xdc;  //X=0xffdc=65500;T=(65536-X)*机器周期(11.0592MHz,1.085us)
  25.         //TH2=RCAP2H;     //会自动重装
  26.         //TL2=RCAP2L;
  27.         T2CON=0;
  28.         T2MOD=0;
  29.         EA=1;
  30.         ET2=1;
  31.         TR2=1;
  32. }

  33. /*--------------定时器2中断服务程序----------------------------*/
  34. void timer2() interrupt 5
  35. {        
  36.         TF2=0; //注意:定时器2必须由软件对溢出标志位清零,
  37.                //这里与定时器0和定时器1不同
  38.         //PWM处理
  39.            PWM_T++;
  40.         if(PWM_T == 255)//取到最大值
  41.         {PWM_T = PWM_IO0 = PWM_IO1 = PWM_IO2 = PWM_IO3 = 0;}        //所有通道脉冲拉至低电平
  42.         
  43.         //通道脉冲电平拉高
  44.         if(PWM_T == PWM_IO0_ZKB)  //通道0脉冲得高电平
  45.                 PWM_IO0 = 1;        
  46.         
  47.         if(PWM_T == PWM_IO1_ZKB)  //通道1脉冲得高电平
  48.                 PWM_IO1 = 1;
  49.         
  50.         if(PWM_T == PWM_IO2_ZKB)  //通道2脉冲得高电平
  51.         PWM_IO2 = 1;
  52.                
  53.         if(PWM_T == PWM_IO3_ZKB)  //通道3脉冲得高电平
  54.                 PWM_IO3 = 1;        
  55. }




  56. /*------------主函数---------------*/
  57. void main()
  58. {
  59.         timer2_init();//定时器2初始化
  60.         while(1)
  61.         {
  62.                 if(s0==0) //按s0减小占空比
  63.                 {
  64.                         while(!s0);//等待
  65.                         {
  66.                                 if(PWM_IO0_ZKB>0)
  67.                                 {
  68.                                         PWM_IO0_ZKB = PWM_IO0_ZKB-10;  
  69.                                         PWM_IO1_ZKB = PWM_IO1_ZKB-10;
  70.                                         PWM_IO2_ZKB = PWM_IO2_ZKB-10;
  71.                                         PWM_IO3_ZKB = PWM_IO3_ZKB-10;                                
  72.                                 }

  73.                                 
  74.                         }
  75.                 }
  76.                 if(s1==0)  //按s1增加哦占空比
  77.                 {
  78.                         while(!s1);//等待
  79.                         {
  80.                                 if(PWM_IO0_ZKB<255)
  81.                                 {
  82.                                         PWM_IO0_ZKB = PWM_IO0_ZKB+10;  
  83.                                         PWM_IO1_ZKB = PWM_IO1_ZKB+10;
  84.                                         PWM_IO2_ZKB = PWM_IO2_ZKB+10;
  85.                                         PWM_IO3_ZKB = PWM_IO3_ZKB+10;                                       
  86.                                 }                                
  87.                         }
  88.                 }               
  89.         }
  90. }
复制代码

定时中断2_PWM.zip

33.5 KB, 下载次数: 20, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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