Pwm._c
上传用户:rbltsz
上传日期:2007-09-19
资源大小:2509k
文件大小:2k
源码类别:

单片机开发

开发平台:

C/C++

  1. //***************FileName:Capature.C***************//
  2. //***************ICCAVR V6.30编译*****************//
  3. #include <io8535v.h>                 
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. //数码管字型表,对应0,1,2,3,4,5,6,7,8,9,E//
  7. uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};
  8. uchar Data1[4]={10,0,5,0};      //定义初始方波占空比:50%
  9. uchar Data2[4]={3,9,1,0};            //设定PWM频率:8M/2046=3910Hz 
  10. uchar Key1_Flag,Key2_Flag;
  11.             
  12. void DelayMs(uint i)           //Ms级延时,参数i为延时时间
  13. {uint j;
  14.  for(;i!=0;i--)
  15.   {for(j=8000;j!=0;j--) {;}}
  16. }
  17. void Display(uchar *p)         //动态显示函数,参数p为待显示的数组名
  18. {uchar i,sel=0x01;           
  19.  for(i=0;i<4;i++)
  20.   {PORTA=sel;                  //选通最右边的数码管
  21.    PORTC=0xff-Table[p[i]];     //送字型码
  22.    DelayMs(1);                 //显示延时    
  23.    sel=sel<<1;                 //移位以显示前一位
  24.   }
  25. }
  26. void Add_Process(uchar *p)
  27. {if(p[1]!=1)
  28.   {p[2]=p[2]+1;
  29.    if(p[2]==10) {p[2]=0;p[1]++;}
  30.   }
  31. }
  32. void Sub_Process(uchar *p)
  33. {uchar temp;
  34.  temp=p[1]*10+p[2];
  35.  if(temp!=0)
  36.   {temp=temp-1;
  37.    p[1]=temp/10;
  38.    p[2]=temp-p[1]*10;
  39.   }
  40. }
  41.  
  42. void Key_Process()
  43. {while((PINB&0x01)==0) {Display(Data1);Key1_Flag=1;}  
  44.  while((PINB&0x02)==0) {Display(Data1);Key2_Flag=1;}
  45.  if(Key1_Flag==1)
  46.      {Add_Process(Data1);           
  47.   Key1_Flag=0;}
  48.  if(Key2_Flag==1)
  49.      {Sub_Process(Data1);
  50.   Key2_Flag=0;} 
  51. }
  52.     
  53. void Set_Process(uchar *p)
  54. {uint i;
  55.  i=p[1]*10+p[2];
  56.  i=1023*i/10;
  57.  OCR1AH=i>>8;
  58.  OCR1AL=i&0x00ff;
  59. }
  60. void Init_IO(void)             //初始化I/O口
  61. {DDRA=0xff;                    //设置A口为推挽1输出
  62.  PORTA=0xff;
  63.  DDRC=0xff;                    //设置C口为推挽1输出             
  64.  PORTC=0xff;
  65.  DDRB=0x00;                    //设置B口为三态输入
  66.  PORTB=0x00;
  67.  DDRD=0xff;                    //设置D口为推挽1输出
  68.  PORTD=0xff;    
  69. }
  70. void main(void)
  71. {uchar i;
  72.  Init_IO();                    //初始化I/O口
  73.  PORTA=0xff;                   //点亮以测试所有的数码管
  74.  PORTC=0x00;   
  75.  //DelayMs(300);                 //延时
  76.  PORTC=0xff;                   //熄灭所有的数码管
  77.  TCCR1A=0xc3;                  //10位PWM,向上计数清除OC1A,向下计数置位OC1A
  78.  TCCR1B=0x02;                  //时钟8分频,最小频率1M/2046=0.5KHz       
  79.  while(1)
  80.  {Key_Process();
  81.   Set_Process(Data1);         //设置PWM占空比
  82.  /* for(i=50;i!=0;i--)
  83.     Display(Data1);
  84.   for(i=50;i!=0;i--)
  85.     Display(Data2);*/
  86.  }
  87. }