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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

5 W+ o5 {! V; g& G- M 采用STC的51单片机,STC12C5A60S2,可以直接串口编程,而且是1T的,非常方便。
- M5 E; n" Q; b  c# V; J: T2 }$ w# y( D7 D
一、红外遥控器读码
# }  g' p1 W% q. n+ A! O读码程序没怎么修改就成功了。1 L) o' D0 d+ L5 |! ]  @* _
注意:这里的延时程序是STC12C5A60S2的,如果用别的单片机,需要修改。% {2 Q+ g) V& P( r( \

$ v+ |; t  g9 x* m2 w#include <STC\STC12C5A60S2.H>
. l2 R# S9 \6 k! i, f4 ?4 \5 ]#include <INTRINS.h>
! w' O1 M* [, _3 u  w9 o; B' u0 k. q7 [! ?* t" ~0 u8 K1 [
//采用1T周期的STC12C5A60S2单片机,11.0592MHZ
+ }( ^" a/ ?2 D; n5 m//WXL:一体化接收头默认是输出高电平,有信号时输出低电平;接P3.2脚。1 @8 U" S9 {6 n/ f% L' z
//WXL:这里按“低位在先”
: I( W, }3 N4 r, N0 r$ ]1 ]6 D4 K2 [1 S1 r
/******************************************************************/
2 _4 ^; n6 |- m$ K/* 本程序的蓝本从网上搜集,经修改并注释,万能遥控器解码成功 */# c; B% e# q; Z/ F' W# q6 g7 P+ ~6 D
/* 晶振:11.0592MHz */
! v9 e/ B* t3 I' C% g  z/* 整理与测试:单片机教程网  胡琴 2012.5.15 */" B. a3 a  ~9 V, y4 i" t. `) T
/************************* 说 明 *********************************/! i7 h& }/ s! g0 A1 O
/* 以一个9ms的低电平和4.5ms的高电平为引导码,后跟32位二进制代码 */
2 b# x0 }. e% X. f; y& L2 G/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码 */8 e. X: c( t6 r- S
/* 以脉宽为低电平0.565ms、间隔高电平0.56ms、周期为1.125ms的组合表示"0"; */
' n* H: m# U  D/ d/* 以脉宽为低电平0.565ms、间隔高电平1.685ms、周期为2.25ms的组合表示"1"。 */5 ?# G& p. \2 ?! Q+ f  R2 q
/* 注意:接收码的脉宽与间隔是对发射码取反的,即间隔是0.565ms */
) l( w5 _$ C9 w3 F8 E6 M* p: m/* 解码后共有四个十六进制码,本程序取第三个作为识别码 */
- q5 k$ {  Q# Z& ^, S1 F/ \/*******************************************************************/
" j, ?' w. r) \
* Z( {* u2 }' S2 w! a* }; c8 E8 B#define uchar unsigned char7 a6 b7 v' c/ U! h' `
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码! D, {3 W8 d( ^8 }
uchar CodeTemp; //编码字节缓存变量* q% \6 W/ o/ O7 c+ s5 v( d- N3 d0 O
uchar i,j,k; //延时用的循环变量3 ^/ J7 K- a6 G" y( J! a
sbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)+ b7 ~1 c' V7 j
sbit P0_0=P0^0; //P0连接到 LED 上
, W& y/ ]/ q/ |( [8 C5 F5 q* o) Usbit P0_1=P0^1;5 X' m0 L7 r0 A
sbit P0_2=P0^2;: l4 \; K" p/ X4 f3 q

# W& p* E1 r+ \
5 `/ X/ K( g. F0 q, B; E  ^
  j* X+ G; L4 ?- _- |/**************************延时0.6ms子程序**********************/) P6 T. J0 d) C1 F- }& B9 p
void Delay0_6ms(void) //@11.0592MHz
( X# p- V7 n5 ?) Y. H{
" N( h; [0 G( ?% J) Q4 wunsigned char i, j;
6 f4 B8 N7 n( K" ?" k$ @# a) s8 G4 o" m
_nop_();
+ {5 w  H0 v8 p. W_nop_();
& l6 N3 N' V  w, {! `! Ei = 7;' G! H8 r( c, o! m6 @
j = 112;- {. i% g, Y9 }6 k2 h1 M
do8 D- `0 \$ s( V$ v% I
{/ V3 t" z' P/ L$ K
while (--j);0 A0 N! F5 s. }: W
} while (--i);
; d& c+ ]% o$ [7 C
1 p& }  M8 X4 G8 H  I& Z. R}
0 ]) q: Y) a. P: f1 Y* B+ S; p
- C8 K/ _  p- O: r
/**************************延时0.9ms子程序**********************/9 p/ E' b* i# y
void Delay0_9ms(void) //@11.0592MHz1 N0 o8 j# S* H( B' g2 S4 P. j; E+ g
{
% m+ B- U9 _# k; d: K3 `2 J# runsigned char i, j;$ W% x0 {- z1 g$ o; k# C
_nop_();" Y2 N4 m( f* y7 i9 X9 F& @6 y
_nop_();# _9 t. {- O- t- q" ]
_nop_();
  A9 n2 h4 M6 Ii = 10;
1 G' E. W* Y9 uj = 170;
/ E% p6 v1 o' Q$ I% pdo$ r. G( l# e& W8 q/ t0 q1 @
{
5 s1 L" a# s# A; N. |7 c1 M1 _while (--j);8 a/ S7 E  I; j9 x7 f
} while (--i);0 m' ]% u9 N+ x5 l+ K  l" @" o
}
" ^2 y& i( ~* U& H# ~0 m+ ?4 b6 ^! S# H. v5 I
; H3 o0 N2 l# Y  O  d1 Y

' z( N$ Q/ ~0 @( R2 A& |8 M% N3 p/ F
" \6 [# n% w. G) W/***************************延时1ms子程序**********************/% X4 n, y0 Q) j0 A  c
void Delay1ms(void)4 a3 n$ Z' A1 w) d
{% Y/ Q7 ?  g3 f7 f
unsigned char i, j;
0 y) U9 i1 v4 u# Y- `+ u2 L3 n- A, I2 b3 I! j
_nop_();# E6 D/ r. i5 ~0 X5 |  ^
i = 11;
) t- \! ^9 d* ~' C4 bj = 190;. F; A, z; {* P! K2 A1 m) J1 d
do
. D( Q7 {+ }7 ]$ E* l/ G) e2 p6 g: z{
3 c# V4 x$ H; Nwhile (--j);
  F  W9 r# }' n8 [. Z% T. i9 m' x} while (--i);
! S% e5 x7 d" B4 z& z}
0 U7 E/ J+ Z. G, ~4 [1 M, l+ c5 o* H3 \5 H5 @- O8 y
/***************************延时4ms子程序**********************/+ t7 `6 B" q6 N+ L) L2 X$ U
void Delay4ms(void)7 M% w( Y. ]* r
{
* M2 v& G7 o" V5 ?: ?8 aunsigned char i, j;; F0 C- m; U$ J( l+ Z

4 ~/ j. u2 B, j' i- j7 V0 K_nop_();
$ [6 [* H- g/ m8 ]_nop_();
1 C# \1 M8 n4 S2 c/ K8 U! f. t! n# t_nop_();) b! q5 H, g: y. o5 P" M- B% a
i = 44;1 N) p# @) D1 Q8 u
j = 3;1 t5 {5 o# L; N
do) h, W: |8 Q; Z$ e. N- @' h
{
0 _8 C4 W. G+ r, O6 {while (--j);5 ^( D- V5 ^3 ~4 ^
} while (--i);
5 A  x4 l& j  r/ ^1 P}
# X/ M2 V( u" B$ u. f: G, T2 X& u7 j! s' E" E
/**************************** 延时子程序 ************************/
7 d) m& ^- C! p8 j5 O! U7 j; Pvoid Delay(void)
' z0 D& ^' n5 s2 H" z{  B/ I) _& C+ h
uchar i,j,k;! Y0 C) m/ v3 F: M/ ^% ]8 ?: E+ A: l
for(i=200;i>0;i--)6 \2 H4 P* ~$ I+ Z! O
for(j=200;j>0;j--)8 Y" Y! r+ e5 _$ ]' Y. _4 J% L
for(k=3;k>0;k--)  ;9 y/ e$ b" ~1 e8 M9 a
}" `! a7 t; i! F* y

2 D5 M( ?$ W- l' E, ]/******************** 中断0解码服务子程序 ********************/
$ {/ L+ I5 L9 k0 e3 S* ~; w/ G. ovoid int0(void) interrupt 0 using 2
' d0 e' o! y6 v  Z2 f% Z4 T{6 U+ y* ~* @/ l
EA = 0; //??? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取. Z5 B' I; l! m
for(k=0;k<10;k++)
5 {9 F  `' k8 S* d* ^, A1 H* b) H7 f; k{
- X* q( ?& k4 ?3 H1 k4 T" PDelay0_9ms();  D" _: ^! f) x7 B
if (IRsignal==1)        //如果0.9ms后IRsignal=1,说明不是引导码,退出中断
5 b1 K$ G& _( l; v" W{
, v7 \$ l! o8 g7 K- \4 O. q& Yk=10;* {5 o# T7 u' ]( A& l/ c, e, X
break;8 A( q3 j+ `( E/ q; j2 S6 g
}
/ \6 j; Y9 c; h4 u0 v+ q$ s  u; N
$ e! l% J% i5 s# D- uelse if(k==9)         //如果 持续了10×0.9ms=9ms的低电平,说明是引导码。WXL:一定是从引导码开始/ p( n. O# ?& g- R6 t1 q4 T2 G% n
{8 @2 f4 ?& s0 k) o( Q: u6 X
while(IRsignal==0);      // WXL:因为红外头默认输出是高电平,故用while(IRsignal==0)很安全,而用while(IRsignal==1)则可能会进入死循环
$ i# `, A$ }* IDelay4ms();       //跳过持续4.5ms的高电平     WXL:要超过4.5ms更好
! y; k+ \; j1 U; ]Delay0_6ms();, o, D) \' s. V; l5 {" H& L) x  @* i

  N+ H& b/ V& w& W9 hfor(i=0;i<4;i++)     //分别读取4个字节8 \" A) h8 ]; H5 i
{
1 V1 H* x% r, U! dfor(j=1;j<=8;j++)    //每个字节8个bit的判断5 n. |3 Z' E6 j8 W! N8 \
{4 k& T/ w' H3 g& {# u" c5 P. g
while(IRsignal==0); //等待上升沿,此处用得很好:因为0.56ms的低电平(接收时)是代码0与1的相同部分
* e" S) t8 i% K4 A$ N  b8 IDelay0_9ms(); //从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal
; F# a- e4 t8 x  |1 tif(IRsignal==1) //  如果IRsignal是"1",高位置"1",并向右移一位( N% ?4 i* T& |9 y/ @: \
{
) A$ L- Z  }! [1 {7 C) t; @) T. gDelay1ms(); //为什么要延时1ms呢?因为要使IRsignal跳至低电平(即0.56ms的0与1相同部分上)4 J  @3 D5 {+ m, {
CodeTemp=CodeTemp | 0x80; //此处的算法很好
  U* h( w% N+ ]  p6 U7 Rif(j<8)  CodeTemp=CodeTemp>>1;: x0 w/ @, n5 C# _
}$ O7 N! J9 U7 w2 G* \/ e& ^. Q
else       //  如果IRsignal是"0",高位置"0",并向右移一位
, j4 `; V% B- nif(j<8) CodeTemp=CodeTemp>>1;   //如果IRsignal是"0",则直接向右移一位,自动补"0"# ?  J( O+ g) [, X' F' [
}9 j  M. [6 o( q: R
IRcode=CodeTemp;1 M% K! l, q* E, a% [. k4 C
CodeTemp=0;
7 j0 U" S1 N& |) B}   //end for
# a  F4 V) [$ @% R* b1 e- ^1 P6 F9 U  g1 C! @7 Z' z9 z: z
for(i=0;i<4;i++) //通过串口将代码发出
" k8 f, |  y* [" h# \{
4 e( N- ]& e2 `/ ]SBUF=IRcode;5 \! e& b% \+ ?
while(!TI); //等待一个字节发送完毕
: R' ?' ]' j6 uTI=0;3 Z9 O6 _4 ]: e3 y, J( G
}* E# X# t* I8 Q+ ~/ ]+ y

2 G6 w8 O; y4 jDelay();
5 X' o; v( H: |3 A' a& P, J8 |}    //end else  Z# P  J$ ^  J3 u" m2 z8 L
}   //END for
. t" l) K/ V# ]5 lEA = 1;9 ~) b- C1 u( ?, V8 R% h
}6 z, C5 [( I7 R7 b! E) O

# l$ K) g& R' e! R& T/***********************串口初始化程序*********************/, u# B0 `& @8 ~4 R, e
void initUART(void)
2 D( B/ Q+ @  {4 d8 t{
1 f( ]& F5 U  {3 u0 c+ o8 [, MTMOD |= 0x20; //' F) L3 X, H! \+ S& G7 d
SCON = 0x50; //3 o1 Y; s: L3 U0 [7 a5 w3 W0 D
PCON |= 0x80; //8 K" l0 N% {! [8 l0 y8 n
TH1 = 250; // 9600 bps @ 11.0592MHz" ?8 e3 L8 q  C! W4 p
TL1 = 250;
6 z: Q, H" ^9 ]! z7 `/ R. C& VTR1 = 1;0 X& G, E3 V2 E4 D: E
}  V4 r6 s/ J/ o3 d
4 Q; W1 q- K4 Q
/**************************主程序*************************/7 [" d- e/ [/ h! B2 ^4 {
void main()
- g) K3 Q6 u6 |& B" m{: |, M* M' \) ~6 H
//P0=0XFF;" l3 g3 K, `* D$ U+ Q, F" f8 r
initUart();
! J+ N  g7 ]8 ?% |9 L/ r' Q. wIT0 = 1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
* c. O& B% A& [EX0 = 1; //外部中断INT0开, (1:开, 0:关 )
0 q& `8 L6 S7 V! d0 bEA = 1; //开所有中断: x0 U" r8 }* U2 e/ h* d

2 d6 \8 l2 X2 h+ w# r$ fCodeTemp = 0; //初始化红外编码字节缓存变量* Y- c% D" |# r2 P/ Q  h6 @" A
Delay();
! K8 U) R- F' i5 N( jwhile(1)
1 L! T0 ?) @$ A# U7 n0 \{$ y6 U/ _$ O& s# {4 H, {# T

0 O% e* g" ^6 d( J1 S}
( P) V2 Q0 Y3 V( h/ e# F}
4 O0 `- V' M/ g! W0 d2 s- b, b
2 y" P1 r/ J3 R/ t- M" \
' h& C- ?& ]" q4 ~1 y" c! }" w
9 P5 X, @: U7 m7 ]$ Q5 t. l% G0 p6 |( W) A, _+ _

, a$ R6 ^, D. K) N, ]8 T) |  `7 t$ [4 A2 k1 j7 L
二、红外遥控发射2 e4 Y2 g7 L9 Q8 |+ r4 W
5 f7 |4 x9 u  e- q" V  I- F
网上的程序是http://gudeng614.blog.163.com/blog/static/818017420101545648734/
) n  H, S9 r5 j6 R( d, z' w, H2 Z- o2 T* M4 ~! G# A+ C. h' U
做发射程序费了很大波折,因为网上的程序不好用。; R) T8 V- v" j2 K8 }4 v4 L3 o

& l3 S; ?0 R4 [1 b* z6 D. n9 H后来不得不用计算机的并口采集了发射数据,发现数据有异常,终于找到了问题所在。
' o2 a6 G' m* m5 J% q0 W' q
' O; U, U7 \+ S7 |! S' C* u原因是count变量是int的,对其赋值或比较时,汇编语句一句完不成,会被中断服务程序中断,造成count变量赋值或比较出现问题。, V: b+ d7 a0 Z: D& \
解决方法是必须在操作时屏蔽中断。而flag变量是bit的,一句汇编即可完成赋值,故不会有问题。
% q$ h: q6 |* y9 u6 i: ~$ @
3 [( u2 Z: C0 V! N- L其间还发现别的遥控器会在起始码前加一个前脉冲,以为是这个问题,其实不是。
! c- F' k, O( G5 b# i1 v- n- o- H: E- v: [( \& }1 j0 R; _" h
注意:由于13us会中断一次,这里是采用1T的单片机。如果采用普通的51单片机,由于是12T的,不知道能不能成功。. o! [% f  F7 ]7 g9 `
/ b: c% _. j- E
//程序从网上修改而来
  U" T' j6 F0 w! j//由于中断需要13us中断一次,即中断要在几us处理完,因此需要单片机速度比较快,用24MHZ晶振才能保证正常, c+ \5 N( r' R* w  u& t- W& R
//但24MHZ晶振,用串口不方便
0 X% }+ S: b: g, d9 f//这里采用1T周期的STC12C5A60S2单片机,11.0592MHZ,可以兼顾。
8 V& I# f& n9 l* Y" d$ `//STC12C5A60S2  引脚可灌入20mA电流,直接从正电源→红外LED→串1K电阻→P0.0脚。
, O; O# S* Y( V4 M' }/ O//串口1默认选T1作为波特率发生器: v, }, C6 d7 {( W  {2 F
//TO用于中断
( s$ n7 j. \& \2 h! E//发送时,低比特位优先
3 O2 n! H5 P+ V1 V5 H9 A7 G& O
#include <STC\STC12C5A60S2.H>
  |' Z- J3 M2 _; ?/ R) t#include <INTRINS.h>
& \( q8 L' N  ~  _. l
+ i4 n. S4 y8 y' y! O: a0 ksbit  P0_0 = P0^0;
9 [- ~0 T3 r0 Q3 q! P$ d( a9 |$ E% X& |7 @& |% P" p6 B
static bit g_OP;            //红外发射管的亮灭
" E% `( v4 q$ Q7 P. hstatic unsigned int g_count;       //延时计数器
- o' n# [' b2 e+ o% ~9 i2 o/ xstatic unsigned int g_endcount;    //终止延时计数
& J. g, K: \( P5 P. y6 tstatic bit g_flag;       //红外发送标志# u3 o/ V4 u. q% S! Y# C7 Q( ~- R
unsigned char g_iraddr1;     //十六位地址的第一个字节
' x5 k/ U3 b9 E/ r1 p; C+ bunsigned char g_iraddr2;     //十六位地址的第二个字节
0 K5 q, N/ R* T/ l( |9 p, \8 d% V7 D# y7 n

- J+ y2 w! y. y+ H9 Y+ f5 x  ^//定时器0中断处理1 w5 c& ~' r( l
void tIMEInt(void) interrupt 1
! ]% M* T5 l. l) Z7 }, x* }( P{  e* j; p' G- j. g
  g_count++;
" l+ X: P4 M% ^2 [8 r0 \# f0 l  if (g_flag)    g_OP=~g_OP;* @$ F7 o! `( {8 p( l
  else    g_OP = 1;    //LED不点亮
( P, U9 v) ~3 Y* q2 ]& w5 @  P0_0 = g_OP;) R4 t( n6 ?' `  A
}- g9 q: |8 L% K& o3 ?1 u
7 k! I2 b+ C+ `# L3 l3 V. ~) K( W
6 [" Y3 U2 [+ A. B: k" h% ~
/////////////////////////////////////////////////////- Z" F/ @  @  y% w6 ~% _
void SendIrDAta_38KHZ(unsigned int temp1, bit temp2)$ c  f4 v) W- S" v
{. u) H: W0 g* m  k7 G# H% s6 H
  g_endcount=temp1;2 C% b  ?/ k2 S" m
  g_flag=temp2;4 F" x; l% p" s) F6 m; r
  EA=0; g_count=0; EA=1;  //避免中断影响count置数* Q% P0 a3 O" ]) k" Q  U! _, a+ d
  while(1): h3 Q' f' r5 R/ B& h% G
  {
. z& q8 K8 }" v5 D3 K   EA=0;( e/ S2 \. s3 l
   if( g_count < g_endcount ) EA=1;  //避免中断影响count比较
1 j( U. q) @! P) k   else& X% c7 f' Z8 U
   {
! x) W. R( G: y7 M6 n9 G1 _   EA=1;! X/ s( M+ B  f9 q# ^" B" F
   break;9 _" a- ]! W" U  M( c5 e! p+ y& ]
   }  9 M! E8 {% U: v  U
  }  7 j! ]6 ^; m% u
}1 ?; ]$ `, z( G1 E9 s( Q% z1 o4 I
/ r1 z0 C% @. t' }. b/ ?
/////////////////////////////////////////////////////
) a) ^6 v2 X+ K/ D% _void SendIRdata_BYTE(unsigned char irdata)
2 c/ U; ]% D: t4 ]" G/ s{
6 M  w! n3 v/ _' \5 E  W  unsigned char i;0 `3 J# K3 |0 r7 e
  for(i=0;i<8;i++)
, W( O- C' R% b- Y) Z3 v! Z0 i  {
1 O# p; s' U8 }' i* T  Z     //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
5 j8 r( B* G1 lSendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms
6 F; F: r. I8 v0 O. L. V
! z5 M3 }. ]5 G4 I    //停止发送红外信号(即编码中的低电平)/ j4 v  G& x5 _. Z
     if(irdata & 1)  //判断最低位为1还是0。   低位先发送!!
& s# R6 B/ ^4 U( H+ e$ |9 f6 \       SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693ms7 r. B9 e: m. m3 p0 t
    else      SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560ms
; [6 C. c5 f6 `; `4 ?2 w5 B3 N5 y! h. t6 Z9 r' i; i3 k
    irdata=irdata>>1;
# M+ A% K  }- m/ \, R8 {3 _  }$ Z- R7 z) m: G- |
}3 C$ E, n( U$ c; U  R; ^) F
, E) H/ a$ V, p0 o; ?
/////////////////////////////////////////////////////
) f3 S- z6 v1 V. g, |2 \* hvoid SendIRdata(unsigned char p_irdata)+ N7 f+ F- J) i, E: `$ E+ n+ W! [6 `# C; u
{
! P$ u4 N' q6 ?2 g, ^  //有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲
; m& y) X3 W4 o$ |. K1 i7 S7 Z. C  //发送起始码前脉冲,高电平有38KHZ载波, ?. W6 S7 K9 ]# e
  //SendIRdata_38KHZ(18, 1);' ]2 X$ R" D% h% m( v
  //发送起始码前脉冲,低电平无38KHZ载波
