[蓝桥杯单片机9]PWM脉宽调制信号的发生与控制

实验内容:利用PWM脉宽信号实现独立按键S7L1指示灯亮度变化的控制。

具体要求如下:

    1. PWM脉宽信号的频率为100Hz

    2. 系统上电后L1指示灯处在熄灭状态。

    3. L1指示灯有4种亮度模式,分别是完全熄灭10%的亮度50%的亮度90%的亮度

    4. 按下S7按键,循环切换L1指示灯的四种亮度模式。

代码部分:

/*=========================================================
实验内容:
利用PWM脉宽信号实现独立按键对L1指示灯亮度变化的控制。
 1. PWM脉宽信号的频率为100Hz。
 2. 系统上电后L1指示灯处在熄灭状态。
 3. L1指示灯有不同的种亮度模式
 4. 按下不同按键,切换L1指示灯的四种亮度模式。
**************************************************************/
#include "reg52.h"

sbit L1 = P0^0;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sfr AUXR = 0x8e;
unsigned char count=0;
unsigned char pwm_duty=0;
unsigned char Key[4]={0};
unsigned char Keyy[4]={0};

void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

void Timer0Init(void)		//100微秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	
  ET0 = 1;
  EA =1;
  
  TR0 = 1;		//定时器0开始计时
}


void ServiceT0() interrupt 1
{
  
  count ++;
  if(count == pwm_duty)
  {
    L1 = 1;
  }
  if(count == 100)
  {
    L1 = 0;
    count = 0;
  }
  
}
void key_scan()
{
  if(S7 ==0)
  {
    Delay10ms();
    if(S7 == 0)
    {
      while(S7 == 0); 
      Key[0] = !Key[0];
    }
  }
    if(S6 ==0)
  {
    Delay10ms();
    if(S6 == 0)
    {
      while(!S6);     
      Key[1] = !Key[1];
    }
  }
      if(S5 ==0)
  {
    Delay10ms();
    if(S5 == 0)
    {
      while(!S5);
      Key[2] = !Key[2];  
    }
  }
}
void pwm_d()
{
      if(Keyy[0]!=Key[0])   //S7100%亮
    {
      Keyy[0]=Key[0]; 
      pwm_duty = 100;
    }      
    if(Keyy[1]!=Key[1])//S6/10%亮
    {
      Keyy[1]=Key[1];
      pwm_duty = 10;    
    }
    if(Keyy[2]!=Key[2])//S5占空比50% 
    {
      Keyy[2]=Key[2];
      pwm_duty = 50;     
    }
  
}
void main()
{
  P2 = (P2 & 0x1f)|0x80;
  P0 = 0xff;        //初始化全灭
  Timer0Init();
  while (1)
  {
    key_scan();
    pwm_d();
  }
}

你可能感兴趣的:(蓝桥杯单片机,单片机,蓝桥杯,嵌入式硬件)