200811115455833840.rar

  • haixin1027
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2008-03-11 19:59
    上传日期
用按键可控制的PWM波,绝对原创,不要仿造。
200811115455833840.rar
  • www.pudn.com.txt
    218B
  • pwm.c
    8.3KB
内容介绍
//编程时间:07-5-16 #include<pic.h> ///////////////////////////////////////// //--------------端口定义---------------// ///////////////////////////////////////// //#define PWM1 RC2 //#define PWM2 RC1 /////////////////////////////////////// //-------------数据定义--------------// /////////////////////////////////////// static char CCP1_NUMBER,CCP2_NUMBER;//CCP输出方波计数值 static char CCP1EN,CCP2EN,DOWNEN,TIMERNUMBER,TIMERNUMBER_IN;//CCP1 CCP2产生方波使能位 /////////////////////////////////////// //--------------函数定义-------------// /////////////////////////////////////// void initccp(); //PWM初始值设置 void initvar(); //数据初试值初试化 void initt2(); //T2初试化 void delay1(); //延时程序 /****************************************** //-------------------主函数---------------- ******************************************/ void main() { TRISC=0X00; //CCP端口输出 TRISB=0X02; //B口输出,指示灯使用,RB1键盘输入 initvar(); //数据初试值初试化 initt2(); //T2初试化 initccp(); //CCP模块初试化 TMR2ON=1; //打开定时器T2 while(1) { RB0=0; //LED闪烁,程序执行标志 delay1(); RB0=1; delay1(); if(RB1==0) { while(RB1==1); DOWNEN=1; //低电平输出使能位 TIMERNUMBER=TIMERNUMBER+2;//每次按下按键则在低电平延时时间增加大概1.1MS if(TIMERNUMBER>55) //当低电平时间增加到30MS的时候,清零为20MS低电平 //按键9次即可以恢复到20MS的低电平值,在次也可以再增加一个按键来单独设定低电平输出时间值 { TIMERNUMBER=36; } } } } /***************************************** ---------------------中断函数------------- *****************************************/ void interrupt ISR() { if(TMR2IF&&TMR2IE) { TMR2IF=0; if((CCP1EN==1)&&(DOWNEN==0)) //当CCP1使能即输出上半波 { CCPR2L=0;//CCP2输出占空比为0的波型,即为不输出 CCP1_NUMBER=CCP1_NUMBER+1;//CCP1波型个数开始计数 switch(CCP1_NUMBER) { case 1: CCPR1L=0x18; //占空比15% 00 break; case 2: CCPR1L=0x30; //30% 01 break; case 3: CCPR1L=0x48; //45% 01 break; case 4: CCPR1L=0x5e; //58% 00 break; case 5: CCPR1L=0x71; //71% 11 break; case 6: CCPR1L=0x81; //80% 01 break; case 7: CCPR1L=0x8e; //89% 00 break; case 8: CCPR1L=0x98; //95% 01 break; case 9: CCPR1L=0x9e; //98% 00 break; case 10: CCPR1L=0xa0; //100% 11 break; case 11: CCPR1L=0x9e; break; case 12: CCPR1L=0x98; break; case 13: CCPR1L=0x8e; break; case 14: CCPR1L=0x81; break; case 15: CCPR1L=0x71; break; case 16: CCPR1L=0x5e; break; case 17: CCPR1L=0x48; break; case 18: CCPR1L=0x30; break; case 19: CCPR1L=0x18; break; } if(CCP1_NUMBER==19) //当输出19个方波重新计数 { CCP1_NUMBER=0; //清除计数值 CCP2EN=1; //打开CCP2使能位 CCP1EN=0; //清除CCP1使能位 } } if((CCP2EN==1)&&(DOWNEN==0))//当CCP2使能即输出上半波 { CCPR1L=0;//CCP1输出占空比为0的波型,即为不输出 CCP2_NUMBER=CCP2_NUMBER+1;//CCP2波型个数开始计数 switch(CCP2_NUMBER) { case 1: CCPR2L=0x18; //占空比15% 00 break; case 2: CCPR2L=0x30; //30% 01 break; case 3: CCPR2L=0x48; //45% 01 break; case 4: CCPR2L=0x5e; //58% 00 break; case 5: CCPR2L=0x71; //71% 11 break; case 6: CCPR2L=0x81; //80% 01 break; case 7: CCPR2L=0x8e; //89% 00 break; case 8: CCPR2L=0x98; //95% 01 break; case 9: CCPR2L=0x9e; //98% 00 break; case 10: CCPR2L=0xa0; //100% 11 break; case 11: CCPR2L=0x9e; break; case 12: CCPR2L=0x98; break; case 13: CCPR2L=0x8e; break; case 14: CCPR2L=0x81; break; case 15: CCPR2L=0x71; break; case 16: CCPR2L=0x5e; break; case 17: CCPR2L=0x48; break; case 18: CCPR2L=0x30; break; case 19: CCPR2L=0x18; break; } if(CCP2_NUMBER==19)//当输出19个方波重新计数 { CCP2_NUMBER=0;//清除计数值 CCP1EN=1;//打开CCP1使能位 CCP2EN=0;//清除CCP12使能位 } } if(DOWNEN==1)//屏蔽波型输入 { CCPR1L=0;//CCP1输出占空比为0的波型,即为低电平 CCPR2L=0;//CCP2输出占空比为0的波型,即为低电平 TIMERNUMBER_IN=TIMERNUMBER_IN+1; //内部低电平时间计数,单位位560US if(TIMERNUMBER_IN==TIMERNUMBER)//当低电平时间等于外部按键设置的时间时则恢复波型 { DOWNEN=0;//输出低电平使能位 TIMERNUMBER_IN=0;//低电平时间值清零 } } } } /***************************************** //函数名称:void initvar() //函数功能:PWM初始值设置 //函数调用:主函数调用 *****************************************/ void initccp() { PR2=0xa3; //526.3us=(PR2+1)*0.2*16 CCPR1L=0x18; //占空比15% CCP1CON=0x1C; //PWM模式 低2位为01 CCPR2L=0x18; //占空比15% CCP2CON=0x1C; //PWM模式 低2位为01 T2CON=0X06; //0111 1100 16分频,打开T2 TMR2IE=1;//打开T2中断允许位 } /***************************************** //函数名称:void initvar() //函数功能:为系统调用值赋初值 //函数调用:主函数调用 *****************************************/ void initvar() { CCP1_NUMBER=0;//CCP方波计数值清零 CCP2_NUMBER=0; CCP1EN=1;//系统初始化时先给CCP1使能,输出第一列方波 CCP2EN=0;//不输出第二列方波 DOWNEN=0;//CCP输出低电平标志位 TIMERNUMBER=36;//输出大约20MS的低电平 TIMERNUMBER_IN=0
评论
    相关推荐
    • 可控PWM.rar
      基于STM32单片机的可控PWM代码,能用来控制电机的转速。
    • PID控制PWM风机LCD显示.zip
      PID控制pwm风扇,吹小球,附带激光测距,通过LCD显示
    • pwm波.zip
      上位机Labview输入电机转速从1到100不同,下位机程序通过单片机51控制。
    • UCOSIII系统产生PWM波
      UCOSSIII系统产生PWM波,同时通过蓝牙模块,控制模块的PWM的脉宽 控制板是STM32F407ZGT6,基本可以说是一个简单的遥控小车了。一共产生了两路PWM波
    • PWM波做的呼吸灯
      STM32F103ZET6的四通道呼吸灯,采用按键控制各通道呼吸灯亮灭
    • PWM波控制直流电机 程序
      PWM波控制直流电机 程序 使用avr单片机 程序可以移植
    • PWM死区Demo.rar
      NY8B062D PWM控制例程ADC end-of-convert interrupt ; 1. Set ADC clock frequency is 1MHz , Sample pulse width is 8 ADC clock , ; ADC conversion time = (8+12+2)*1us = 22us , ADC conversion rate = 1/...
    • 单片机可控硅调节PWM
      单片机可控硅调节PWM单片机可控硅调节PWM单片机可控硅调节PWM单片机可控硅调节PWM
    • STC15 采用T0溢出PCA输出可控频率PWM波
      是用STC15W系列单片机(本例直接可用STC15W401-408AS的MCU)直接测试功能的KEIL4工程。经过PCA输出可控频率可控占空比的PWM波,采用T0溢出方式。
    • MSP430产生PWM波控制电机转速源代码
      该代码利用MSP430单片机产生PWM波,用来控制电机的转速,可以精确的实现电机转速的控制。