电路原理图
(原文件名:未命名.jpg)
过零检测信号接INT1 ,波形正常,将P1.6高地电平,可控硅调光电路灯能亮灭,但是接入单片机后,按键无法控制p1.6的电平,程序代码如下,是在51单片机开发的一本书上搜来的,请高手看下程序哪有问题,刚学,求大大指教
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
#define LOW 0 /* 低电平 */
#define HIGH 1 /* 高电平 */
#define DEVIBRATE_FACTOR 0x03 /* 去抖动因子 */
sbit LIGHT=P1^6; /* 调光灯触发端 */
sbit LIGHT_KEY=P1^0; /* 调光灯按键 */
bit LIGHT_KEYold; /* 按键去抖变量 */
bit LIGHTState; /* 调光标志位,0:开关状态,1:调光状态 */
bit LIGHTSwitch; /* 开灯标志位 */
bit LIGHTKeyPress; /* 当前时刻按键状态 */
bit LIGHTKeyPressOld; /* 前一时刻按键状态 */
bit LIGHTDimmer; /* 调光过程,0:渐亮,1:渐暗 */
uint LIGHTValueH,LIGHTValueL; /* 调光定时器初值 */
uint LIGHT_KEYcounter; /* 去抖动数 */
uint LIGHTNum; /* 按键时长计数值 */
uint LIGHTLevel; /* 调光灯亮度等级 */
uint idata LIGHTValue; /* 调光初值 */
/* Function Definitions */
void Initialize(void); /* 初始化单片机 */
void Check(); /* 检查按键和灯所处状态 */
void delay6ms (void); /* 延时6毫秒 */
void main()
{
Initialize();
do
{
Check();
}
while(1);
}
void Initialize(void)
{
T2CON=0x00;
/* TIMER2.用于调光灯的驱动. */
PT0=1;
IT1=1;
TR0=0;
TR2=0;
ET0=1;
ET2=1;
EX1=1;
EA=1;
EX0=1;
LIGHTState=0;
LIGHTSwitch=0;
LIGHTNum=0;
}
/*-----------------------------------------------*/
void Check(void) /* 检查按键和灯所处状态 */
{
LIGHT_KEY=HIGH; /* 确保各苏茹管脚处在输入状态 */
if(LIGHT_KEY==LOW)
{
if(LIGHT_KEYold==HIGH)
{
delay6ms();
if(LIGHT_KEY==LOW) /* 灯调光键按下,”LOW” 为有效点评. */
{
if(LIGHT_KEYcounter>DEVIBRATE_FACTOR)
{
LIGHTKeyPress=1;
LIGHT_KEYold=LOW;
LIGHT_KEYcounter=0;
}
else LIGHT_KEYcounter++;
}
else LIGHT_KEYcounter=0;
}
else
{
LIGHTKeyPress=1;
LIGHT_KEYcounter=0;
}
}
else
{
if(LIGHT_KEYold==LOW)
{
delay6ms();
if(LIGHT_KEY==HIGH) /* 灯调光键抬起. */
{
if(LIGHT_KEYcounter>DEVIBRATE_FACTOR)
{
LIGHTKeyPress=0;
LIGHT_KEYold=HIGH;
LIGHT_KEYcounter=0;
}
else LIGHT_KEYcounter++;
}
else LIGHT_KEYcounter=0;
}
else
{
LIGHTKeyPress=0;
LIGHT_KEYcounter=0;
}
}
}
/*-----------------------------------------------*/
ServiceINT1() interrupt 2 using 1
{
/*过零检测时间到. */
TR2=0;
LIGHT=HIGH;
/*调光灯触发端关闭. */
if(LIGHTKeyPress==1) /* 调光键在按下. */
{
LIGHTKeyPressOld=1;
if(LIGHTState==0) /* 调光灯处在开关状态 */
{
if(LIGHTNum>=0x32) /* 调光按键长时按下. */
{
LIGHTState=1;
/* 调光灯切换至调光状态 */
LIGHTLevel|=0x10;
LIGHTNum=0;
}
else LIGHTNum++;
}
else /* 调光灯处在调光状态 */
{
if(LIGHTSwitch==0)
{
if(LIGHTNum>=0x42)
{
LIGHTSwitch=1;
LIGHTNum=0;
}
else LIGHTNum++;
}
else
{
if(LIGHTDimmer==0) /* 进入调亮灯光过程 */
{
if(LIGHTValue>0xffe0) /* 灯光最亮定时器限度 */
LIGHTDimmer=1;
/* 设置调暗灯光标志 */
else LIGHTValue+=0x13;
/* 增加定时器初值 */
}
else /* 进入调暗灯光过程 */
{
if(LIGHTValue<0xe000) /* 灯光最暗定时器限度 */
{
LIGHTDimmer=0;
/* 设置调亮灯光标志 */
LIGHTSwitch=0;
LIGHTNum=1;
}
else LIGHTValue-=0x13;
/* 减少定时器初值 */
}
}
}
}
else /* 调光键已抬起 */
{
if(LIGHTKeyPressOld==1) /* 调光键刚抬起 */
{
LIGHTKeyPressOld=0;
LIGHTNum=0;
if(LIGHTState==0) /* 调光键抬起前为开关状态. */
{
if(LIGHTSwitch==0)
{
LIGHTSwitch=1;
/* 调光灯设置为开. */
LIGHTLevel|=0x10;
}
else
{
LIGHTSwitch=0;
/* 调光灯设置为关 */
LIGHTLevel&=0xef;
}
}
else /* 调光键抬起前为调光状态. */
{
LIGHTState=0;
/* 调光键恢复为开关状态. */
LIGHTLevel&=0x10;
if(LIGHTValue>0xe000)
LIGHTLevel+=(LIGHTValue-0xe000)/0x01fe;
else LIGHTLevel+=0;
LIGHTValueH=LIGHTValue>>8;
LIGHTValueL=LIGHTValue&0xff;
EX0=1;
}
}
}
LIGHTValueH=LIGHTValue>>8;
/* 打开本次过零周期的定时器. */
LIGHTValueL=LIGHTValue&0xff;
TH2=LIGHTValueH;
TL2=LIGHTValueL;
TR2=1;
}
/*-----------------------------------------------*/
void delay6ms (void)
{
int delaycnt;
for(delaycnt=0;delaycnt<=460;delaycnt++);
}
/*-----------------------------------------------*/
void ServiceTimer2() interrupt 5 using 1
{
if(LIGHTSwitch==1)
LIGHT=LOW;
/* 触发调光灯晶闸管 */
TR2=0;
TF2=0;
}
一周热门 更多>