📄 红外线遥控器软件解码原理和程序(c语言)--单片机开发基地.htm
字号:
c;<BR> unsigned char data
*p1[4];<BR> unsigned int data
*p2[4];<BR> unsigned char xdata
*p3[2];<BR> unsigned int xdata
*p4[2];<BR>}I;<BR>unsigned char ir_key;<BR>bit
ir_flag; //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出<BR>void
sub(void);<BR>void delay(void);<BR>void ie_0(void);<BR>void
tf_0(void);<BR>void ie_1(void);<BR>void tf_1(void);<BR>void
tf_2(void);<BR>void read_ir(void);<BR>void
ir_jiema(void);<BR>void ir_init(void);<BR>void
ir_exit(void);<BR>void store_ir(void);<BR>void
read_key(void);<BR>void reset_iic(void);<BR>unsigned char
read_byte_ack_iic(void);<BR>unsigned char
read_byte_nack_iic(void);<BR>bit write_byte_iic(unsigned
char a);<BR>void send_ack_iic(void);<BR>void
send_nack_iic(void);<BR>bit receive_ack_iic(void);<BR>void
start_iic(void);<BR>void stop_iic(void);<BR>void
write_key_data(unsigned char a);<BR>unsigned int
read_key_data(unsigned char a);<BR>void
ie0(void) interrupt 0{ie_0();}<BR>void
tf0(void) interrupt 1{tf_0();}<BR>void
ie1(void) interrupt 2{ie_1();}<BR>void
tf1(void) interrupt
3{tf_1();tf_2();}<BR>void
tf2(void) interrupt
5{ //采用中断方式跟查询方式相结合的办法解码<BR> EA=0; //禁止中断<BR> if(TF2){ //判断是否是溢出还是电平变化产生的中断<BR> TF2=0; //如果是溢出产生的中断则清除溢出位,重新开放中断退出<BR> EA=1;<BR> goto
end;<BR> }<BR> EXF2=0; //清除电平变化产生的中断位<BR> *ir=RCAP2H; //把捕捉的数保存起来<BR> ir++;<BR> *ir=RCAP2L;<BR> *ir++;<BR> F0=1;<BR> TR0=1; //开启计数器0<BR>loop:<BR> TL0=0; //将计数器0重新置为零<BR> TH0=0;<BR> while(!EXF2){ //查询等待EXF2变为1<BR> if(TF0)goto
exit; //检查有没超时,如果超时则退出<BR> };<BR> EXF2=0; //将EXF2清零<BR> if(!TH0) //判断是否是长低电平脉冲过来了<BR> { //不是长低电平脉冲而是短低电平<BR> if(F0)count.b++; //短脉冲数加一<BR> temp.a[0]=RCAP2H; //将捕捉数临时存放起来<BR> temp.a[1]=RCAP2L;<BR> goto
loop; //返回继续查询<BR> }<BR> else{ //是低电平脉冲,则进行处理<BR><BR> F0=0;<BR> *ir=temp.a[0]; //把连续的短脉冲总时间记录下来<BR> ir++;<BR> *ir=temp.a[1];<BR> ir++;<BR> *ir=RCAP2H; //把长电平脉冲时间记录下来<BR> ir++;<BR> *ir=RCAP2L;<BR> ir++;<BR> if(ir>=0xda)
{<BR> goto
exit; //判断是否溢出缓冲,如果溢出则失败退出<BR> }<BR> goto
loop; //返回继续查询<BR> }<BR>exit:<BR> ir_flag=1; //置ir_flag为1表示接收成功<BR>end:<BR> ;<BR>}<BR><BR><BR>void
rs232(void) interrupt 4{<BR> static
unsigned char
sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收<BR>发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节<BR> EA=0; //禁止中断<BR> if(RI){<BR> RI=0; //清除接收中断标志位<BR> sbuf1=SBUF; //将接收缓冲的字符复制到sbuf1<BR> if(sbuf1==HEAD){ //判断是否帧开头<BR> state1=10; //是则把state赋值为10<BR> buf1=RECEIVE; //初始化接收地址 <BR> }<BR> else{<BR> switch(state1){<BR> case
10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节<BR> sbuf2=~sbuf2; //把低半字节取反<BR> if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确<BR> { //接收错误,有可能接收的是数据帧尾,也有可能是接收错误<BR> if(sbuf1==TAIL) //判断是否接收到数据帧尾<BR> { //是接收到数据帧尾<BR> buf1=RECEIVE; //初始化接收的地址<BR> if(*buf1==RESET) //判断是否为复位命令<BR> {<BR> ES=0;<BR> sbuf2=SP+1;<BR> for(p.p1[0]=SP-0x10;p.p1[0]<=sbuf2;p.p1<BR>[0]++)*p.p1[0]=0;<BR> }<BR> state1=0; //将接收状态标志置为零,接收下一个数据帧<BR> buf1_flag=1; //置接收标志为1,表示已经接收到一个数据帧<BR> REN=0; //禁止接收<BR> }<BR> else<BR> { //不是接受到数据帧尾,表明接收错误<BR> state1=0; //
将接收状态标志置为零,重新接收<BR> buf1=RECEIVE; //初始化发送的地址<BR> *buf1=NACK; //把NACK信号存入接收缓冲里<BR> buf1_flag=1; //置标志位为1,使主程序能对接收错误进行处理<BR> REN=0; //禁止接收<BR> }<BR><BR> }<BR> else<BR> { //接收正确<BR> rsbuf1=~sbuf1; //按位取反,使高半字节变原码<BR> rsbuf1&=0xf0; //仅保留高半字节,低半字节去掉<BR> state1=20; //将状态标志置为20,准备接收低半字节<BR> }<BR> break;<BR> case
20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节<BR> sbuf2=~sbuf2; //将低半字节取反<BR> if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确<BR> { //接受错误<BR> state1=0; //
将接收状态标志置为零,重新接收<BR> buf1=RECEIVE; //初始化接收的地址<BR> *buf1=NACK; //把NACK信号存入发送缓冲里<BR> buf1_flag=1; //置标志位为1,使主程序能对接收错误进行处理<BR> REN=0; //禁止接收<BR> }<BR> else<BR> {<BR> sbuf1&=0x0f; //仅保留低半字节,去掉高半字节<BR> rsbuf1|=sbuf1; //高低半字节合并<BR> *buf1++=rsbuf1; //将接收的数据保存至接收缓冲里,并且数据指针加一<BR> buf1_length++; //接收数据长度加一<BR> state1=10; //将state1置为10,准备接收下个字节的高半字节<BR> }<BR> break;<BR><BR> }<BR> }<BR><BR><BR><BR> }<BR> else{<BR><BR> TI=0; //清除发送中断标志<BR> if(buf2_length) //判断发送长度是否为零<BR> { //发送长度不为零<BR> if(state2==0) //判断是否发送高半字节<BR> { //发送高半字节<BR> sbuf2=*buf2; //将要发送的字节送到sbuf2<BR> rsbuf2=~sbuf2; //取反,使高半字节变为反码<BR> sbuf2>>=4; //将高半字节右移到低半字节<BR> rsbuf2&=0xf0; //保留高半字节,去掉低半字节<BR> sbuf2&=0x0f; //保留低半字节,去掉高半字节<BR> rsbuf2|=sbuf2; //合并高低半字节<BR> SBUF=rsbuf2; //发送出去<BR> state2=10; //将state2置为10准备发送下半字节<BR> }<BR> else<BR> { //发送低半字节<BR> sbuf2=*buf2; //将要发送的字节送到sbuf2<BR> buf2++; //指针加一<BR> buf2_length--; //发送数据长度减一<BR> rsbuf2=~sbuf2; //取反,使低半字节变为反码<BR> rsbuf2<<=4; //将低半字节反码左移到高半字节<BR> rsbuf2&=0xf0; //保留高半字节,去掉低半字节<BR> sbuf2&=0x0f; //保留低半字节,去掉高半字节<BR> rsbuf2|=sbuf2; //合并高低半字节<BR> SBUF=rsbuf2; //发送出<BR> state2=0;<BR> }<BR> }<BR> else<BR> { //如果发送数据长度为零则发送数据帧尾<BR> if(buf2_flag){ //判断是否发过数据帧尾<BR> SBUF=TAIL; //将数据帧尾发送出去<BR> while(TI==0);<BR> TI=0;<BR> buf2_flag=0; //置发送标志为零,表示发送完毕<BR> }<BR> }<BR> }<BR> EA=1; //开放中断<BR>}<BR><BR></P>
<P align=center>欢迎大家进入<A href="http://www.mcubase.com/bbs"
<a><FONT color=#ff0000>基地论坛</A><FONT
color=#000000>讨论!</FONT></P>
<P align=center></FONT> 添加时间:<FONT
color=#ff0000>2007-2-6</FONT> 阅读:<FONT
color=#ff0000>3136</FONT>次</FONT></P></BLOCKQUOTE></DIV>
<CENTER></CENTER><BR>
<P align=right><IMG
src="红外线遥控器软件解码原理和程序(C语言)--单片机开发基地.files/copy.gif"> <A
href="javascript:copyText(document.all.size)">复制</A> <IMG
src="红外线遥控器软件解码原理和程序(C语言)--单片机开发基地.files/print.gif"> <A
href="javascript:window.print()">打印</A> </P>
<TABLE>
<TBODY>
<TR>
<TD height=5></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD height=5></TD></TR></TBODY></TABLE> 上一篇:<A
href="http://www.mcubase.com/showproject.asp?id=270">一种精密的热电阻测温方法</A>
<TABLE>
<TBODY>
<TR>
<TD height=5></TD></TR></TBODY></TABLE> 下一篇:<A
href="http://www.mcubase.com/showproject.asp?id=272">用户自定制LED驱动器的设计</A>
<TABLE>
<TBODY>
<TR>
<TD height=5></TD></TR></TBODY></TABLE></TD>
<TD class=4midright></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=4leftfoot></TD>
<TD class=4midfoot></TD>
<TD class=4rightfoot></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD height=5></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=5topleft></TD>
<TD class=5topmid> <IMG class=st_title src=""> <FONT
class=titlefont>相关搜索</FONT><SPAN style="WIDTH: 0px"></SPAN><A
title="" href="http://www.mcubase.com/"></A></TD>
<TD class=5topright></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=5midleft></TD>
<TD class=5midmid vAlign=top height=60>
<TABLE>
<TBODY>
<TR>
<TD height=25><A
title="百度搜索 <font color=red>红外线遥控器软件解码原理和程序(C语言)</font> 相关内容"
href="http://www.baidu.com/s?wd=红外线遥控器软件解码原理和程序(C语言)&tn=huajun"
target=_blank> <IMG
src="红外线遥控器软件解码原理和程序(C语言)--单片机开发基地.files/baidu.gif"
border=0>中“红外线遥控器软件解码原理和程序(C语言)”相关内容</A>
</TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD height=25><A
title="Google搜索 <font color=red>红外线遥控器软件解码原理和程序(C语言)</font> 相关内容"
href="http://www.google.com/search?hl=zh-CN&ie=GBK&oe=GBK&lr=lang_zh-CN&&q=红外线遥控器软件解码原理和程序(C语言)"
target=_blank> <IMG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -