基于51单片机增加减少键控制PWM(脉冲宽度调制)来调整LED亮灭程度

#include<reg51.h> 
#include<intrins.h>
#define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
#define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
sbit k1=P1^0;
sbit k2=P1^5;
sbit led=P3^4;
uchar count,pwm,flag;
  void delay(uint z)//延时程序
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
  }
  void keyscan()//按键扫描函数
{
   if(k1==0)
 {
    delay(5);
    if(k1==0)
  {
     pwm++;
     if(pwm>=20)
     pwm=0;
    }
     while(!k1);
    }
   if(k2==0)
 {
    delay(5);
    if(k2==0)
  {
     if(pwm>0)
     pwm--;
     if(pwm<=0)
     pwm=0;
    }
     while(!k2);
    }
 }
  void TimerInit()//定时器0初始化函数
{
   TMOD=0x01;//设定定时器0,工作模式为模式1。
   TH0=(65536-50000)/256;//TH0重新装值
   TL0=(65536-50000)%256;//TL0重新装值
// TH1=0xfc;//TH1装初值
// TL1=0x66;//TL1装初值
   EA=1;//开启定时器总中断
   ET0=1;//开启定时器0中断开关
   TR0=1;//启动定时器0
// ET1=1;//开启定时器1中断开关
// TR1=1;//启动定时器1
 }
  void timer0() interrupt 1//定时器0中断函数
{ 
   TH0=(65536-50000)/256;//中断定时50毫秒,表示高低电平占用周期50毫秒,也表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/0.05s(由50毫秒除以1000求得0.05秒)=20Hz。
   TL0=(65536-50000)%256;//
   count++;
   if(count>=20)//中断次数变量达到20次,表示1秒(即中断次数变量20次X中断定时50毫秒)时间到 ,也表示高低电平占用周期1秒,另外表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/1s=1Hz。
  {
    count=0;
   }
    if(count<pwm)
  {
     led=0;//led为低电平
    }
    else
  {
     led=1;//led为高电平
    } 
  }
  void main()//主函数
{
   TimerInit();
   while(1)
 {
    keyscan();//按键扫描函数  
   } 
 }

猜你喜欢

转载自www.cnblogs.com/AChenWeiqiangA/p/12724989.html