//红外解码,实验板测试正常,8位数码管显示遥控编码(用户码,用户反码,右边3位数码管显示PWM值),
//两片74hc573驱动8位共阴数码管
//CH-键短按开关灯,+键长按调光,数码管显示键值;长按调光的解码程序目前网上很难找到,我琢磨了很久才把程序调通//压缩包里有完整的程序代码,有逻辑分析仪测试的连发码的波形
单片机源程序如下:
#include "INCSTC89C52RC.H"
#include "INCMY_SET.H"
#include "INCIR_NEC.H" //调用NEC解码头文件
#define DIGI_PORT P0 // 宏定义数码管端口,如果端口改变,只需修改这一句即可
#define DIGI_NUM 8 // 宏定义数码管个数
unsigned char digiBuf[DIGI_NUM]; //数码管缓冲区
sfr SE = 0x80; //数码管段选 P0:0x80 P1:0x90
sbit wela = P2^7; //位选
sbit dula = P2^6; //段选
sbit led = P1^2;
uint8 PWM_Val=200; //占空比 变量
uint8 flag; //开关灯标志
uint8 flag1;//调光方向标志
uint8 count;
uint8 flag2; //
uint8 num,pwm;
// 0 1 2 3 4 5 6 7 8 9 A B C D E F 不显 -
uint8 code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40}; //数码管段码 共阴不带小数点段码
void KZ0(); //短按处理
//void KZ1(); //长按处理
/***************** 主函数 ********************/
void main(void)
{
IR_Init(); //红外线解码初始化
while(1)
{
//遥控检测
if(IR_BT==2)
{
KZ0(); //短按处理
IR_BT =0; //清有效标志
//更新显示
digiBuf[0] = NEC[0]/16; //用户码
digiBuf[1] = NEC[0]%16;
digiBuf[2] = NEC[1]/16; //用户反码
digiBuf[3] = NEC[1]%16;
// digiBuf[4] = NEC[2]/16; //数据码
// digiBuf[5] = NEC[2]%16;
// digiBuf[6] = NEC[3]/16; //数据反码
// digiBuf[7] = NEC[3]%16;
}
digiBuf[4] = 16; //不显
digiBuf[5] = PWM_Val/100; //显示pwm值
digiBuf[6] = PWM_Val%100/10;
digiBuf[7] = PWM_Val%10;
if(IR_BT==3 && KeyUpDownFlag==0 ) //长按调光,松手停止调光
{
switch(NEC[2])
{ //长按接收的是连发码,97.11ms高电平,10.15ms低电平
case 0x15: if(IR==1) //if(IR==0)
{
KeyUpDownFlag=1; //如果按键抬起,松手标志置1
}
if(flag1==1 && flag==0) // 开灯状态 +键 长按连加 亮度加
{
if(PWM_Val<200)
{
PWM_Val++; // if(IR==1)用这句
// PWM_Val += 5; //if(IR==0)用这句 加5 灯亮度变化才明显
if(PWM_Val==200)
flag1=0;
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』