⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 单片机控制Led渐变
💻 C
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit P00=P0^0;      //P0口为低电平时LED亮
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;

uchar cnt[8]={8,16,24,32,40,48,56,64}; //定义8个初始亮度级别
uchar flgdir[8]={1,1,1,1,1,1,1,1};  //在LED从暗到渐亮再从亮到渐暗是做计数方向标志

void main()
{
 TMOD=0x11; //定时器0定时0.156mS,晶振是11.0592M
 TH0=0xFF;
 TL0=0x70;
 ET0=1;
 EA=1;
 TR0=1;
 P0=0x00;
 while(1);
}

void timer0() interrupt 1
{
 static uchar n;
 uchar i;
 TH0=0xFF;
 TL0=0x70;
 n++;
 if(n==cnt[0])P00=1;   //用n定时计数与cnt[i]比较用来在P0各个位出现不同脉宽的PWM波形
 if(n==cnt[1])P01=1;
 if(n==cnt[2])P02=1;
 if(n==cnt[3])P03=1;
 if(n==cnt[4])P04=1;
 if(n==cnt[5])P05=1;
 if(n==cnt[6])P06=1;
 if(n==cnt[7])P07=1;
 if(n>63)     //每过64*0.156=10ms,P0变为0,重新开始一个PWM周期,即PWM波的频率是100Hz
 {
  n=0;
  P0=0;
  for(i=0;i<8;i++) //并且每过10ms每个灯的脉宽变化一次,即亮度变化一次
  { 
   if(flgdir[i]==1) //分别控制每个灯的脉宽由窄变宽再到窄,由于计数的初始值不同,因此出现波浪状的流水灯
   {
    cnt[i]++;
    if(cnt[i]>71)flgdir[i]=0;
   }
   else
   {
    cnt[i]--;
    if(cnt[i]<9)flgdir[i]=1;
   }
  }
 }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -