本来通过串口发送一个指令控制led亮度,但是调试过程中发现发送"调亮"或“调暗”的指令灯不会只改变一次亮度,而是直接自己执行到底(比如我发调暗,灯会自己一直暗到灭,我只发了一次指令),目标是一次执行变暗一下。请各位帮我看下。在线等。。。。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
unsigned char PWM0;
unsigned char PWM1;
unsigned char temp;
unsigned char temp1;
unsigned char num0;
unsigned char num1;
sbit led0 = P2^2;
sbit led1 = P2^3;
/*------------------------------------------------
亮度调节延时
------------------------------------------------*/
void delay(unsigned int z)
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
/*------------------------------------------------
总开
------------------------------------------------*/
void turn_on()
{
led0=0;
led1=0;
if(led0||led1==1)
temp1=0x20; //返回“打开灯光失败”
else
temp1=0x10; //返回“打开灯光成功”
}
/*------------------------------------------------
总关
------------------------------------------------*/
void turn_off()
{
led0=1;
led1=1;
if(led0&led1==0)
temp1=0x20; //返回“关闭灯光失败”
else
temp1=0x10; //返回“关闭灯光成功”
}
/*------------------------------------------------
开白色LED
------------------------------------------------*/
void Wturn_on()
{
led0=0;
if(led0==1)
temp1=0x20; //返回“打开白灯失败”
else
temp1=0x10; //返回“打开白灯成功”
}
/*------------------------------------------------
开黄色LED
------------------------------------------------*/
void Yturn_on()
{
led1=0;
if(led1==1)
temp1=0x20; //返回“打开黄灯失败”
else
temp1=0x10; //返回“打开黄灯成功”
}
/*------------------------------------------------
关白色LED
------------------------------------------------*/
void Wturn_off()
{
led0=1;
if(led0==0)
temp1=0x20; //返回“关闭白灯失败”
else
temp1=0x10; //返回“关闭白灯成功”
}
/*------------------------------------------------
关黄色LED
------------------------------------------------*/
void Yturn_off()
{
led1=1;
if(led1==0)
temp1=0x20; //返回“关闭黄灯失败”
else
temp1=0x10; //返回“关闭黄灯成功”
}
/*------------------------------------------------
PWM0调节
------------------------------------------------*/
void ctrl_PWM0()
{
if(num0==10) //PWM0
{
num0=0;
}
if(num0<PWM0)
{
led0=0;
}
else
led0=1;
}
/*------------------------------------------------
PWM1调节
------------------------------------------------*/
void ctrl_PWM1()
{
if(num1==10) //PWM0
{
num1=0;
}
if(num1<PWM1)
{
led1=0;
}
else
led1=1;
}
/*------------------------------------------------
调亮白色LED
------------------------------------------------*/
void Wturn_up()
{
if(PWM0>10)
PWM0=10;
else
PWM0=PWM0+1;
delay(200);
}
/*------------------------------------------------
调亮黄色LED
------------------------------------------------*/
void Yturn_up()
{
if(PWM1>10)
PWM1=10;
else
PWM1=PWM1+1;
delay(200);
}
/*------------------------------------------------
调暗白色LED
------------------------------------------------*/
void Wturn_down()
{
if(PWM0<1)
PWM0=1;
else
PWM0=PWM0-1;
delay(200);
}
/*------------------------------------------------
调暗黄色LED
------------------------------------------------*/
void Yturn_down()
{
if(PWM1<1)
PWM1=1;
else
PWM1=PWM1-1;
delay(200);
}
/*------------------------------------------------
串口和定时器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)
{
switch(temp)//判断temp从串口读取到的数据
{
case 0x01: //如果是0x01 总开灯
turn_on();
// temp=0;
break;
case 0x02: //如果是0x02 总关灯
turn_off();
// temp=0;
break;
case 0x03: //如果是0x03 开白灯
Wturn_on();
// temp=0;
break;
case 0x04: //如果是0x04 关白灯
Wturn_off();
// temp=0;
break;
case 0x05: //如果是0x05 开黄灯
Yturn_on();
// temp=0;
break;
case 0x06: //如果是0x06 关黄灯
Yturn_off();
// temp=0;
break;
case 0x07: //如果是0x07 调亮白灯
TR0=1;
Wturn_up();
// temp=0;
break;
case 0x08: //如果是0x08 调暗白灯
TR0=1;
Wturn_down();
// temp=0;
break;
case 0x09: //如果是0x09 调亮黄灯
TR0=1;
Yturn_up();
// temp=0;
break;
case 0xa0: //如果是0xa0 调暗黄灯
TR0=1;
Yturn_down();
// temp=0;
break;
}
}
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
temp=SBUF; //读入缓冲区的值
SBUF=temp1;
temp1=0;
}
if(TI) //如果是发送标志位,清零
TI=0;
}
/*------------------------------------------------
定时器0中断
------------------------------------------------*/
void timer0() interrupt 1
{
TH0=(65535-500)/256;
TL0=(65535-500)%256;
num0++;
num1++;
if(temp==0x07||temp==0x08) //去除其他状态的干扰
{
ctrl_PWM0();
}
if(temp==0x09||temp==0xa0)
{
ctrl_PWM1();
}
}
|