找回密码
 注册
关于网站域名变更的通知
查看: 229|回复: 3
打印 上一主题 下一主题

51单片机红外遥控器读码、发射程序

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-19 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

; R! Z, `* M' U1 n' d: B1 p 采用STC的51单片机,STC12C5A60S2,可以直接串口编程,而且是1T的,非常方便。2 u& Q: e+ U6 d, p& y

8 P7 J' r1 m1 Y$ p# S: B: k一、红外遥控器读码
# K( U6 B* S- P. K. E# V读码程序没怎么修改就成功了。
# T! U# z6 x) A0 z! \1 ^% u注意:这里的延时程序是STC12C5A60S2的,如果用别的单片机,需要修改。/ C- [5 [+ V9 b

. I- d5 ~7 S5 U& t: K#include <STC\STC12C5A60S2.H>
. N' L) H- T( m" f" E#include <INTRINS.h>
* H. |' @* t6 a
- N9 _7 }: F$ V/ D, Q/ T2 H0 ]1 o4 N//采用1T周期的STC12C5A60S2单片机,11.0592MHZ
! @0 d# J' ~! |- N' w! k* Z//WXL:一体化接收头默认是输出高电平,有信号时输出低电平;接P3.2脚。% {- I5 z  V/ y" ^
//WXL:这里按“低位在先”
- H/ o1 B, R3 t5 u6 K$ \/ A; h; J; _+ F/ I8 ~
/******************************************************************/7 Z8 t% Y- H" N0 E* ?
/* 本程序的蓝本从网上搜集,经修改并注释,万能遥控器解码成功 */- h' Q9 B4 {* M9 `6 H0 ?# d
/* 晶振:11.0592MHz */0 z; \) e8 g$ k9 m5 }) K
/* 整理与测试:单片机教程网  胡琴 2012.5.15 */0 }; m6 x: ?2 b- ^+ v, a7 k
/************************* 说 明 *********************************/
* F8 Y; t9 S- m' s# {& I* V/* 以一个9ms的低电平和4.5ms的高电平为引导码,后跟32位二进制代码 */
0 R" E+ x4 r6 U& T9 Y1 M7 ]+ g/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码 */' `/ m0 j+ q$ j5 n' D$ o
/* 以脉宽为低电平0.565ms、间隔高电平0.56ms、周期为1.125ms的组合表示"0"; */
4 h3 L1 h. J* g/* 以脉宽为低电平0.565ms、间隔高电平1.685ms、周期为2.25ms的组合表示"1"。 */; \- S$ N6 B1 G& a+ E3 n8 f9 x4 ~
/* 注意:接收码的脉宽与间隔是对发射码取反的,即间隔是0.565ms */+ r6 m- t! f# E# S5 Z/ ?, ]
/* 解码后共有四个十六进制码,本程序取第三个作为识别码 */# ~2 n/ R# ~, ?9 G, ^+ i8 A4 T- S
/*******************************************************************/; t3 D. ?( o) f  d3 ?/ y8 g7 C- `
: Y- [1 Z9 {0 Z
#define uchar unsigned char& ^4 _6 G6 n+ r; u4 }
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码
" a4 T2 d- G* }! u( l$ y# Quchar CodeTemp; //编码字节缓存变量" D# S& {5 @3 J- j- s
uchar i,j,k; //延时用的循环变量
) C. a8 a" _7 t# s4 c7 l! Gsbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)4 G: D8 d* Y, i5 I6 Y- w3 R
sbit P0_0=P0^0; //P0连接到 LED 上8 }9 c3 v; |* z3 _, ]8 a
sbit P0_1=P0^1;
- s3 _: L$ P5 k( \sbit P0_2=P0^2;
, E8 Q3 s6 @( `( R& p' R
* A  J* i" {! `
6 P, q% I# B) n3 R+ `+ @- @% z% E$ t2 U
/**************************延时0.6ms子程序**********************/) |( z- M9 s+ p, o; E" g3 |
void Delay0_6ms(void) //@11.0592MHz% Q3 Q% \2 o4 w' M0 Q
{; r7 }9 V: y" B$ a  e6 i) |& m. d
unsigned char i, j;* [0 m* R" m! V+ M9 N, A2 U
' n7 g* _: V6 C0 r2 V
_nop_();
+ C9 f* B4 l/ V/ |2 [! G# c_nop_();$ {5 M8 e( L2 Y
i = 7;( ]2 N- Z- z- G' j
j = 112;
, u8 B" `9 M2 i0 A" j' Bdo
+ J! Q0 ^% O0 f6 n9 J4 R5 E{
3 u! Z1 [; I- n, L+ y4 x% P8 Jwhile (--j);' T4 k* V& B) s( R* x, G5 H
} while (--i);
) U! z4 E& }$ l' h7 y; i
2 }3 w  m5 h; @4 E}; q. Z, V; |+ q! @1 l

