找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2453|回复: 3
收起左侧

单片机红外通信发射程序

[复制链接]
ID:247795 发表于 2017-11-9 19:42 | 显示全部楼层 |阅读模式

  1. #include "reg52.h"
  2. sbit ir=P1^0;//红外发射管控制脚,使用24M晶振
  3. sbit ka=P2^0;
  4. sbit kb=P2^1;
  5. unsigned int count, set_count; //中断计数,设定中断次数
  6. bit irflag,keyflag; //红外发送标志位,按键标志位
  7. unsigned char irsys[]={0x00,0xff};//16位用户码
  8. unsigned char irdata,ircode; //发送的红外数据
  9. //---------------------------------------------------------------------------
  10. void delay(unsigned int a)//延时约1ms,晶振24M ,此处延时不需很精确
  11. {
  12. unsigned char i;
  13. while(--a!=0)
  14. for(i=300;i>0;i--); //若是12M晶振i=125
  15. }
  16. //---------------------------------------------------------------------------
  17. void keyscan() // 按键扫描
  18. {
  19. if(ka==0){keyflag=1;irdata=0x0a;} //a键按下,则发射数据0x0a
  20. if(kb==0){keyflag=1;irdata=0x0b;} //b键按下,则发射数据0x0b
  21. }
  22. //---------------------------------------------------------------------------
  23. void ir_sendbyte() //红外发送一个字节数据
  24. {
  25. unsigned char i;
  26. for(i=0;i<8;i++) //发送8位数据
  27. {
  28. set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
  29. irflag=1; //启动红外发射二极管发射
  30. count=0; //中断计数先清0
  31. TR0=1; //开启定时器0
  32. while(count<set_count); //等待发送完
  33. TR0=0; //关闭定时器0
  34. if(ircode&0x01) set_count=130;//130; //判断红外编码最低位,若为1则1.69ms的低电平 (//后为12M晶振下的数值)
  35. else set_count=43;//35; //为0则0.565ms的低电平 (//后为12M晶振下的数值)
  36. irflag=0; //低电平则不发射
  37. count=0; //中断计数清0
  38. TR0=1; //开启定时器0
  39. while(count<set_count); //等待发送完
  40. TR0=0; //关闭定时器0
  41. ircode=ircode>>1; //将数据右移,即从低位到高位发送
  42. }
  43. }
  44. //---------------------------------------------------------------------------
  45. void ir_send() //发送红外数据
  46. {
  47. set_count=692;//672; //发送编码中的引导码(9ms高电平+4.5ms低电平) (//后为12M晶振下的数值)
  48. irflag=1; //启动红外发射二极管发射
  49. count=0; //中断计数清0
  50. TR0=1;
  51. while(count<set_count);
  52. TR0=0;
  53. set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)
  54. irflag=0; //低电平则不发射
  55. count=0;
  56. TR0=1;
  57. while(count<set_count); //等待发送完
  58. TR0=0;
  59. ircode=irsys[0]; //发送16位用户码的前1-8位
  60. ir_sendbyte();
  61. ircode=irsys[1]; //发送16位用户码的前9-16位
  62. ir_sendbyte();
  63. ircode=irdata; //发送8位数据码
  64. ir_sendbyte();
  65. ircode=~irdata; //发送8位数据反码
  66. ir_sendbyte();
  67. set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
  68. irflag=1;
  69. count=0;
  70. TR0=1;
  71. while(count<set_count);
  72. TR0=0;
  73. ir=1;
  74. delay(23);


  75. //延时23ms(编码中的23ms低电平)
  76. set_count=692;//670; //发送编码中的引导码(9ms高电平+4.5ms低电平) (//后为12M晶振下的数值)
  77. irflag=1;
  78. count=0;
  79. TR0=1;
  80. while(count<set_count);
  81. TR0=0;
  82. set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)
  83. irflag=0;
  84. count=0;
  85. TR0=1;
  86. while(count<set_count);
  87. TR0=0;
  88. set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
  89. irflag=1;
  90. count=0;
  91. TR0=1;
  92. while(count<set_count);
  93. TR0=0;
  94. ir=1; //发射完了关闭红外发射二极管
  95. }
  96. //---------------------------------------------------------------------------
  97. void timer0_init() //定时器初始化
  98. {
  99. EA=1;
  100. TMOD=0x02; //定时0 8位自动重装模式
  101. ET0=1;
  102. TH0=0xe6;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值)
  103. TL0=0xe6;
  104. }
  105. //---------------------------------------------------------------------------
  106. void main()
  107. {
  108. timer0_init(); //定时0初始化
  109. count=0; //中断计数先清0
  110. irflag=0; //红外发射标志先置0
  111. while(1)
  112. {
  113. keyscan(); //键值扫描
  114. if(keyflag) //若有按键按下
  115. {
  116. delay(10);
  117. ir_send(); //发送红外编码
  118. delay(500);
  119. keyflag=0; //按键标志清零
  120. delay(100);
  121. }
  122. }
  123. }
  124. //---------------------------------------------------------------------------
  125. void timer0() interrupt 1 //定时器0中断
  126. {
  127. count++;
  128. if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波
  129. else ir=1; //否则不发射,即相当于发射编码中的低电平
  130. }
  131. /*说明:本人经多次调试发现若在24M晶振下使用,发射很正常,而在12M晶振下发射的数据则稳定性要差很多,正在完善中*/
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:511674 发表于 2019-4-14 14:43 | 显示全部楼层
有没有原理图
回复

使用道具 举报

ID:585455 发表于 2019-7-23 12:57 | 显示全部楼层
感謝無私分享好物
回复

使用道具 举报

ID:589399 发表于 2019-7-24 10:15 | 显示全部楼层
谢谢分享的资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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