1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
| #include
#define ShowPort P2
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; //定义接收到数据的高位变量
***it RunLed=P1^0; //定义运行指示灯变量位
***it RecvLed=P1^1; //定义接收指示灯变量位
***it InTimeLed=P1^2; //定义定时器开始指示灯变量位
***it ReadyLed=P1^3; //定义就绪指示灯变量
***it IR1=P3^3; //定义红外接收端口
void Timer0_IR1() interrupt 1 using 3 //定义红外定时器子程序
{
TH0=0xE0; //向定时器定时间寄存器填入高八位值
TL0=0x18; //向定时器定时间寄存器填入低八位值
InTimeLed=!InTimeLed; //将定时器指示灯进行取反
AddData++; //自增变量加1 25us加1
}
void Int1_IR1() interrupt 2 //定义红外接收中断子程序
{
RecvLed=!RecvLed; //将红外接收数据进行取反
ReadyLed=1; //红外接收数据指示灯置1
if(1==AddData) //0 //判断接收到的数据是0
{
RecvData=RecvData | 0; //判断到0 就将当前位写0
RecvData=RecvData << 1; //将当前位向左移动1 位
}
else if(2==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 64: //9 //说明按下了数字9 键
{ShowPort= LedShowData[8]; //数码管显示数字9
break; //返回
}
case 14: //8 //说明按下了数字8 键
{ShowPort= LedShowData[7]; //数码管显示数字8
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()
{
bit ExeFlag=0; //定义可执行位变量
RecvData=0; //将接收变量数值初始化
CountData=0; //将计数器变量数值初始化
AddData=0; //将定时器计数器初始化
HeardData=0; //将高低计数器初始化
LedFlash=3000; //对闪灯数据进行初始化
TMOD=0x01; //选择定时器0 为两个16 位定时器
TH0=0xE0; //对定时器进行计数值进行初始化
TL0=0x18; //同上,时间大约为1mS
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
}
}
|