' W3 T4 B7 X2 I2 u3 U6 C0 G, V0 c$ h$ B1 `- {
/**************************延时0.9ms子程序**********************/- ?& Y- W, S& x" j1 J
void Delay0_9ms(void) //@11.0592MHz  `! j' N  a" G) V& m
{
9 ]1 q! t. j/ \- l2 O7 @unsigned char i, j;
; y  b% ]( {, N- Y_nop_();  y8 q. q9 h# d, [) o2 s
_nop_();) x% f: l, M7 x, I/ D2 I/ [
_nop_();
+ T. S0 A' A2 L7 b; Q( \& Vi = 10;
9 S( `7 ~. X/ }) L) R9 A  B7 Pj = 170;
) m/ ?; _# `3 y- _$ X2 Ydo, q7 C& ^+ q' ^! Q& ^0 Q! g- d
{% m5 c. e9 m5 Y+ c0 T
while (--j);4 ~, ?( U" j* ?7 i. {4 e+ ]- k
} while (--i);: r6 Q! W. F+ r: g2 A
}$ m2 P& h' O9 {  j- n- j
" l( K6 |4 Z4 @7 |% ]% J* O1 h
6 s; q4 N  z: V$ w4 c

7 m0 K" d, b  i" k7 U3 S/ v- E: d) L$ C  [( R* h
/***************************延时1ms子程序**********************/
7 M- a0 b4 u: u  Avoid Delay1ms(void)4 d% C9 x) q6 ^/ ?. Y
{
' d. }0 Z+ Q! i0 L- T9 i% tunsigned char i, j;
2 z4 A5 O# w5 _0 I& z/ G+ S! a8 h) l3 ?( Z
_nop_();! Z/ ~) ^7 _+ ?. Z6 N5 o
i = 11;
1 g1 |! E% l% B# U. W2 w; oj = 190;" J; r! c3 E  o3 H  \
do, L7 C/ ^7 B" w5 C) C+ S
{
5 K9 G5 [/ Q# B" U& p+ B2 zwhile (--j);
: l- R! J3 y/ T2 a/ j} while (--i);! D: d+ O. y& p% M& p1 l2 L9 e* [$ X' D
}
9 m4 }" Y. O- H# A7 S2 p
( P  W. T) i3 k8 t7 |6 Y/***************************延时4ms子程序**********************/
  u/ A  n5 ?- A) fvoid Delay4ms(void): w* T0 E% ^) V& R. W+ V, I
{
! ]7 k3 E+ K. r' \' L( R0 Munsigned char i, j;
2 l9 S2 _* X+ c! |7 m! n/ y5 R3 |
7 I- d! o* X4 K/ c2 g% `; b_nop_();
; F* Y! k! v/ Y' f8 v/ n7 J' X_nop_();
& k9 a1 \$ @6 O7 e1 b+ e$ w8 y: X_nop_();( e) i) |8 d0 N6 V  y9 x( w3 |3 G
i = 44;8 L3 t# m+ Q0 c( U- d; n
j = 3;8 t- D! B% b8 Z: F+ f0 a5 G1 ]! G& y
do
! E7 A: ~( o0 ?3 ^- r{
7 r# S; {4 f* w$ }$ Dwhile (--j);3 D. [  ^# @$ ^# ~- \+ c" J8 p
} while (--i);
6 N$ R! F- L3 i0 o/ {3 N, S6 r}
. T0 b! ^  K. t' o# g' B$ a9 x- `3 l: _" m& |. i0 S) T
/**************************** 延时子程序 ************************/0 X, W* k& P! j  H
void Delay(void)
* z& [: f1 O- p( c( g{7 k0 v; c# o. O' s
uchar i,j,k;% |0 t% \9 H5 R' F8 w, U
for(i=200;i>0;i--)
! _- |0 o" ^% O% t, x9 s) Vfor(j=200;j>0;j--)' g4 ^! Q5 E; k; b+ ]
for(k=3;k>0;k--)  ;
3 d' G8 N) ~* q' X# K}2 o" r5 L3 R) q5 j7 P5 n7 J, s
, w" m6 m1 P, C; [) ?2 Q
/******************** 中断0解码服务子程序 ********************/# i! z+ n; f* o" E
void int0(void) interrupt 0 using 21 i: o- t" J+ H; G
{
: Y: R& r% s; L- A1 AEA = 0; //??? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取; i6 z" d; X% t- _! y
for(k=0;k<10;k++)
0 U4 o3 {% N2 \, n2 n+ W( ~{* b) m( s2 }. O0 E9 \- K; m4 c
Delay0_9ms();2 d# a) Q1 U# @& K* L' Q5 O
if (IRsignal==1)        //如果0.9ms后IRsignal=1,说明不是引导码,退出中断  p* [& J; A9 Q3 H' x
{6 l. I$ Q8 [3 a9 M' ]( v
k=10;9 e, Z4 f7 j7 K! \) s$ d6 y
break;
# X- C& M$ F6 g3 S0 B}. W" v4 e. _; K3 ]9 Z! ?
: J9 M1 F4 U$ G
else if(k==9)         //如果 持续了10×0.9ms=9ms的低电平,说明是引导码。WXL:一定是从引导码开始
6 P- O% g$ j+ @" [- D* Y{6 c" c8 M( Y6 l7 m8 R9 W* k
while(IRsignal==0);      // WXL:因为红外头默认输出是高电平,故用while(IRsignal==0)很安全,而用while(IRsignal==1)则可能会进入死循环
$ f& z& O" |$ Y3 _" {% R  Y4 ]Delay4ms();       //跳过持续4.5ms的高电平     WXL:要超过4.5ms更好. Q# F. Z( N* s1 S0 [9 K4 u
Delay0_6ms();. R5 y+ @$ `* ?+ W
' s: k) O/ z4 U4 L0 f9 @8 A
for(i=0;i<4;i++)     //分别读取4个字节
% U6 P1 f$ j! L{
7 p+ U. b: L5 V( E( q* q4 s- C6 tfor(j=1;j<=8;j++)    //每个字节8个bit的判断  ]) O! ~/ y: t& C& N; u% M& }, Y/ T
{5 l' E% w0 X) p6 r; h& j- G8 |
while(IRsignal==0); //等待上升沿,此处用得很好:因为0.56ms的低电平(接收时)是代码0与1的相同部分
0 `1 `9 {: D8 S+ j% p# Y% }Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal2 d4 w! r( R. M0 X0 a! ^. M
if(IRsignal==1) //  如果IRsignal是"1",高位置"1",并向右移一位0 Q/ ~+ X8 |" n( ~1 V& ~9 ^2 l* M
{
8 b' [3 w+ n9 eDelay1ms(); //为什么要延时1ms呢?因为要使IRsignal跳至低电平(即0.56ms的0与1相同部分上)& C8 m1 Y0 ]7 G2 E& |5 \, F
CodeTemp=CodeTemp | 0x80; //此处的算法很好
# I* o# o; v) Xif(j<8)  CodeTemp=CodeTemp>>1;/ o- W0 `$ `4 R  t+ b  y$ n
}
7 ^$ P! E8 }& M) n% W& xelse       //  如果IRsignal是"0",高位置"0",并向右移一位6 d3 f7 t' r" ~
if(j<8) CodeTemp=CodeTemp>>1;   //如果IRsignal是"0",则直接向右移一位,自动补"0"
1 V% ?1 y. }& ^/ {4 h2 u! N* a}
% H, D; _% o4 \7 ~/ vIRcode=CodeTemp;
* b( J  `% V+ v- u% k# T) {  lCodeTemp=0;
! |  r$ P; v% J; S) ?0 y}   //end for* R* F& i" Y7 S% P: S9 N

1 F9 z! k4 |- S8 yfor(i=0;i<4;i++) //通过串口将代码发出& r; c, O* M) V
{2 ~  ]. B+ f& @7 q2 M9 L4 z3 P- p
SBUF=IRcode;
* a. N  I, v0 @3 u! g# mwhile(!TI); //等待一个字节发送完毕
2 x( c( J: ^& v+ l: O2 x7 B: Q3 ITI=0;- G& d; j3 J! Y" I2 U
}) r  b& s- h7 k% k, x
/ M+ ~- }0 j* x, w2 j
Delay();: [  L% S! S& d; d
}    //end else: S: F% ^8 U1 O  {
}   //END for" x- k$ M# T/ n1 d; Y3 Q: \' H
EA = 1;
; Z- m4 d4 H) V' u! X; u& A" k& u}* m* d/ P; B* S5 k  T2 v  ]

. N. y0 c4 k1 y- L/***********************串口初始化程序*********************/
/ C: t/ X( u7 i% g5 a/ P( Gvoid initUART(void)
1 @+ v( U8 e& h3 u8 x, M- y{
, x( h- d9 [3 ^9 s! f8 w# h; CTMOD |= 0x20; //2 n  R/ O3 u4 V2 v5 {) n& n
SCON = 0x50; //
$ x$ U, O1 s: w- b0 K$ NPCON |= 0x80; //
! u' i0 J5 ~! x0 o, _TH1 = 250; // 9600 bps @ 11.0592MHz
3 p2 O  C& j) \6 t9 MTL1 = 250;
+ w& E* z+ ?: B/ q! E( a8 `TR1 = 1;
" Q$ |8 E. m! ?/ d; C; i3 n' d}
4 C8 t( l' h7 s: |! I8 C* B' C8 G, @- M, ]
/**************************主程序*************************/2 k. w7 z" T, r; V  t  w
void main()% t$ n9 Y0 w3 }2 V( j: z
{7 I3 e" d. E; q$ z! P
//P0=0XFF;/ V0 f  i6 D* A) _$ M! a
initUart();
6 ]$ T1 d+ b) d/ z5 v$ k+ eIT0 = 1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
8 r5 M3 o5 `+ r1 r5 N$ ~% HEX0 = 1; //外部中断INT0开, (1:开, 0:关 )' X) ^7 c$ [( b+ A2 J' S6 q# P
EA = 1; //开所有中断
( [& i/ d7 [. M  c' X- X: f! P( ?6 e) s( o! u& D" a" {8 w
CodeTemp = 0; //初始化红外编码字节缓存变量8 y/ a$ @$ g) i8 s% t
Delay();; F+ K# ]1 C6 g  Q! D9 Y, l0 u4 p
while(1)# P! C. W$ V$ H+ L7 v
{5 O, }$ P# J+ [+ j
7 _' K2 G5 B2 W6 M$ ?
}) Q  k# l% K0 e" S8 N9 r$ w
}6 u) `1 O/ U8 {9 V' R' g: K* Z

3 Z# p! v$ L) g- x
8 o% b6 Z: g% ]2 m; ^( a& J# V4 W' r5 @

# }1 g+ \# S) g$ d; n
6 u5 v5 d2 V/ p! J* s# Q4 P/ [0 b3 Y0 R$ G4 L4 |
二、红外遥控发射' r- K. r/ f, n' ^5 z0 [

2 @. e2 i+ A5 H% Z: H网上的程序是http://gudeng614.blog.163.com/blog/static/818017420101545648734// L5 a: Y7 V: e( ^6 p- q

: E. t8 v* l# G6 D" x做发射程序费了很大波折,因为网上的程序不好用。; ]5 b8 p" J- q5 }! M  g& }1 a7 `
/ z& I; ^# L1 F3 M4 x9 [1 t& ~# ?
后来不得不用计算机的并口采集了发射数据,发现数据有异常,终于找到了问题所在。
; _9 ^- Z( F. |% z4 U  v
' I: i0 o- z9 n% y1 n1 i原因是count变量是int的,对其赋值或比较时,汇编语句一句完不成,会被中断服务程序中断,造成count变量赋值或比较出现问题。. y: m2 f& ?) y/ t/ W
解决方法是必须在操作时屏蔽中断。而flag变量是bit的,一句汇编即可完成赋值,故不会有问题。
4 }) m  e9 b" r; ~. A( I6 K1 @5 v6 h) K, c  `: W* d
其间还发现别的遥控器会在起始码前加一个前脉冲,以为是这个问题,其实不是。4 t0 C! Z$ ~9 a( O' E% q

1 f& `% i  W" G$ i. \注意:由于13us会中断一次,这里是采用1T的单片机。如果采用普通的51单片机,由于是12T的,不知道能不能成功。
# T7 i9 v5 n* N7 f7 i$ C3 P* t
3 g8 o# z3 O0 V1 U) m! b, A//程序从网上修改而来
7 D8 p* F8 U' X+ X% _! p  H' y  z//由于中断需要13us中断一次,即中断要在几us处理完,因此需要单片机速度比较快,用24MHZ晶振才能保证正常
7 X5 n' S+ e) S* B2 ]) y//但24MHZ晶振,用串口不方便! U9 d9 j) P- O! _7 Y! a+ P4 g/ ]4 a
//这里采用1T周期的STC12C5A60S2单片机,11.0592MHZ,可以兼顾。
: \* u4 ^" h0 ?1 \//STC12C5A60S2  引脚可灌入20mA电流,直接从正电源→红外LED→串1K电阻→P0.0脚。( W' I$ j5 a! y# R% T* ~) D
//串口1默认选T1作为波特率发生器
0 \( i( e* b) m' D$ Y4 h//TO用于中断
8 _  Z  f  T6 e8 f% o//发送时,低比特位优先0 d& y" T  c, I7 a! P

, R- b. [# R9 Y  f; p1 L#include <STC\STC12C5A60S2.H>* E2 ]+ ~, [* ^% q' y& A
#include <INTRINS.h>: S4 Z1 \, g) T( g3 t7 F

; j$ m; Y/ E/ z6 n6 E6 j9 Gsbit  P0_0 = P0^0;
5 c# W3 }) t( @* t# x+ ~' W  s% s8 Q3 p6 W2 I8 [" n
static bit g_OP;            //红外发射管的亮灭
; `, w9 Y$ P* n: t3 Ostatic unsigned int g_count;       //延时计数器
# x. H$ X" U: {5 A2 Istatic unsigned int g_endcount;    //终止延时计数' e9 Z3 R9 z5 i3 B3 S) W4 ?
static bit g_flag;       //红外发送标志0 ~( \, l3 ]5 ~; ?: M# B
unsigned char g_iraddr1;     //十六位地址的第一个字节$ k/ t4 J% k. I( u6 p% J- b! y
unsigned char g_iraddr2;     //十六位地址的第二个字节6 D1 }- t0 l$ B( K- G4 u$ }

7 \4 i0 \0 j6 O3 H+ {+ U- W. Q1 H, |7 ^" s+ y/ I, Z/ J
//定时器0中断处理
) O8 }, i! q1 Z- R$ bvoid tIMEInt(void) interrupt 1& E/ u1 W) n5 f8 G: i3 n( T, L
{
( d6 n7 P% b5 u6 C) k  g_count++;
! ]$ I. o# [- \; _# P; ^  if (g_flag)    g_OP=~g_OP;
3 e9 E9 ~5 }  z* ~  else    g_OP = 1;    //LED不点亮' a* \! w$ P8 E' q+ X
  P0_0 = g_OP;( g7 L8 D: _  P
}0 S6 X8 i& R$ C/ P

% }& N/ Z' ?3 b& n
% i, {( E/ T# t/ @% J/////////////////////////////////////////////////////5 ?! ?  n3 Z4 d8 w! k% E2 H2 u3 h
void SendIrDAta_38KHZ(unsigned int temp1, bit temp2)# E5 T& Z9 _1 y/ E
{
2 w4 J& d( W; A' _( }% B  g_endcount=temp1;' P8 e) e, l& r  j: i3 }
  g_flag=temp2;
+ Q2 X9 j1 W( k5 ~# ]  EA=0; g_count=0; EA=1;  //避免中断影响count置数
+ s$ O$ I" C7 a* n3 u3 E  while(1)
8 x# i1 R1 ^' N( f- ~; a3 T& \; M  {/ O% @4 I- e8 H
   EA=0;
. k  L! F9 g9 X' W) J/ P6 k   if( g_count < g_endcount ) EA=1;  //避免中断影响count比较: T0 {) _+ X2 O3 A7 O
   else) I6 _3 W# ?, q2 g( r/ U* s/ E
   {. t) X4 Z/ o2 l
   EA=1;  f9 I+ {( }  J4 r+ ]
   break;& {7 [, ^0 q& _2 [! w
   }  
2 ~- T; @/ d# X: V# Y/ @  }  % O) ?* k" i2 G& U& \
}- |) P( _5 L8 n0 \

) W  C0 y& [, C9 ]5 B: |/////////////////////////////////////////////////////
; ?# \  }& j( y. v$ e1 Kvoid SendIRdata_BYTE(unsigned char irdata)
2 {' {' d; z/ y{
$ y6 e; `" i3 j% i  unsigned char i;' L7 Z- v: B; u! A. U- n
  for(i=0;i<8;i++), s3 B; \7 v, Q& S* g9 U* k
  {( A# T4 _2 G- O" r! k6 z1 i7 g$ w1 c
     //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)7 h: ]3 W  B  J4 |7 m( v
SendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms
: ]$ y2 O1 G5 _. o/ k6 x+ Q1 E+ H5 [1 y2 d
    //停止发送红外信号(即编码中的低电平)7 y. q; j: p; B% }! {
     if(irdata & 1)  //判断最低位为1还是0。   低位先发送!!
% X1 M/ \! v. |0 d/ i       SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693ms7 b3 B4 K/ R: ?6 {7 Y0 v  e
    else      SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560ms9 y" u% l; r3 X; V3 Q6 ?% I! w
% J+ m8 T3 G8 C  M6 S0 b
    irdata=irdata>>1;3 Q7 V: I0 H3 B1 U
  }
8 f$ a5 g( M7 A' X: j+ s) J* w4 m}
1 K3 |. A& P/ y, ~$ ^3 `# T* G4 c$ r3 \) C% ?! c0 F
/////////////////////////////////////////////////////
% y& u" m2 d: o& X/ q" A8 E) ]void SendIRdata(unsigned char p_irdata)
  }1 O$ g* i. U{
- n% R7 y8 H+ U( O- V% y  //有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲1 ~- {0 y( B3 F, w
  //发送起始码前脉冲,高电平有38KHZ载波5 D- ]- T, a; o& U
  //SendIRdata_38KHZ(18, 1);6 l# L3 V& D5 `1 ~$ _
  //发送起始码前脉冲,低电平无38KHZ载波
. @3 }3 r$ _+ Y6 n  //SendIRdata_38KHZ(18, 0);
; s, r8 m- w' V) S4 ~% ]3 D; d5 `( r+ o
  //发送9ms的起始码,高电平有38KHZ载波
$ [' M# B* R3 J- F  SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms) [, e7 z6 D" H; g: n: s6 f
6 f' G: `/ X' b7 [4 w1 p1 _
  //发送4.5ms的结果码,低电平无38KHZ载波
$ b7 {; ]0 V% O9 \; K  SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms
6 ^& W* \( ^" S; }# v% ^# S& U' e. h' l3 W7 z2 M' C
  //发送十六位地址的前八位+ }' v4 q( I: g- ?/ g' p
  SendIRdata_BYTE(g_iraddr1);8 p3 ?) B& {) n: c4 a- c5 H
) T9 H" s& |" y* q- g4 j; E  \' I
  //发送十六位地址的后八位
6 g. m' C/ w* w$ e  SendIRdata_BYTE(g_iraddr2);& W/ k* ^7 C" b( _2 f  b
% P& y' [$ t: o- V
  //发送八位数据6 D: K& b: q9 l, G: N
  SendIRdata_BYTE(p_irdata);' Q6 b1 h9 y4 k4 |

7 o8 G$ M: q6 p& j  //发送八位数据的反码# N* G) u* [5 s1 u; `0 x) H
  SendIRdata_BYTE(~p_irdata);  
8 n; v  f. q7 ?3 l& t
! Q3 V* [5 r0 x  //发送总的结束位1bit& `  V% g! B. d  \* D9 |! I8 W# p
  SendIRdata_38KHZ(43, 1);     //13.02*43=0.56ms' e' x# v7 B! M! `5 F8 G
, D3 d. g1 w1 y: W5 x
6 \# y/ i5 Y& g0 Y! p1 m
/*  //后面这些可以不用发
3 e$ U" y8 M8 W+ J  g_endcount=1766;
7 D: g! z. h" L& b5 |  E' B  j  g_flag=0;* A) N/ o7 Q9 v- |; E
  EA=0; g_count=0; EA=1;; m8 k% U7 D. ~
  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   ' R& q4 v( {, y" \! R8 R

5 A0 M% P' m, Z- `  //发送9ms的起始码,高电平有38KHZ载波
% @3 A8 T$ a6 t2 B2 S! |7 X  g_endcount=692;   //13.02*692=9.010ms
5 y" X8 r5 I" m( n2 K  g_flag=1;
5 W# A- @! w# Z  EA=0; g_count=0; EA=1;
7 }2 l3 m6 M$ X1 M8 q( y% |+ L  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   : Q! i9 K* Y: H
, w9 B" u  s" H2 `
  //发送4.5ms的结果码,低电平无38KHZ载波+ ^: g! h2 `0 c% W, L
  g_endcount=346;    //13.02*346=4.505ms
2 V$ Y8 q; N3 J/ K$ j  g_flag=0;' ]9 a: _, K" i$ n& O. T. J) y
  EA=0; g_count=0; EA=1;
. h# {( y; Q' S  m' A1 }  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   
) @1 g! d4 G) G* w4 N$ H! p4 {" B) ]
) ?/ g; V9 p  l" ?8 `3 R//发送总的结束位1bit! T3 t! K( C( w
  g_endcount=43;    //13.02*43=0.56ms  |; }% a! Q: n: |' Y
  g_flag=1;8 m3 l3 y7 G% ]
  EA=0; g_count=0; EA=1;
3 b8 S: u# \0 h3 H+ S  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   9 a% G( T* m% V" S! n$ r
5 |( j! X8 B! [5 @4 \" S" N
*/
+ T" _9 [! v1 H5 X; ?7 q3 l) k) T, t
+ G3 v3 E- G4 n8 T  g_flag=0;
3 l1 h* J$ c1 I# J- }% C6 V" H! R

0 u0 [5 k% }; d4 w# J}
: m' j# U* u0 G7 C+ A' i
! b4 g8 j& ^' q
$ U+ v. E! `5 p' m: |) M3 L
2 [4 u9 r* p1 s$ N  E///////////////////////////////////////////////////////////  r5 r! W8 `( J5 A1 w
void main(void)
* v& n4 V; l) V- y! N% y8 V0 f{
$ ~+ K* F" Y3 s, S' R2 I+ M- Runsigned char com_data;    //数据字节
% C+ ^+ v4 ^/ ?0 P
# H+ ^4 E) H, m+ P  g_count = 0;
+ t' w* _/ O! L* l! X/ C  g_flag = 0;8 s( ^/ b* ^/ E5 x+ C0 @: Q, u
  g_OP = 1;
2 H% }; A$ }3 |  P0_0 = g_OP;   //LED接电源正极,不点亮% _7 I+ N9 H9 S# y% {0 C
. l7 }* O* U5 F
SCON=0x50;  //串口方式1    01 0 1 0 0 00  模式1,非多机,允许接收,无数据位8,清中断标识TI和RI
! J# a; S' q6 O! o; h5 S1 V7 ^2 e. x' |. D( O* U) }' N& ?
  TMOD = 0x22; //(定时器0和1:方式2,自动重装,8位)
6 m6 c1 n- S' e7 d! [) Z4 xTH1=253;  //11.0592MHZ,9600bps。没有设置SMOD,故波特率没有加倍。即:11.0592/12/3/32=9600bps4 ?* {# |* O, z3 f
TL1=253;+ w$ N& h5 I3 C% q/ e! [% y
TR1=1;    //启动定时器; b' z' v* f/ f2 W; i0 U* `: q

+ z8 H; f1 y% ~$ Y$ }, k% n  TH0 = 244;( F' u% G2 x  m! J+ F; D+ i
  TL0 = 244; //(WXL:即计数12次中断一次,即11.0592MHZ晶振,机器周期是1.085us,12次*1.085=13.02us,这样达38KHZ。  13us一次中断,时间太短了,所以单片机要快)
8 L' `/ D* d& J6 I$ w( C$ b  ET0 = 1;   //定时器0中断允许
5 v0 A3 p( s6 v6 Q5 g7 v/ d0 L3 u  EA = 1;    //允许CPU中断  d- ]: c4 c6 E
  TR0 = 1;   //开始计数$ f3 N5 Y! M  D1 ~! R

# [8 E( l& C) t  P2 [# d. e  g_iraddr1=0;       //地址码& b, j" y% R4 ]* v
  g_iraddr2=255;     //地址反码
5 e: N& B8 }# |4 T/ g8 a* W; }$ S! d$ |5 r, D7 a
RI=0;! W  o4 ]1 c& \
while(1)
% {1 j  ]8 e0 ~4 a3 g{, c" Y/ h$ \' x
if(RI==1)
+ V9 W+ h" H1 y2 G{1 S, Y- K) e# j# w0 c
com_data =SBUF;$ s2 C! z! G5 u5 S
RI=0;       //要人工清RI
9 d2 d( t& `  v8 f* _0 tSendIRdata(com_data);   //发送红外数据
0 D/ ?* S" Z. S, H/ P7 e* mTI=0;# }5 W& Q/ P* F" _; {/ l6 H
SBUF = com_data;   //输出字符+ i: {+ E  t- P" n% f) M
while(!TI) ;     //空语句判断字符是否发完,TI=1表示发完: U0 V8 R) U6 o! U
TI = 0;         //要人工清TI
2 R6 R  U6 S& p}
3 }2 c5 Q2 @8 h" l}
3 d* H" J9 v( k/ Y, `. d, K2 R( P4 M8 c2 t, h7 {( Z9 r1 l5 m
}

该用户从未签到

2#
发表于 2022-5-19 13:00 | 只看该作者
5 `1 I& }; P7 Q$ Q' W% p
谢谢楼主分享,收藏参考学习下,在学习中

该用户从未签到

3#
发表于 2022-5-19 13:54 | 只看该作者
感觉就是很详细啊。O(∩_∩)O哈哈~

该用户从未签到

4#
发表于 2022-5-19 16:42 | 只看该作者
O(∩_∩)O哈哈~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 17:39 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表