(LED学习板)实验31-红外遥控解码 数码管显示键值
//============================================================================//======翼芯科技 红外遥控解码 数码管显示键值==指拨开关SW2的1位拨向下==========
//============================================================================
//此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
// 严禁随意用于商业目的,违者必究,后果自负
// 公司网站 http://www.mcu-led.com
// 公司论坛 http://www.cpu-led.com
// 淘宝店:http://cpu-led.taobao.com/和http://mcu-led.taobao.com/
// 产品咨询 QQ :1322130074 电话:13715619122
//程序说明:本程序用于实现红外遥控解码 数码管显示键值.IC插到U9位置.指拨开关SW2的1位拨向下.
//文件名称:main.C
//日期: 2011/01/23
//版本: 1.0
//C编译器:keil 8.05
//=============================================================================
#include <STC12C5AXX.H>
#define uchar unsigned char
#define uint unsigned int
#define BIT_32 32
sbitLED1 = P0^0;
sbitLED2 = P0^1;
sbitLED3 = P0^2;
sbitLED4 = P0^3;
sbitIRIN = P3^7;
sbit CLK= P2^3; //74HC595时钟输出
sbit DAT= P2^1; //74HC594数据输出
sbit RCLK = P2^2; //数据锁存
sbit EN = P2^7; //74HC595使能口
bit SYNOK,ADDROK,FLAGERR,LOK,FLAG_1MS;
unsigned long int BYTE1;
ucharLCOUNT,HCOUNT,HLCOUNT,BITCOUNT,CODE_NUM;
uchar T_CNT3;
uchar T_CNT4;
uchar DIS_CNT1,DIS_CNT2;
uchar code DSY_CODE[]= //数据管共阴的显示值0-F
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
/******************************************************************
- 功能描述:74HC595输出函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void sendbyte(uchar BYTE)
{
uchar num,i; //定义局部变量
num=BYTE;
for(i=0;i<8;i++) //移8次
{
CLK=0; //CLK置1
DAT=num&0x80; //数据左移
num=num<<1;
CLK=1;
}
RCLK=0; //数据锁存
RCLK=1;
}
/******************************************************************
- 功能描述:定时器0中断
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void TIME0_INT() interrupt 1
{
TH0= (65535-200)/256;
TL0= (65535-200)%256;
sendbyte(0xFF);
if(FLAG_1MS)
{
P0=(DSY_CODE);
sendbyte(0XFD);
FLAG_1MS=0;
}
else
{
P0=(DSY_CODE);
sendbyte(0xFE);
FLAG_1MS=1;
}
//=====================检测高电平====================================================
if(IRIN==0)
{
LCOUNT++; //高电平计数器++
if(LOK==1) //第一个高电平
{
LOK=0;
if(SYNOK==1) //同步码 Ok
{
HLCOUNT=LCOUNT+HCOUNT; //检测高低计数值判定
if((3<HLCOUNT)&&(HLCOUNT<40)); //高低电平小于2560,大于1152,ok; 18
else
{
FLAGERR=1; //错误退出
return;
}
if(12<HCOUNT)
BYTE1=(BYTE1>>1)|0x80000000; //为1
else
BYTE1=(BYTE1>>1)|0x00000000; //为0
LCOUNT=0;
HCOUNT=0;
BITCOUNT--;
if(BITCOUNT==0) //解出了一次码
{
SYNOK=0; //同步清零
BITCOUNT=BIT_32; //码的位数
ADDROK=1; //解码成功标识
}
}
else
{
if((10<HCOUNT)&(HCOUNT<60)) //低电平大于6.4ms,小于12.8ms,同步码电平ok; 80-100,OK
{
SYNOK=1;
LCOUNT=0;
HCOUNT=0;
}
else
{
FLAGERR=1;
}
}
}//end LOK
}//END IRIN==0;
else //检测高电平的宽度==低电平计数
{
HCOUNT++;
if(LOK==1)
return;
if(SYNOK)
{
if((1<LCOUNT)&(LCOUNT<25)) //低电平大于256us,小于2048,高电平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
}
else
{
if((60<LCOUNT)&(LCOUNT<120)) //低电平大于6MS,小于9MS, 同步低电平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
} //END ELSE
} //EDN ELSE
}
/******************************************************************
- 功能描述:主函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
voidmain()
{
TMOD = 0x01; //定时器0工作在16位的定时模式.
TH0= (65535-200)/256; //定时器0高位设定
TL0= (65535-200)%256; //定时器0低位设定
IE = 0x82; //开总中断和定时器0中断
TR0= 1; //开定时器0
//M1:M00:0为标准51;0:1输出;1:0输入;1:1开漏输出
P0M1=0X00; //P0口设为推挽输出
P0M0=0XFF;
P3M1=0X80; //P3.7为输入
P3M0=0X00;
EN=0;
P0=0;
while(1)
{
if(FLAGERR==1) //解码失败,初始化参数
{
LCOUNT=0;
HCOUNT=0;
LOK=0;
FLAGERR=0;
SYNOK=0;
BITCOUNT=BIT_32;
}
if(ADDROK==1)
{
ADDROK=0;
CODE_NUM=(BYTE1>>24);
DIS_CNT2=CODE_NUM&0X0F;
DIS_CNT1=CODE_NUM>>4;
}//EDN ADDROK
}//END WHILE
页:
[1]