[求助]
请问这道程序哪里错了?好像不能进这个if语句 if(HeardData==226 || HeardData==112)
#include
//包含51单片机相关的头文件
unsigned char code LedShowData[]= //定义数码管显示数据
{0x9F,0x25,0x0D,0x99,0x49, //1,2,3,4,5,
0x41,0x1F,0x01,0x19,0x03}; //6,7,8,9,0,
static unsigned int RecvData; //定义接收红外数据变量
static unsigned char CountData; //定义红外个数计数变量
static unsigned char AddData; //定义自增变量
static unsigned int LedFlash; //定义闪动频率计数变量
unsigned char HeardData; //定义接收到数据的高位变量
sbit RunLed=P1^0; //定义运行指示灯变量位
sbit RecvLed=P1^1; //定义接收指示灯变量位
sbit InTimeLed=P1^2; //定义定时器开始指示灯变量位
sbit ReadyLed=P1^3; //定义就绪指示灯变量
sbit IR1=P3^3; //定义红外接收端口
#define ShowPort P2 //定义数码管显示端口
void Timer0_IR1() interrupt 1 using 3 //定义红外定时器子程序
{
TH0=0xFF; //向定时器定时间寄存器填入高八位值
TL0=0x19; //向定时器定时间寄存器填入低八位值
InTimeLed=!InTimeLed; //将定时器指示灯进行取反
AddData++; //自增变量加1
}
void Int1_IR1() interrupt 2 //定义红外接收中断子程序
{
//ShowPort=LedShowData[8];
RecvLed=!RecvLed; //将红外接收数据进行取反
ReadyLed=1; //红外接收数据指示灯置1
if(4==AddData) //0 //判断接收到的数据是0
{
RecvData=RecvData | 0; //判断到0就将当前位写0
RecvData=RecvData << 1; //将当前位向左移动1位
}
else if(8==AddData)//1 //判断接收到的数据是1
{
RecvData=RecvData | 1; //将当前位写1
RecvData=RecvData << 1; //将当前位向左移动1位
}
CountData++; //将红外接收位计数器加1
if(CountData==8) //判断是否接收到8位数据
{
HeardData=RecvData; //是8位数据时,则将数据暂存到高位变量中
}
else if(CountData==16) //判断是否接收到16位数据
{
ET0=0; //关闭红外定时器0
EX1=0; //关闭红外外部中断1
AddData=0; //定时时间间隔变量清零
if(HeardData==226 || HeardData==112)//判断用户码是否正确
{ ReadyLed=0; //用户码正确则就绪指示灯点亮一下
HeardData=RecvData; //取出接收到的低八位数据
switch(HeardData) //判断低八位数据的值下列那一位
{
case 32: //电源 //说明按下了电源键
{ //在这里填写你自己的代码 //根据你的功能自己写
break; //返回
}
case 46: //TV/AV //说明按下了TV/AV键
{ //在这里填写你自己的代码 //根据你的功能自己写
break; //返回
}
case 0: //1 //说明按下数字1键
{ShowPort= LedShowData[0]; //数码管显示数字1
break; //返回
}
case 8: //2 //说明按下了数字2键
{ShowPort= LedShowData[1]; //数码管显示数字2
break; //返回
}
case 4: //3 //说明按下了数字3键
{ShowPort= LedShowData[2]; //数码管显示数字3
break; //返回
}
case 12: //4 //说明按下了数字4键
{ShowPort= LedShowData[3]; //数码管显示数字4
break; //返回
}
case 2: //5 //说明按下了数字5键
{ShowPort= LedShowData[4]; //数码管显示数字5
break; //返回
}
case 10: //6 //说明按下了数字6键
{ShowPort= LedShowData[5]; //数码管显示数字6
break; //返回
}
case 6: //7 //说明按下了数字7键
{ShowPort= LedShowData[6]; //数码管显示数字7
break; //返回
}
case 14: //8 //说明按下了数字8键
{ShowPort= LedShowData[7]; //数码管显示数字8
break; //返回
}
case 64: //9 //说明按下了数字9键
{ShowPort= LedShowData[8]; //数码管显示数字9
break; //返回
}
case 72: //0/30 //说明按下0/30键
{ShowPort= LedShowData[9]; //数码管显示数字0
break; //返回
}
case 68: //10+ //说明按下10+键
{//在这里填写你自己的代码 //根据你的功能写代码
break; //返回
}
case 76: //20+ //说明按下了20+键
{//在这里填写你自己的代码 //根据你的功能写代码
break; //返回
}
case 36: //CH- //说明按下了CH-键
{//在这里填写你自己的代码 //根据你的功能写代码
break; //返回
}
case 40: //CH+ //说明按下了CH+键
{//在这里填写你自己的代码 //根据你的功能写代码
break; //返回
}
}
}
RecvData=0; //将接收到的数据清零
CountData=0; //将接收计数器清零
HeardData=0; //将接收高低数据变量清零
return; //返回
}
AddData=0; //将定时器计数器清零
ET0=1; //打开定时器中断
}
void main(void) //主程序入口
{
bit ExeFlag=0; //定义可执行位变量
RecvData=0; //将接收变量数值初始化
CountData=0; //将计数器变量数值初始化
AddData=0; //将定时器计数器初始化
HeardData=0; //将高低计数器初始化
LedFlash=3000; //对闪灯数据进行初始化
TMOD=0x01; //选择定时器0为两个16位定时器
TH0=0xFF; //对定时器进行计数值进行初始化
TL0=0x19; //同上,时间大约为25uS
TR0=1; //同意开始定时器0
EX1=1; //同意开启外部中断1
IT1=1; //设定外部中断1为低边缘触发类型
EA=1; //总中断开启
while(1) //程序主循环
{
while(LedFlash--) //闪灯总延时
{
if(IR1==0) //判断延时期间是否有红外信号输入
{ExeFlag=1; //将可执行标志位置1
}
}
RunLed=!RunLed; //运行指示灯取反
LedFlash=3000; //运行闪动时间重设定
if(ExeFlag==0) //判断可执行标志位
{
EX1=1; //开启外部中断1
}
ExeFlag=0; //可执行标志位置0
}
}
暂无评论,赶紧抢沙发吧