|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& J, r" b, N' m- j4 }
采用STC的51单片机,STC12C5A60S2,可以直接串口编程,而且是1T的,非常方便。
9 q! e/ O( a) _. h
8 Y9 p1 @% m2 G: P: ?0 c! L Q一、红外遥控器读码
E' q+ G* z" k0 o. c# h读码程序没怎么修改就成功了。
) H/ j2 E2 d# H3 g注意:这里的延时程序是STC12C5A60S2的,如果用别的单片机,需要修改。7 P* d$ |6 t/ f. u8 v2 }" t
/ P; A# Y6 \ P3 Q
#include <STC\STC12C5A60S2.H>! j* h- Y2 } W* Q* [9 u+ R
#include <INTRINS.h>
# C+ U. L5 E& p9 V3 K
/ g: N& N R4 K: g1 n+ [6 S9 r" Y//采用1T周期的STC12C5A60S2单片机,11.0592MHZ7 K' ?& v3 e v j7 t
//WXL:一体化接收头默认是输出高电平,有信号时输出低电平;接P3.2脚。
5 Q" w5 }9 m h; o3 B! e//WXL:这里按“低位在先”
( m' J/ n& e7 r" H- }* y& h: |3 g8 n2 @5 r. p6 `
/******************************************************************/
+ |5 S; Z# K5 b8 L8 [: l/* 本程序的蓝本从网上搜集,经修改并注释,万能遥控器解码成功 */% ]" w. |8 j7 u( C
/* 晶振:11.0592MHz */
/ Q* R a) U' e3 |- Q; [/* 整理与测试:单片机教程网 胡琴 2012.5.15 */
/ e/ N4 M! @# v. {2 c9 W) a/************************* 说 明 *********************************/
# g4 c, I' W; Z/* 以一个9ms的低电平和4.5ms的高电平为引导码,后跟32位二进制代码 */
" V) T/ o" u9 N1 ]" Y% P D7 x5 J/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码 */
& \5 n/ V% \$ B/* 以脉宽为低电平0.565ms、间隔高电平0.56ms、周期为1.125ms的组合表示"0"; */! E! O7 Q$ M' h7 C# ~( X
/* 以脉宽为低电平0.565ms、间隔高电平1.685ms、周期为2.25ms的组合表示"1"。 */
% Z4 P7 v+ A B/ m/ p8 G/* 注意:接收码的脉宽与间隔是对发射码取反的,即间隔是0.565ms */" \! x8 m! b7 J! O# r, M
/* 解码后共有四个十六进制码,本程序取第三个作为识别码 */2 B0 Y, M3 I h; I6 w* y
/*******************************************************************/. c) f7 J5 _% t% h' R1 s
8 x' M8 Y+ _7 O9 F8 J$ B; D+ c#define uchar unsigned char
4 I! a- a- \; H/ muchar data IRcode[4]; //定义一个4字节的数组用来存储代码
4 }" m, m7 y1 P3 Ruchar CodeTemp; //编码字节缓存变量
" M; A3 j3 Q- {7 Yuchar i,j,k; //延时用的循环变量0 Z% O3 D, P B1 U
sbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)
$ \* h+ g. U$ ~# J1 P$ k! csbit P0_0=P0^0; //P0连接到 LED 上3 y0 n: w9 r( @: ?* ~
sbit P0_1=P0^1;
+ P6 w( [5 N _6 ?1 a$ ^sbit P0_2=P0^2;6 t' r% o R" ^; j! m1 y) v
2 L& g' P6 J. i$ W5 H, w
" ?6 Q" M8 z/ F; g* P1 Z- k
4 k6 d" H& G3 H; u0 c/**************************延时0.6ms子程序**********************/1 Z* G7 O4 H+ z# W5 J- n
void Delay0_6ms(void) //@11.0592MHz
; R4 P+ r* E8 @8 ^6 F{' O# `, t+ j; U5 ?! h! }2 H z
unsigned char i, j;" ~8 f* w/ q" O T0 c+ ~4 y0 X4 _
/ _/ @5 u' L Y% p8 }7 ~_nop_();* d1 }- x# N4 N4 d! p! \$ [
_nop_();% U# f0 ]" k; H
i = 7;
1 V( _0 W: R: |" uj = 112;8 i: e7 s) v6 ^% M& q9 ]
do
! t) e; v- W5 |' j2 v/ o" \1 I{
/ u, o1 [7 C: O' r, O6 \while (--j);
2 F: [, I; h' I* j4 {- t* Q |$ n} while (--i);
; S5 |, p( ?' P* Z! r/ s" g
, n$ W3 l: c" e, Z' R+ y9 ~; z/ h}# g1 N' I& c+ v9 [+ s
4 ?7 d3 V3 |9 J8 P! B, n( X
' D d, N7 V' P8 N9 N8 [/**************************延时0.9ms子程序**********************/
- {. `& \! _8 Z( t3 g; D. y. X" Nvoid Delay0_9ms(void) //@11.0592MHz
) J. @/ V& u4 T' G3 O{5 Y7 i$ C0 h7 p* M$ L" c& n. F
unsigned char i, j;8 h* v# I4 V" ^/ b. H
_nop_();" U% U5 f1 l o3 l" D
_nop_();
: D0 I3 t8 l9 [) c_nop_();
/ E- ?9 {9 G& D8 }9 ~/ Ji = 10;
+ Q! b7 e1 _. r e# ej = 170;
y. v$ ^7 M' f c5 z* ydo( L3 K b3 {2 A
{1 Y5 f5 H, ~! g. u9 h* T
while (--j);
" p. c5 {, o, e2 e' K7 R. G& L, O} while (--i);
/ S/ i" {( A2 R: T}
# |" }2 A Q& O2 w' F# |
1 a3 S' D* [* _8 k. \: D% M
! u- {3 z* w) m! ~7 J! N" j! y. E# v! d
9 U8 N) a1 Z2 G3 e$ v
/***************************延时1ms子程序**********************/
/ j: s- K" n7 c1 E. x1 }void Delay1ms(void), r) p5 [' n+ \: N8 D
{
3 ^& x" W, x3 V! Nunsigned char i, j;9 o* \; A+ h& M5 j/ \ g" z
; E8 C }* Z! S4 j( W( y5 N/ D_nop_();
) h/ k' }+ h+ W/ k# s4 Ki = 11;
# x% n) T) ]- M a/ d& Q" aj = 190;' h- k) k7 k) V
do$ B& Z& W" J8 A( r/ g& m/ W, O1 T1 _
{* h/ c! |3 d$ D6 `) i) l4 F
while (--j); B. @& Q( q- L8 N# G# Z0 R
} while (--i);
3 A7 z9 i; y" c/ |) x- L* \}/ X( X3 ^$ f P5 ]6 p+ ]* ^
+ Y. C0 e; B5 X( r" {" L/***************************延时4ms子程序**********************/
" Y3 l! ^9 m1 \$ N" U* hvoid Delay4ms(void)
2 T8 l2 z; A: L! M; L& G{5 i' h# K4 ?. u+ o3 v0 f* O
unsigned char i, j;( N8 r, W' K* p7 i% c
- j/ z( @1 v+ h j6 i7 r. r n/ q, ?' v
_nop_();
. e; k) P) Z7 j_nop_();8 F X1 S, H, J% A' `5 b
_nop_();
3 T1 ~. I9 B% g* B4 i; d3 A# di = 44;* G; K- y" H0 a: Q" _0 t
j = 3;1 ^/ P' Z& G! I$ o1 @/ c
do
- y( U! Q% F& N* K{
( K- l7 z2 p; qwhile (--j);
* s; G0 a' d- p. A2 c% X* X} while (--i);
^ s8 R! H: L% z$ x}
: ?; \0 I& F$ d R1 h+ V; L7 v! u$ m1 m6 k1 D: M q
/**************************** 延时子程序 ************************/$ g- w# g+ I4 i. A6 J1 m! g
void Delay(void)! L9 l& D4 H$ S D# p* }
{
' h3 ^$ S! B% q0 J6 ]" Buchar i,j,k;
! `- ?# W' Q+ h) @: p5 d3 Xfor(i=200;i>0;i--)
. r) N* T8 l4 _ k! Ufor(j=200;j>0;j--)
* J8 Q$ y1 x( Bfor(k=3;k>0;k--) ;7 d( [& N! ^7 ^( c
}" s" y5 H1 q* D$ Y# Q
U) T$ Y8 G! B" W3 M/******************** 中断0解码服务子程序 ********************/
& i w3 V5 D) D* @8 z6 U nvoid int0(void) interrupt 0 using 2
9 g4 j4 s) B; X{
, f1 M" v; ~/ ]% d5 H8 }: r% a6 PEA = 0; //??? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取& b& S- g" {0 I2 x+ \" {% W7 _
for(k=0;k<10;k++)2 D( J+ N; D F% ^* \
{" r: p1 G- h& a% k
Delay0_9ms();
3 Z- U- S- m. T+ Lif (IRsignal==1) //如果0.9ms后IRsignal=1,说明不是引导码,退出中断
! Z1 Z5 h( n3 b7 ^7 p( L6 X( a9 h{
3 z* G9 Q3 T' N: z2 C6 }* vk=10;
: S4 d& }9 r' Z- }7 nbreak;: w1 G1 o. w, ~8 b n9 G4 [
} J" _ M) n7 [% i
$ O/ u& K5 n/ {: D) C+ L
else if(k==9) //如果 持续了10×0.9ms=9ms的低电平,说明是引导码。WXL:一定是从引导码开始 j" E6 a3 ^0 y' u# d6 y. B
{
# j+ L2 k& ^1 z1 X9 N* [. Rwhile(IRsignal==0); // WXL:因为红外头默认输出是高电平,故用while(IRsignal==0)很安全,而用while(IRsignal==1)则可能会进入死循环3 i q1 e/ n1 ]% S7 |6 x
Delay4ms(); //跳过持续4.5ms的高电平 WXL:要超过4.5ms更好, M5 x2 U# J3 a$ Q$ M
Delay0_6ms();! I% E$ f. H+ ^2 {5 @. v! X. G
+ j7 _" L, ]0 U/ y9 T- Gfor(i=0;i<4;i++) //分别读取4个字节
: ?/ ?) Y+ \& }8 I" L0 f{$ W; O( p/ ~8 y+ J* T! l9 k
for(j=1;j<=8;j++) //每个字节8个bit的判断$ X- @ T+ c' L E3 A
{/ x/ }) M& F, e2 e! F8 U: M' [
while(IRsignal==0); //等待上升沿,此处用得很好:因为0.56ms的低电平(接收时)是代码0与1的相同部分- g T* _$ V9 r' T
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal/ N4 g* X; Z7 q/ ]$ O: M; n, U
if(IRsignal==1) // 如果IRsignal是"1",高位置"1",并向右移一位
1 g5 I) k8 B2 V0 T{
~$ X" ?% c8 [$ Q- B( l F% \Delay1ms(); //为什么要延时1ms呢?因为要使IRsignal跳至低电平(即0.56ms的0与1相同部分上)* ?, T% q) t# ]# u
CodeTemp=CodeTemp | 0x80; //此处的算法很好
! W; T7 P2 u) s: v% R3 B: A& y- {if(j<8) CodeTemp=CodeTemp>>1;5 }: O c; J R* D0 B4 `
}/ }' W1 p0 |3 E: t
else // 如果IRsignal是"0",高位置"0",并向右移一位
+ k4 u x: r3 e: s7 J$ yif(j<8) CodeTemp=CodeTemp>>1; //如果IRsignal是"0",则直接向右移一位,自动补"0"
; _1 Z; p7 k! s2 F7 c; {1 N}3 x+ V1 U, z5 }7 C0 {5 N8 C: B
IRcode=CodeTemp;
* e$ O1 B7 x: z" P! U+ oCodeTemp=0;
) t( t7 ^ H* G- I* n& j} //end for
+ n/ x# M0 F% z3 w- x5 F
* \6 Y3 A, F# ]; f1 k1 u1 K( t% pfor(i=0;i<4;i++) //通过串口将代码发出
& Q3 a) a) y( u5 d" v! G{6 s) K# J# I2 E2 x/ ] Q1 Y) I$ m
SBUF=IRcode;% N% d4 r; c9 w* A* V, c, f
while(!TI); //等待一个字节发送完毕
: c- Y) O$ b; @# XTI=0;4 E/ Y! \5 ~& E. W3 j# V
}
/ u1 m0 j# S( |9 h# L P- J3 a+ ]8 D' E# F) R! p @
Delay();; b5 H7 p. v3 w5 d8 Q9 Q9 K
} //end else
3 P: w6 r6 f0 L} //END for4 Q4 u K, _% Z: d* x7 X0 W
EA = 1;9 ^. G! O' O' v0 @" W
}5 M# a; ?, m6 H N! n7 \& M
! d" y m) c( _5 ~. b
/***********************串口初始化程序*********************/' K( u4 _* Y3 ~+ f6 G" {/ p% n
void initUART(void)) s+ @: I- c9 U# c1 x E8 x ~
{$ f" F, K- P/ @. c- m
TMOD |= 0x20; //8 v5 _; I( J9 t4 j% n9 m
SCON = 0x50; //
' d9 l) N/ x0 T# I" Q' C& F: t# \! U/ dPCON |= 0x80; //3 d; [7 `9 I: Y t
TH1 = 250; // 9600 bps @ 11.0592MHz
" H) H) m$ M0 K+ wTL1 = 250;) ?+ e9 P) ]" E( Q2 Y
TR1 = 1;
+ y. S$ K4 M, N% n: \5 _}
8 J9 X0 l) w' ~5 s' U. u9 s1 \ _0 v* G3 ^6 p+ [
/**************************主程序*************************/
% V# z3 R6 g; @- v) |. @3 F/ @void main()
; D+ J9 {3 R( @8 b' Z{. ~6 s/ l7 I- |! t/ A& d
//P0=0XFF;6 P* z9 X0 m; E) i5 {
initUart();4 h; D) O+ G( g6 `
IT0 = 1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
* H2 {& y+ }1 G( b7 i( ?EX0 = 1; //外部中断INT0开, (1:开, 0:关 )% Z! }$ ?: Y& f& H, S2 w# ]7 w
EA = 1; //开所有中断
! b8 ~- x3 D8 y. V& b. Q: c" x- A
" L3 ?5 C+ v) i- ]: R% o QCodeTemp = 0; //初始化红外编码字节缓存变量
" S2 [2 ~: }1 m# kDelay();
! G$ V' t: Y8 e5 V# Ywhile(1)
; ?, g' z) s6 P# E) E% `) E{
0 z% L' s5 t0 e8 k2 F \
$ N, ~) g9 j4 }* o% D}
% h$ M5 d8 q1 {8 ~; a( K0 D}; m+ K { u& @/ z) v) D! v
/ Q+ N/ s7 E" o2 u* A
" ]8 f+ J) d* w3 n
3 T6 v& ~/ v1 \" H! V6 J, K1 U" Z
5 e* x7 H& Z/ l: Y0 {. S/ m" p9 r0 `# z& T _& g
6 f1 S+ }/ A. D& v
二、红外遥控发射0 C8 i; P( P7 d; @; T; G0 B
5 a) Y% P }2 M; e: g2 C0 {网上的程序是http://gudeng614.blog.163.com/blog/static/818017420101545648734/) p% s' D ]' S) p8 o
3 x$ l# O5 ]8 d# ~- n8 i( p! [! z
做发射程序费了很大波折,因为网上的程序不好用。
9 l, x* s- B) [: d* I
+ U; ~ S# R% n, g8 U+ {& m后来不得不用计算机的并口采集了发射数据,发现数据有异常,终于找到了问题所在。- N7 A$ n. E5 Z: c! \
0 X4 m0 J# d5 X/ N+ U
原因是count变量是int的,对其赋值或比较时,汇编语句一句完不成,会被中断服务程序中断,造成count变量赋值或比较出现问题。- [9 L7 Q" m& i2 r
解决方法是必须在操作时屏蔽中断。而flag变量是bit的,一句汇编即可完成赋值,故不会有问题。
3 K- i* X1 K/ }' ]0 U, q/ X$ t8 f) y$ u: {' o; m. [. d" O
其间还发现别的遥控器会在起始码前加一个前脉冲,以为是这个问题,其实不是。& l0 w8 _$ T/ v6 u8 t7 E" X2 n2 x& X* h
% \6 O9 w( d% t, Y6 n! x注意:由于13us会中断一次,这里是采用1T的单片机。如果采用普通的51单片机,由于是12T的,不知道能不能成功。
# U, h0 S$ }+ d; t% A
" c: U; h0 ]" o+ e( u( y9 x//程序从网上修改而来' s9 N0 J p# {3 h h$ P0 H' N: G
//由于中断需要13us中断一次,即中断要在几us处理完,因此需要单片机速度比较快,用24MHZ晶振才能保证正常1 @" U% f# V- {. ~
//但24MHZ晶振,用串口不方便
) j% Y6 H: y+ }. e" Z//这里采用1T周期的STC12C5A60S2单片机,11.0592MHZ,可以兼顾。5 Z( r" S9 E" I R5 L4 z
//STC12C5A60S2 引脚可灌入20mA电流,直接从正电源→红外LED→串1K电阻→P0.0脚。3 V* ~$ y$ S2 e" T: b1 A m- b
//串口1默认选T1作为波特率发生器
, n9 J) T7 I) A! j% }//TO用于中断0 f' \) x' [0 f6 t( K) ^
//发送时,低比特位优先
' p* |& P m, }$ \: _7 c5 z0 C: N4 A1 `: F/ N, ~
#include <STC\STC12C5A60S2.H>
4 B& n' o6 v: e1 D, ~+ e#include <INTRINS.h>+ \9 `/ {/ K* {( h6 Q
" U; b/ }& N4 _8 v+ Y+ l
sbit P0_0 = P0^0;/ E; K* U. |9 n5 r4 B7 o
. w5 t$ O5 t% a3 @% Wstatic bit g_OP; //红外发射管的亮灭
( I6 h7 g+ o- N- A1 |) sstatic unsigned int g_count; //延时计数器' n) S+ |. N" f$ _9 H7 j* {2 r
static unsigned int g_endcount; //终止延时计数
4 |' V2 d) E6 S4 ~5 h3 P* \* }static bit g_flag; //红外发送标志' I# k& n" T- W% h( V4 ^
unsigned char g_iraddr1; //十六位地址的第一个字节
2 A; d$ U; V$ U, e) _unsigned char g_iraddr2; //十六位地址的第二个字节
- [4 K' f4 d# z9 Y8 r' k
- ^$ B$ m! x/ D6 c$ D( a
9 y% u0 L3 Y' {: H8 E7 m; D//定时器0中断处理% W3 ]; W9 B" j* O' ?5 l( z
void tIMEInt(void) interrupt 1
8 g+ [: @; J/ ^( @6 X{! F& {' m: j$ P6 F9 }
g_count++;
2 Z. j9 G2 x, p& O! W if (g_flag) g_OP=~g_OP;
7 l1 B$ P: h0 P else g_OP = 1; //LED不点亮% \, p# y4 v% t, }8 L: ~! R
P0_0 = g_OP;
% o& n9 ]+ x; I9 @}. H7 c' q: @: K8 l8 O# N
) a" b$ v5 @ a i, L1 [8 I/ M" ?! z8 z
/////////////////////////////////////////////////////
& h% E2 Y% A' W$ [, `) W3 m3 jvoid SendIrDAta_38KHZ(unsigned int temp1, bit temp2)
8 ^6 S3 e. U. x" k; A8 A& q+ w{
0 a @8 M, ~7 E+ @9 j g_endcount=temp1;
$ s4 J7 k: h# y2 l) ? g_flag=temp2;
2 P5 D$ ?7 X1 n- F6 E* K7 f EA=0; g_count=0; EA=1; //避免中断影响count置数( I+ _9 G5 S. m
while(1)8 `- O4 L5 {" e9 o
{
/ |1 h$ G" [& e. {, X! |4 W EA=0;% G3 x+ q- O* z! y$ l
if( g_count < g_endcount ) EA=1; //避免中断影响count比较
- b$ a$ N, w, c1 N2 X( e' i else
3 J' z* @9 e: S: {$ G& h# p( ^ {1 M' [/ D& R* n+ X) s
EA=1;# ]8 O' E: ?/ Z0 B0 x7 [, i4 V D
break;4 J; v$ Z$ } Y- A# C ]" W, Y; m, U
}
9 x% X7 m( \1 V d } " e% n) H, h3 q- G# S, j
}. ~9 r! p2 i8 n" X: K7 q) F
1 ~- |9 Z. n5 i5 N( g; {
/////////////////////////////////////////////////////
# E4 P5 C' Y3 B4 G4 c2 p7 Ovoid SendIRdata_BYTE(unsigned char irdata)
+ _' r) H( I% A. m9 U) ^{* o) q- Q* h7 Q; G5 p9 w
unsigned char i;9 r- u8 y" ^: q, s0 V- y
for(i=0;i<8;i++)
" N6 D9 ?' g, Y1 V U- X! Y/ K {
1 W+ G: C% H4 `" u% q //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)* k8 t+ a0 @4 b$ M, X1 E
SendIRdata_38KHZ(43, 1); //13.02*43=0.56ms' u- |9 H1 F, N9 _) V
/ N7 T6 E8 D. b //停止发送红外信号(即编码中的低电平)
2 d. A0 A: l2 @4 ?% X if(irdata & 1) //判断最低位为1还是0。 低位先发送!!- N) y: |' Z* K# w1 V# i/ W5 }+ l
SendIRdata_38KHZ(130, 0); //1为宽电平,13.02*130=1.693ms
8 t9 \0 @3 \3 E$ H, \. _ else SendIRdata_38KHZ(43, 0); //0为窄电平,13.02*43=0.560ms+ F- h7 C- V6 z" H( d: ^
+ Y0 w! p1 H" H5 S u) z% p9 a( p
irdata=irdata>>1;
# T- G- S9 w' g6 t5 [ } q4 b, \7 K5 x* v+ k0 E0 O
}/ S5 O t2 z# y! d
& c: _$ U( s3 M! w9 s) ]
/////////////////////////////////////////////////////7 o5 h* K; f% T
void SendIRdata(unsigned char p_irdata)2 d7 O; C$ _/ r, x: Q
{
; n$ x1 e8 w% {5 q" `6 ^! ` //有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲
: G _; u$ I% J1 f- C. M; F //发送起始码前脉冲,高电平有38KHZ载波
" e' N1 a2 y y P! ~ //SendIRdata_38KHZ(18, 1);! |8 G# b- Q. y: c0 J7 E N6 J, u$ t
//发送起始码前脉冲,低电平无38KHZ载波
, l- d5 n, o4 U# A* R9 ? //SendIRdata_38KHZ(18, 0);, d: r& c/ N# W7 t0 z: T3 |: l* ^
) T e. I: Q! i4 D6 y$ k
//发送9ms的起始码,高电平有38KHZ载波' w1 q/ v2 o* I/ S X6 O" P
SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms
3 W' b4 i( e* L$ E4 S4 X3 \# B
! Z/ o2 L" B2 t/ | //发送4.5ms的结果码,低电平无38KHZ载波4 f! J/ z8 O5 @4 j; V% e% a W* o
SendIRdata_38KHZ(346, 0); //13.02*346=4.505ms
7 x c Q4 |2 v+ o4 l* ^
. Z( [0 z$ A( h, X. h; W6 ] //发送十六位地址的前八位
( j, G" Y* o+ C3 o3 | SendIRdata_BYTE(g_iraddr1);! c( X* ^- V$ q+ q
$ r, s. d4 K9 |4 z' s$ S
//发送十六位地址的后八位
t1 {+ f, z$ G$ }# Q0 E% U) g- u5 ]$ F SendIRdata_BYTE(g_iraddr2);
* `0 Y' c y: J, U
+ g- z0 V) G$ C% a) W& Q; y //发送八位数据7 R! r8 r, i6 |- j( B: O
SendIRdata_BYTE(p_irdata);
0 [6 x" c0 W+ B) A3 U- f& ?8 Y6 d
" s1 o; [; @; \ //发送八位数据的反码. o$ E( R% P4 _7 Y9 Z3 K
SendIRdata_BYTE(~p_irdata); o5 p1 x% C4 |& u/ a; Q
; n# J$ }& {: \4 n
//发送总的结束位1bit
( J" w Q* Z* e) h: O( l2 F8 V SendIRdata_38KHZ(43, 1); //13.02*43=0.56ms
1 n7 O5 N. |. A8 T& l$ Y* k7 Q5 N B7 c4 v3 t, A! L4 r A
9 `" Z0 A$ w- D. J& p; q/* //后面这些可以不用发
- N1 b; e# Y4 Y g_endcount=1766;
0 q3 e1 D/ U# a+ Z/ C" N! w g_flag=0;( v; q! k/ W1 p O
EA=0; g_count=0; EA=1;% q. G; ~! S0 W, Y4 p4 U# X
while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; } }
6 ~' l0 w' b( g7 M+ ^9 g7 V; E: M' Q0 ^! f! G, v
//发送9ms的起始码,高电平有38KHZ载波
, x" {9 q0 m: U% Z! l g_endcount=692; //13.02*692=9.010ms& y9 M3 h4 h' o1 O) b6 }
g_flag=1;
% d3 I5 Q9 a% N5 K, S+ O EA=0; g_count=0; EA=1;
' Q( |* ~: h. k; O: o while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; } } 5 g* ], e0 ~/ @+ ^3 k
! \7 G5 ]$ T; i6 m* `( v //发送4.5ms的结果码,低电平无38KHZ载波
! k* r; A3 g! H1 I; S g_endcount=346; //13.02*346=4.505ms) }* Q" a1 k: K$ A# k
g_flag=0;
, N; Y: i: ] G8 J, [8 n EA=0; g_count=0; EA=1;: p1 x: n/ P' s& }. c
while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; } } * ]6 b, {7 z$ v( L% T, _" b8 o
0 ]/ `) `6 @; e//发送总的结束位1bit
0 {; h# m5 X8 G: ~& |+ Q8 b g_endcount=43; //13.02*43=0.56ms3 j. z( Q9 w9 F' i0 [9 i
g_flag=1;: U4 G; E% n: W1 H/ w" H( G- ^. S! k9 U- O
EA=0; g_count=0; EA=1;6 Y) w0 h( T: [! B- L* E9 {
while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; } } 8 s* @4 N3 n' K$ S- ?
: w* @: G1 j# |( t+ v*/5 s, z. n& l- J0 H
; q+ ?8 j* C: H5 V- `
g_flag=0;$ U3 c; u% I! ?& I: U6 x
' Y8 z; P2 w. W
/ Y4 }; Q0 S( m) x% V2 b9 _}
% K" R" z7 X6 c, D# \4 I& r- z
& \! u$ f3 v8 l( M( Y/ w* ^9 W
1 \5 D4 O( s1 k* ]6 X' u3 t, q& s4 O2 Y5 T- k+ y6 A
///////////////////////////////////////////////////////////
( D# D+ c) M) U& K) o4 N8 N( r! ~void main(void)
% {- o! B" b# u5 s$ J4 v5 f{
- P. J# [, G' j3 \' x/ N8 J- bunsigned char com_data; //数据字节9 E$ ]0 Q& ^$ d
`, L$ l' `% M3 J6 J- I# ?; a g_count = 0;2 P# Z" R3 U& N9 C+ ?8 H3 P
g_flag = 0;
& T# p# p& m+ Y# k% P7 h7 ^ g_OP = 1;
3 @9 ?8 A' \3 u u% a E/ T3 I P0_0 = g_OP; //LED接电源正极,不点亮
' v" A% J) G8 A; {; o; u1 t3 h( s8 @( }9 l1 I2 L
SCON=0x50; //串口方式1 01 0 1 0 0 00 模式1,非多机,允许接收,无数据位8,清中断标识TI和RI
. x3 }( Z0 e/ b- ]( e
; y" P# ^# Z8 z- b8 M& U TMOD = 0x22; //(定时器0和1:方式2,自动重装,8位)
& s3 b7 Z( [* e. r; TTH1=253; //11.0592MHZ,9600bps。没有设置SMOD,故波特率没有加倍。即:11.0592/12/3/32=9600bps
' A& g x0 c9 g XTL1=253;
$ a% Q l2 h" [& o3 _' @6 r; |TR1=1; //启动定时器
* L: x/ D7 s8 ]4 s2 S' Q/ e6 u$ V( r% W) a. X I
TH0 = 244;
+ x9 K' T3 ]0 J$ Z TL0 = 244; //(WXL:即计数12次中断一次,即11.0592MHZ晶振,机器周期是1.085us,12次*1.085=13.02us,这样达38KHZ。 13us一次中断,时间太短了,所以单片机要快)
, l- e3 o5 O6 q ET0 = 1; //定时器0中断允许5 ?$ ~; C! S& A, \" k
EA = 1; //允许CPU中断
, P5 o4 _/ W% c TR0 = 1; //开始计数
( v- o/ L; O6 ]5 P. a/ n% K6 S- R! Z
g_iraddr1=0; //地址码
2 j+ x( N8 W' A: F2 }2 u+ b# g g_iraddr2=255; //地址反码% ?& n5 l: U- u+ @; F+ O" y$ h+ w# H
- C# \# L; G7 {# l5 f
RI=0;
' ~2 b; s- q9 H3 b0 U6 p! S; ?while(1)4 |4 g# E& U! {7 |8 _
{
, O- P3 } W6 M Y/ Q8 a, P. R0 ~if(RI==1)
2 t9 V6 Q% ? _! j9 Q' @ [{' c) A/ b! T+ k8 R$ @
com_data =SBUF;
6 T ^- L" K( O6 K3 }RI=0; //要人工清RI7 I( @5 a7 a% u. M( K( r8 P) \! d& g: H
SendIRdata(com_data); //发送红外数据
$ t- x4 l8 q0 v# r5 I: pTI=0;: r! _9 y8 E/ z+ _% o
SBUF = com_data; //输出字符
2 D f0 u$ |9 Y# }9 Awhile(!TI) ; //空语句判断字符是否发完,TI=1表示发完
( E5 Z& g6 ^( H# V* w. p" ^TI = 0; //要人工清TI
: s* Q% F7 }2 B& Q3 @}6 F+ J. h0 }4 k- a, x
}
: T; c j) N4 f) ]* h w6 Z& Q I* U# v0 ]- r( ^0 x1 K I
} |
|