5 [. l5 G! d5 A2 j/ T/ I8 \  //SendIRdata_38KHZ(18, 0);- D% h# C, p- L( h7 x9 ~8 V
# f0 Q* z3 X- `  h1 `: N
  //发送9ms的起始码,高电平有38KHZ载波
$ J* x" z# q$ Q4 b' z* k  SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms
5 v+ o1 m) q1 n! n$ V
- n9 F- c2 h% S9 ^, P  q  //发送4.5ms的结果码,低电平无38KHZ载波
6 R5 O# y1 ?9 g3 R4 Q$ ?) d# Y  SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms
  T$ L1 L& A& U+ r) `0 _5 m; x% z, B8 k" c- H: i
  //发送十六位地址的前八位
7 n; k6 F. n# H, W8 M9 y  f5 O, @  SendIRdata_BYTE(g_iraddr1);
  c0 `8 a2 R8 H$ ?* s; `7 @2 r& n: Y' w% I! ~) O% u) P5 U( o! {
  //发送十六位地址的后八位* {. f. ?+ I, H/ w6 V* I# R/ m
  SendIRdata_BYTE(g_iraddr2);
2 A1 F% O" E+ }# [" j- [+ {9 B' D" ?1 o
  //发送八位数据
! H: M- c9 z$ ^: G$ U  SendIRdata_BYTE(p_irdata);
) ?; X* L7 O& u; m8 H
  K+ p8 T3 z8 y$ O# d9 R  //发送八位数据的反码) M$ x; @; {, n7 m$ |6 _) ]
  SendIRdata_BYTE(~p_irdata);  1 G2 `% ?8 @- r$ u; z# A4 v

