在调节led0亮度后,在跳节led1的亮度会使led0灭掉(我先把led0调暗,在调暗或调亮led1时led0就会熄灭)
附程序:
/*------------------------------------------------
名称:基于蓝牙的智能家居灯光控制器
编写:zxl
日期:2015.1.5
修改:无
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
unsigned char PWM0;
unsigned char PWM1;
unsigned char temp;
unsigned char temp1;
unsigned char num0;
unsigned char num1;
bit rec;
sbit led0 = P2^5;
sbit led1 = P2^6; //注意开发板与样品定义脚的更改
/*------------------------------------------------
总开
------------------------------------------------*/
void turn_on()
{
led0=0;
led1=0;
if(led0||led1==1)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
总关
------------------------------------------------*/
void turn_off()
{
led0=1;
led1=1;
if(led0&led1==0)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
开白色LED
------------------------------------------------*/
void Wturn_on()
{
led0=0;
if(led0==1)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
开黄色LED
------------------------------------------------*/
void Yturn_on()
{
led1=0;
if(led1==1)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
关白色LED
------------------------------------------------*/
void Wturn_off()
{
led0=1;
if(led0==0)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
关黄色LED
------------------------------------------------*/
void Yturn_off()
{
led1=1;
if(led1==0)
SBUF=0x20; //返回“操作失败”
else
SBUF=0x10; //返回“操作成功”
}
/*------------------------------------------------
白灯PWM0调节
------------------------------------------------*/
void ctrl_PWM0()
{
if(num0==10) //PWM0
{
num0=0;
}
if(num0<PWM0)
{
led0=0;
}
else
led0=1;
// TR0=0;
}
/*------------------------------------------------
黄灯PWM1调节
------------------------------------------------*/
void ctrl_PWM1()
{
if(num1==10) //PWM0
{
num1=0;
}
if(num1<PWM1)
{
led1=0;
}
else
led1=1;
// TR0=0;
}
/*------------------------------------------------
调亮白色LED
------------------------------------------------*/
void Wturn_up()
{
if(PWM0!=10)
{
PWM0=PWM0+1;
// delay(200);
}
if(PWM0>10)
PWM0=10;
}
/*------------------------------------------------
调亮黄色LED
------------------------------------------------*/
void Yturn_up()
{
if(PWM1!=10)
{
PWM1=PWM1+1;
// delay(200);
}
if(PWM1>10)
PWM1=10;
}
/*------------------------------------------------
调暗白色LED
------------------------------------------------*/
void Wturn_down()
{
if(PWM0!=0)
{
PWM0=PWM0-1;
// delay(200);
}
if(PWM0<1)
PWM0=1;
}
/*------------------------------------------------
调暗黄色LED
------------------------------------------------*/
void Yturn_down()
{
if(PWM1!=0)
{
PWM1=PWM1-1;
// delay(200);
}
if(PWM1<1)
PWM1=1;
}
/*------------------------------------------------
串口和定时器0初始化
------------------------------------------------*/
void Init_UART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x21; // TMOD: timer 1, mode 2, 8-bit
TH1 = 0xFD;
TL1 = 0xFD; // 9600 波特率 晶振 11.0592MHz
TH0 =(65535-500)/256;
TL0 =(65535-500)%256;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
ET0 = 1;
TR0 = 1;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
led0=1;
led1=1;
PWM0=5;
PWM1=5;
Init_UART();
// TR0 = 0;
while (1)
{
if(rec==1)
{
rec=0;
switch(temp)//判断temp从串口读取到的数据
{
case 0x30: //如果是0x30 总开灯
turn_on();
break;
case 0x31: //如果是0x31 总关灯
turn_off();
break;
case 0x32: //如果是0x32 开黄灯
Yturn_on();
break;
case 0x33: //如果是0x33 关黄灯
Yturn_off();
break;
case 0x34: //如果是0x34调暗黄灯
Yturn_down();
// TR0=1;
break;
case 0x35: //如果是0x35 调亮黄灯
Yturn_up();
// TR0=1;
break;
case 0x36: //如果是0x36 开白灯
Wturn_on();
break;
case 0x37: //如果是0x37 关白灯
Wturn_off();
break;
case 0x38: //如果是0x38 调暗白灯
Wturn_down();
// TR0=1;
break;
case 0x39: //如果是0x39 调亮白灯
Wturn_up();
// TR0=1;
break;
}
}
}
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
rec=1;
temp=SBUF;
// SBUF=temp1; //读入缓冲区的值
}
if(TI) //如果是发送标志位,清零
TI=0;
}
/*------------------------------------------------
定时器0中断
------------------------------------------------*/
void timer0() interrupt 1
{
TH0=(65535-500)/256;
TL0=(65535-500)%256;
num0++;
num1++;
if(temp==0x38||temp==0x39)
{
ctrl_PWM0();
// num0=0;
}
if(temp==0x34||temp==0x35)
{
ctrl_PWM1();
// num1=0;
}
} |