找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2834|回复: 2
收起左侧

红外遥控程序

[复制链接]
ID:68048 发表于 2015-7-15 15:17 | 显示全部楼层 |阅读模式
希望对新手有用,里面有几个疑问请高手指点
  1. ///** STC15F104不需要外部晶振8管脚VCC/GND/P3.0-P3.5 **///
  2. ///** 四个元件实现NEC协议红外遥控的发射(STC15F104、按键开关、红外发射管、限流电阻) 还有4个IO口可以利用 **///

  3. ///** 程序烧写时选运行频率12M **///
  4. ///** P3.3接按键开关与GND链接 **///
  5. ///** P3.5接红外发射管负极,红外发射管正极接+5,注意串接限流电阻 **///



  6. //本程序主体不是自己写的,主体部分来源与admin 在2009-11-1 02:26:38 发布的红外发射实验
  7. //***http://www.51hei.com/bbs/dpj-2820-1.html****////


  8. ///*** 有的地方不了解就按自己的意识修改了一下
  9. ///1、是不是应该13um中断一次,换一次电平??????????????
  10. ///2、SendIRdata函数中 endcount原始赋值看不懂
  11. ///上学时接触几天C语言(没过级,英语太差)、自学的51,


  12. ///请教高手指点
  13. ///请教高手指点


  14. #include <STC15F104E.h>
  15. static bit OP; //红外发射管的亮灭
  16. static unsigned int count; //延时计数器
  17. static unsigned int endcount; //终止延时计数
  18. static unsigned char flag; //红外发送标志
  19. char iraddr1; //十六位地址的第一个字节
  20. char iraddr2; //十六位地址的第二个字节
  21. void SendIRdata(char p_irdata);
  22. void delay();


  23. void main(void)
  24. {
  25. ///****变量初始化******///
  26. count = 0; //延时计数器初始化
  27. flag = 0; //红外发送标志初始化
  28. OP = 1; //红外发射管的亮灭初始化
  29. P35 = 1; //红外发射io口初始化

  30. //***中断初始设置***//
  31. EA = 1; //允许CPU中断
  32. TMOD = 0x11; //设定时器0和1为16位模式1
  33. ET0 = 1; //定时器0中断允许
  34. TH0 = 0xFF; //设定时值0为38K 也就是每隔26us中断一次 TH0 = 0xFF; ????是不是应该13um换一次电平
  35. TL0 = 0xf2; // TL0 = 0xE5;
  36. TR0 = 1; //开始计数




  37. ///***地址初始化****///
  38. iraddr1=0x00; //第一字节
  39. iraddr2=0xfd; //第二字节


  40. /**进入主程序循环**/
  41. do{
  42. delay();
  43. if(P33==0)
  44. {SendIRdata(0x16);}// 在此填入发射数据
  45. }while(1);
  46. }
  47. /*****定时器0中断处理 ***/
  48. void timeint(void) interrupt 1
  49. {
  50. TH0=0xFF;
  51. TL0=0xf2; //设定时值为38K 也就是每隔26us中断一次 ????是不是应该13um换一次电平

  52. count++;

  53. if (flag==1)
  54. {
  55. OP=~OP;
  56. }
  57. else
  58. {
  59. OP = 1;
  60. }
  61. P35 = OP;
  62. }

  63. //**数据传输函数**//

  64. void SendIRdata(char p_irdata)
  65. {
  66. /*声明变量*/
  67. int i;
  68. char irdata=p_irdata;
  69. /*发送9ms的起始码*/
  70. endcount=692; /// endcount=223 223*26=5798 ?????????????????
  71. flag=1;
  72. count=0;
  73. do{}while(count<endcount);
  74. /*发送4.5ms的结果码 */
  75. endcount=346;
  76. flag=0;
  77. count=0;
  78. do{}while(count<endcount);
  79. /******发送十六位地址的前八位********/

  80. irdata=iraddr1;
  81. for(i=0;i<8;i++)
  82. {
  83. endcount=43; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
  84. flag=1;
  85. count=0;
  86. do{}while(count<endcount); //停止发送红外信号(即编码中的高电平)
  87. if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
  88. {
  89. endcount=130; //1为宽的高电平
  90. }
  91. else
  92. {
  93. endcount=43; //0为窄的高电平
  94. }
  95. flag=0;
  96. count=0;
  97. do{}while(count<endcount);
  98. irdata=irdata>>1;
  99. }
  100. /**********发送十六位地址的后八位*********/
  101. irdata=iraddr2;
  102. for(i=0;i<8;i++)
  103. {
  104. endcount=43;
  105. flag=1;
  106. count=0;
  107. do{}while(count<endcount);
  108. if(irdata-(irdata/2)*2)
  109. {
  110. endcount=130;
  111. }
  112. else
  113. {
  114. endcount=43;
  115. }
  116. flag=0;
  117. count=0;
  118. do{}while(count<endcount);
  119. irdata=irdata>>1;
  120. }
  121. ////*****发送八位数据*****/////
  122. irdata=p_irdata;
  123. for(i=0;i<8;i++)
  124. {
  125. endcount=43;
  126. flag=1;
  127. count=0;
  128. do{}while(count<endcount);
  129. if(irdata-(irdata/2)*2)
  130. {
  131. endcount=130;
  132. }
  133. else
  134. {
  135. endcount=43;
  136. }
  137. flag=0;
  138. count=0;
  139. do{}while(count<endcount);
  140. irdata=irdata>>1;
  141. }
  142. /******发送八位数据的反码******/
  143. irdata=~p_irdata;
  144. for(i=0;i<8;i++)
  145. {
  146. endcount=43;
  147. flag=1;
  148. count=0;
  149. do{}while(count<endcount);
  150. if(irdata-(irdata/2)*2)
  151. {
  152. endcount=130;
  153. }
  154. else
  155. {
  156. endcount=43;
  157. }
  158. flag=0;
  159. count=0;
  160. do{}while(count<endcount);
  161. irdata=irdata>>1;
  162. }

  163. endcount=43;
  164. flag=1;
  165. count=0;
  166. do{}while(count<endcount);
  167. flag=0;

  168. }
  169. ///****延时函数***////
  170. void delay()
  171. {
  172. int i,j;
  173. for(i=0;i<400;i++)
  174. {
  175. for(j=0;j<100;j++)
  176. {
  177. }
  178. }
  179. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:51142 发表于 2015-11-4 11:31 | 显示全部楼层
学习了,顶。。。。
回复

使用道具 举报

ID:130591 发表于 2016-7-19 13:03 | 显示全部楼层
正在学习,谢谢了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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