5 t; R% L. j8 s1 }' U$ S7 D  //发送总的结束位1bit
2 T# Q! T6 f! o* i% u7 u- p  SendIRdata_38KHZ(43, 1);     //13.02*43=0.56ms* s$ E& ~, Z8 V; w; r

' z; j& v7 c7 l' A3 T, `6 E8 ^; v6 R: k1 G
/*  //后面这些可以不用发2 R8 o; r  q3 x7 F- `3 E
  g_endcount=1766;
  y- U, G1 X2 {3 \8 M  g_flag=0;: V: r; j6 v# M0 k& X7 Y* V
  EA=0; g_count=0; EA=1;0 t0 l) }; q6 S3 H9 s% k! {
  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   4 H; c; a8 ]0 r6 @  |' k3 o

- d0 @5 V/ @9 b* c0 r# @6 Z! b- [  //发送9ms的起始码,高电平有38KHZ载波8 P9 A6 L( m" _
  g_endcount=692;   //13.02*692=9.010ms
% K+ H. w* V  e& l  g_flag=1;
) n7 U2 O; M9 {  EA=0; g_count=0; EA=1;
  f% P* p' U, _0 u! F0 t  Y  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   8 j  Q6 {0 k9 P7 S2 }

5 ^. i4 d8 {$ W* Y  //发送4.5ms的结果码,低电平无38KHZ载波9 Q* a) W; ]9 H* P& Q- ?
  g_endcount=346;    //13.02*346=4.505ms
$ w+ b' |$ L6 u1 c6 R  g_flag=0;- f* f3 S, o" a& J" g0 {; q) ?
  EA=0; g_count=0; EA=1;
: c2 U4 e1 x4 S  h. I3 r/ a  L  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   
3 I1 f9 k" Y. }) C
" q1 s+ F$ f5 `& w: d+ H5 R6 {9 o7 G//发送总的结束位1bit; T7 j7 G  d( y
  g_endcount=43;    //13.02*43=0.56ms
- H8 T9 V# \$ P- M  g_flag=1;
6 C& @! \, x# }, K  EA=0; g_count=0; EA=1;1 j( o# ~6 n# X* Y4 m! P6 Y
  while(1){EA=0; if(g_count<g_endcount) EA=1; else { EA=1; break; }  }   
$ a' T% ?* P2 w7 _6 R( P& U% g7 q9 T8 f) c# @
*/
# ~& K5 w+ \9 E1 r* V
# g( l6 I# m  v7 J3 f# l( X# j  g_flag=0;
# x- T6 y+ s4 }& Z$ W$ s! `
* `* T; d) k# F$ s1 l+ [! D) @
) |) _% ^- V$ F/ X}- i; M/ }) R/ C
, l% Y( M+ A3 L/ K! @4 z4 v, @

6 r) x9 d0 P! }6 H
) j2 |' O7 c0 U5 e2 h$ v! B///////////////////////////////////////////////////////////
2 Q8 n& F5 m, |6 H4 m) d. O& Evoid main(void)
; w& T+ G* r$ X& G{
4 H: X) {1 ~6 Cunsigned char com_data;    //数据字节3 H) e& D" w$ _6 I- y
% P2 s' }: _, L+ [- o( M, f
  g_count = 0;. m2 ], l6 s9 N% ]/ ]7 I" K
  g_flag = 0;+ e0 \4 P2 o% ?' u' g: D# O
  g_OP = 1;
: l# A$ O4 b2 j+ |  P0_0 = g_OP;   //LED接电源正极,不点亮
, W# h) g/ j% ^) C  d% S: T; Q- x- s# [, Z' `& @
SCON=0x50;  //串口方式1    01 0 1 0 0 00  模式1,非多机,允许接收,无数据位8,清中断标识TI和RI
) o9 g/ v  e7 w* h
8 p. V' [! c6 \7 u( ?( _  TMOD = 0x22; //(定时器0和1:方式2,自动重装,8位)
- j# n' Z; s5 c4 cTH1=253;  //11.0592MHZ,9600bps。没有设置SMOD,故波特率没有加倍。即:11.0592/12/3/32=9600bps: }" @8 R8 v6 o
TL1=253;" C/ l% c; i) q6 ^: P( d
TR1=1;    //启动定时器/ T$ A+ d' G- r! |* L! x
, _6 C6 f  E" f0 o
  TH0 = 244;6 }8 L" E6 W+ c! K. G2 N
  TL0 = 244; //(WXL:即计数12次中断一次,即11.0592MHZ晶振,机器周期是1.085us,12次*1.085=13.02us,这样达38KHZ。  13us一次中断,时间太短了,所以单片机要快): B5 t4 D% q+ Y8 x; ]& `: G
  ET0 = 1;   //定时器0中断允许  U; x8 `0 ^7 ]# O# {
  EA = 1;    //允许CPU中断; _: S' r- z  S' h" i+ H
  TR0 = 1;   //开始计数$ p$ {$ ]: Z: a
0 N; t( \- i2 U+ C& E6 a  M- o$ {
  g_iraddr1=0;       //地址码8 M$ h1 ~# z4 @3 P. }7 M1 u5 R
  g_iraddr2=255;     //地址反码3 ^: m9 R% b% U% P" }0 l) z" E" E6 U: a4 ~

% v- _1 ]# ]* G- H) NRI=0;( N7 t5 c* s/ N
while(1)
) L, A3 c6 p+ W& W# U  ?& ^# _% o{* i+ W% K/ m0 K" V5 }: Y
if(RI==1)
' ]2 ^( C# v: b# j5 @{+ x) V/ V2 T0 [5 ]( D* \+ y7 X( l, f
com_data =SBUF;
. }2 R1 U* w+ r5 X6 sRI=0;       //要人工清RI; V- k" t; {: R- o* S* X- B
SendIRdata(com_data);   //发送红外数据4 ?7 y8 B. F( s2 J# A% q. \
TI=0;
. x/ q* F9 U- cSBUF = com_data;   //输出字符
: I2 H' q" L9 h( V& Ewhile(!TI) ;     //空语句判断字符是否发完,TI=1表示发完1 ?, D3 R9 t. V' n
TI = 0;         //要人工清TI
3 N& V/ r( h% G- c" |}, A; j% t* {: U+ y! N1 ~' i) \- ]0 F
}: i& ]6 ^, z3 B

. r/ b' \8 W7 Z4 r3 L}

该用户从未签到

2#
发表于 2022-5-19 13:00 | 只看该作者

7 `( r% ~7 G4 p+ j- j, d谢谢楼主分享,收藏参考学习下,在学习中

该用户从未签到

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-6-6 20:44 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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