📄 led.c
字号:
#include"reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ON 0
#define OFF 1
/*
//led
sbit R_led=P1^0;
sbit G_led=P1^1;
sbit B_led=P1^2;
*/
//key
sbit MODE=P1^7;
sbit PUSE=P3^7;
sbit B_ADD=P3^5;
sbit B_DEC=P3^4;
sbit S_ADD=P3^0;
sbit S_DEC=P3^1;
extern void Pwm_delay(); //占空比延时
uchar //C_time1,
C_time2, //切换速度
Pwm_time,//占空比
Pwm_s, //LED状态
MODE_ID, //运行模式
R_time, //速度计数器
Max_ID, //状态最大值
Min_ID, //状态最小值
Run_ID; //运行状态
/*
uchar bdata F;
sbit F_run=F^0;
*/
uchar code Run_s[]={ 0x01,0x02,0x04, 0x01,0x02,0x04, 0x01,0x02,0x04, 0x01,0x02,0x04, 0x01,0x02,0x04,0x07,0x00,
0x07,0x06,0x04,0x00, 0x07,0x06,0x04,0x00, 0x07,0x06,0x04,0x00, 0x07,0x06,0x04,0x00, 0x07,0x06,0x04,0x00,
0x03,0x00, 0x03,0x00, 0x05,0x00, 0x05,0x00, 0x06,0x00, 0x6,0x00,
0x03,0x00, 0x03,0x00, 0x05,0x00, 0x05,0x00, 0x06,0x00, 0x6,0x00,
0x03,0x00, 0x03,0x00, 0x05,0x00, 0x05,0x00, 0x06,0x00, 0x6,0x00,
0x03,0x00, 0x03,0x00, 0x05,0x00, 0x05,0x00, 0x06,0x00, 0x6,0x00,
0x03,0x00, 0x03,0x00, 0x05,0x00, 0x05,0x00, 0x06,0x00, 0x6,0x00 };//led输出状态表
uchar code Max_tab[]= { 16,36,96 };//状态最大值表
uchar code Min_tab[]= { 0,17,37 };//状态最小值表
void Int0()interrupt 0 {
EX0=0;//暂停键盘扫描
if(!MODE) { //模式切换
MODE_ID++;
if(MODE_ID==3)MODE_ID=0;
Max_ID=Max_tab[MODE_ID];
Min_ID=Min_tab[MODE_ID];
Run_ID=Min_ID;
R_time=C_time2;
}
if(!PUSE)ET1=~ET1;//开始/暂停
if(!S_ADD){ //运行速度加速
if(C_time2==48)C_time2=16;
else C_time2+=16;
R_time=C_time2;
}
if(!S_DEC) { //运行速度减速
if(C_time2==16)C_time2=48;
else C_time2-=16;
R_time=C_time2;
}
if(!B_ADD) { //占空比增加
if(Pwm_time==12)Pwm_time=4;
else Pwm_time+=4;
}
if(!B_DEC){ //占空比减少
if(Pwm_time==4)Pwm_time=12;
else Pwm_time-=4;
}
EX0=1;//开始键盘扫描
}
void Timer1()interrupt 3 {
TH1=0x0b;
TL1=0xdc;
R_time--;
if(R_time==0) {//切换LED输出状态
R_time=C_time2;
if(Run_ID==Max_ID) { Run_ID=Min_ID;/*ET1=0;return;*/ }
else Run_ID++;
Pwm_s=~Run_s[Run_ID];
}
}
void Init_system(){
//初始化运行状态
MODE_ID=0;
Max_ID=Max_tab[MODE_ID];
Run_ID=Min_ID=Min_tab[MODE_ID];
Pwm_time=12;
Pwm_s=~Run_s[Run_ID];
//INT0中断设置
IT0=1;
EX0=1;
//Timer0中断设置
TH1=0x0b;
TL1=0xdc;
C_time2=R_time=16;
TR1=1;
ET1=1;
EA=1;
}
void Pwm_delay() {//占空比延时
uchar i;
for(i=0;i<5;i++)_nop_();
}
void main() {
uchar Pwm;//占空比计数器
Init_system();
while(1) {
//启动时间
Pwm=Pwm_time;
P1=Pwm_s;
while(Pwm--)Pwm_delay();
//关闭时间
Pwm=12-Pwm_time;
if(Pwm) {
P1=0xff;
while(Pwm--)Pwm_delay();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -