keil c51红外遥控解码程序

发布者:二进制游侠最新更新时间:2016-10-21 来源: eefocus关键字:keil  c51  红外遥控解码 手机看文章 扫描二维码
随时随地手机看文章
本keil c51程序适用uPC1621/uPC1622及兼容的红外遥控器芯片,占用外部中断0和定时器1,以中断方式解码,节省系统资源,以查询方式检测遥控信号是否有效.

解码思路:

红外线经一体化接受头解码放到后送到单片机的外部中断0,单片机设置外部中断下降沿触发,T0和T1为16位定时器,T0在系统启动后定时5ms.T1在外部中断0启动后开始定时,初值为0,每次在INT0中断后先读T1计数值,并重设初值为0,而且判断T1的计数值,

代码
  1. //Fosc=11.0592MHz
  2. //statesforandvariablesIRdataprocessing
  3. typedefenum{
  4. IR_idle,
  5. IR_waitstart,
  6. IR_getaddr,
  7. IR_getaddrinv,
  8. IR_getdata,
  9. IR_getdatainv
  10. }_IRstate
  11.  
  12. _IRstateIRstate=IR_idle
  13.  
  14. unsignedcharIRaddr=0xff
  15. unsignedchar_IRaddr=0xff
  16. unsignedcharIRdata=0xff
  17. unsignedchar_IRdata=0xff
  18. unsignedcharIR_repeat=0
  19. unsignedcharIR_ready=0
  20. unsignedcharIR_poweron=0
  21. //bitir_done=0
  22. //timeconstants
  23. unsignedintIRtimer=0//IRtimeout
  24.  
  25. //cpu初始化
  26. voidcpu_init(void)
  27. {
  28. TMOD=0X11//T0andT1十六位定时
  29. TH0=0xee//fosc=11.0592M,timer=5ms
  30. TL0=0x00
  31. TR0=1//runtimer0
  32. TF0=0
  33.  
  34. ET0=1//enabletmr0overflowinterrupt
  35. IT0=1//int0edgesensitive
  36. EX0=1//enable"int0"
  37. EA=1//globalinteruptenable
  38. }
  39.  
  40. //T0中断
  41. voidtmrint()interrupt1
  42. {
  43. TH0=0xee
  44. TL0=0x00
  45. if(IRtimer)//IR接收超时
  46. --IRtimer//
  47. else
  48. {
  49. IRstate=IR_idle
  50. //IR_poweron=0
  51. }
  52. }
  53.  
  54. //Fosc=11.0592MHz
  55. #definemsec_12p50x2d00
  56. #definemsec_150x3600
  57. #definemsec_90x2066
  58. //#definemsec_90x1066
  59. #definemsec_2p50x900
  60. #definemsec_0p90x33d
  61. #definemsec_1p680x610
  62.  
  63.  
  64. //voidIRint()interrupt0(void)
  65.  
  66. //WhentheIRreceivepingoeslowandinterruptisgenerated
  67. //IRiscollectedbystartingtimer2inthefirstfallingedgeofthepin
  68. //thenoneveryotherfallingedge,thetimervalueissavedandthetimerrestarted.
  69. //thecapturedtimeisthenusedtogettheIRdata
  70. //a"startofdata"is13.5Msec,a"1"is2.25Msec,a"0"is1.12msecanda"repeat"is11.25msec.
  71. //thecounterincrementsat1.085Usec
  72. //Iallowafairlylargetolerancetotimejitterbuttherearenofalsetriggersseen.
  73.  
  74. voidIRint()interrupt0
  75. {
  76. staticunsignedcharbits
  77. unsignedshorttime
  78. switch(IRstate)
  79. {
  80. caseIR_idle:
  81. TL1=0
  82. TH1=0
  83. TR1=1
  84. IRstate=IR_waitstart
  85. IRtimer=26
  86. break
  87. caseIR_waitstart://P2_4=!P2_4
  88. TR1=0
  89. time=TH1
  90. time=(time<<8)+TL1
  91. TL1=0
  92. TH1=0
  93. TR1=1
  94. if((time>msec_12p5)&&(time
  95. {
  96. IRaddr=0
  97. _IRaddr=0
  98. IRdata=0
  99. _IRdata=0
  100. bits=1
  101. IRstate=IR_getaddr
  102. }
  103. elseif((time>msec_9)&&(time
  104. {
  105. IR_repeat=2
  106. IRstate=IR_idle
  107. }
  108. else
  109. {//toshort,baddatajustgotoidle
  110. IRstate=IR_idle
  111. }
  112. break
  113. caseIR_getaddr://P2_4=!P2_4
  114. TR1=0
  115. time=TH1
  116. time=(time<<8)+TL1
  117. TL1=0
  118. TH1=0
  119. TR1=1
  120. if((time>msec_2p5)||(time2.5msecorshorterthan.9Msecbaddata,gotoidle
  121. {
  122. IRstate=IR_idle
  123. break
  124. }
  125. if(time>msec_1p68)//greaterthan1.68Msecisa1
  126. {
  127. IRaddr|=bits
  128. }
  129. bits=bits<<1
  130. if(!bits)
  131. {
  132. IRstate=IR_getaddrinv
  133. bits=1
  134. }
  135. break
  136. caseIR_getaddrinv://P2_4=!P2_4
  137. TR1=0
  138. time=TH1
  139. time=(time<<8)+TL1
  140. TL1=0
  141. TH1=0
  142. TR1=1
  143. if((time>msec_2p5)||(time2.5msecorshorterthan.9Msecbaddata,gotoidle
  144. {
  145. IRstate=IR_idle
  146. break
  147. }
  148. if(time>msec_1p68)//greaterthan1.68Msecisa1
  149. {
  150. _IRaddr|=bits
  151. }
  152. bits=bits<<1
  153. if(!bits)
  154. {
  155. IRstate=IR_getdata
  156. bits=1
  157. }
  158. break
  159. caseIR_getdata:
  160. TR1=0
  161. time=TH1
  162. time=(time<<8)+TL1
  163. TL1=0
  164. TH1=0
  165. TR1=1
  166. if((time>msec_2p5)||(time2.5msecorshorterthan.9Msecbaddata,gotoidle
  167. {
  168. IRstate=IR_idle
  169. break
  170. }
  171. if(time>msec_1p68)//greaterthan1.68Msecisa1
  172. {
  173. IRdata|=bits
  174. }
  175. bits=bits<<1
  176. if(!bits)
  177. {
  178. IRstate=IR_getdatainv
  179. bits=1
  180. }
  181. break
  182. caseIR_getdatainv:
  183. TR1=0
  184. time=TH1
  185. time=(time<<8)+TL1
  186. TL1=0
  187. TH1=0
  188. TR1=1
  189. if((time>msec_2p5)||(time2.5msecorshorterthan.9Msecbaddata,gotoidle
  190. {
  191. IRstate=IR_idle
  192. break
  193. }
  194. if(time>msec_1p68)//greaterthan1.68Msecisa1
  195. {
  196. _IRdata|=bits
  197. }
  198. bits=bits<<1
  199. if(!bits)//wehaveitall,nowwemakesureitisaNECcodefromtheCHSIRtransmitter
  200. {//makesureaddress,~addressarecorrect,data,~dataarecorrectandaddressis0.
  201. IR_ready=((IRaddr^_IRaddr)==0xff)&&((IRdata^_IRdata)==0xff)&&(IRaddr==0)
  202. if(IR_ready)
  203. {
  204. IRstate=IR_idle
  205. }
  206. }
  207. break
  208. default:
  209. IRstate=IR_idle
  210. break
  211. }
  212. }
  213.  
  214. voidmain(void)
  215. {
  216. cpu_init()
  217. while(1)
  218. {
  219. if(IR_ready)
  220. {
  221. IR_ready=0
  222. switch(IRdata)
  223. {
  224. case0x45://1
  225. //yourcode
  226. break
  227. case0x44://3
  228. //yourcode
  229. break
  230. case0x43://4
  231. //yourcode
  232. break
  233. case0x08://prev
  234. //yourcode
  235. break
  236. case0x5a://next
  237. //yourcode
  238. break
  239. default:
  240. break
  241. &n bsp}
  242. }
  243. }
关键字:keil  c51  红外遥控解码 引用地址:keil c51红外遥控解码程序

上一篇:超低功耗低测量频率数据采集记录系统的设计
下一篇:89C51引脚图及功能

推荐阅读最新更新时间:2024-03-16 15:16

地址锁存器74ls373和273的区别以及和c51单片机
74LS273 是带公共时钟复位八D触发器 74LS373 是三态同相八D锁存器 273与373的引脚排列是相同的,唯一的差别是两者1、11脚的功能不同. 对273 (1).1脚是复位CLR,低电平有效,当1脚是低电平时,输出脚2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)全部输出0,即全部复位; (2).当1脚为高电平时,11(CLK)脚是锁存控制端,并且是上升沿触发锁存,当11脚有一个上升沿,立即锁存输入脚3、4、7、8、13、14、17、18的电平状态,并且立即呈现在在输出脚2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q
[单片机]
Keil工程文件的建立、设置与目标文件的获得
  单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于 MCS-51 单片机的汇编 软件有早期的 A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级 语言开发,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发 MCS-51 系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可看出。Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(u
[单片机]
<font color='red'>Keil</font>工程文件的建立、设置与目标文件的获得
C51 Timer 计数器
Timer0 计数器: #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit LED=P1^2; //定义LED端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01 | 0x04; //使用模式1,16位计数器,使用 | 符号可以在使用多个定时器时不受影响 TH0=0xFF;
[单片机]
STM32之_keil编译内存大小解析
Program Size: Code=28784 RO-data=6480 RW-data=60 ZI-data=3900 的含义 1. Code: 程序所占用的FLASH大小,存储在FLASH. 2. RO-data: Read-only-data,程序定义的常量,存储在FLASH中。 3. RW-data:Read-write-data,已经被初始化的变量,存储在SRAM中。 4. ZI-data:Zero-Init-data,未被初始化的变量,存储在SRAM中。 简单的说就是在烧写的时候是FLASH中的被占用的空间为: ROM(Flash) size = Code+RO-data+RW-data; 上面代码大小
[单片机]
STM32之_<font color='red'>keil</font>编译内存大小解析
C51中断函数格式
C51 Keil 编译器中断函数语法定义: void 函数名() interrupt n using m C51编译器允许0~31个中断,C51控制器所提供的中断及中断地址如下: 中断号 中断源 中断地址 0 EXTERNAL 0 0003H 1 TIMER/COUNTER 0 000BH 2 EXTERNAL 1 0013H 3 TIMER/COUNTER 1 001BH 4 SERIAL PORT 0023H 中断函数编写规则: 不能进行参数传递 无返回值 在任何情况,不能直接调用中断函数 可以在中断函数定义中用using指定当前使用的寄存器组 void 函数名 () i
[单片机]
C51单片机是怎么存储程序和数据的
初学51总是会有这样的疑问,从电脑下载程序到开发板后,程序去哪了? C51中,用户或应用程序,系统程序和数据都是存放在哪的? 51单片机从物理结构上,可分为片内,片外程序存储器,片内片外数据存储器。 51单片机从功能上,有程序存储器,片内数据存储器,特殊功能寄存器,位地址空间,片外数据存储器。 程序存储器 51单片机的程序存储器用于存储代码和一些固定表格常数。 可寻址的程序存储器空间为64KB。 51单片机的从物理角度上可分为:片内,片外程序存储器,作为编址空间,编址规律是:先片内,后片外,片内片外连续,不重叠。 如图:为51单片机程序存储器编址图。 单片机如何执行指令? 如图: 无论片内程序存储器,还是片外程序存储器,他
[单片机]
C51单片机学习笔记(一)——搭建开发环境及烧写工具
1.搭建软件开发环境及使用(Keil uVision) 目前常用的有Keil uVision2、Keil uVision3、Keil uVision4,这些软件可以很方便的在网络上下载,我这里使用的是Keil uVision4. ** 1. 创建一个工程:(以点亮一个发光二极管为例) 菜单点击Project - New uVision Project ,给工程命名、选择储存位置然后保存 选芯片,根据自己的单片机型号选择对应的芯片,我使用的是AT89C52 之后弹出 是否将系统自带的初始化文件添加到工程?一般选择是,这是主界面左边Project面板会显示新建的工程。 新建源程序文件 点击File - New ,在软件
[单片机]
<font color='red'>C51</font>单片机学习笔记(一)——搭建开发环境及烧写工具
Keil与Proteus实现51单片机完美联调
之前我们介绍过Proteus单片机的程序仿真调试,但是对于绝大部分单片机爱好者来说,最熟悉的开发软件还是Keil,我们再来详细介绍下Proteus怎么结合Keil软件搭建强大的51单片机联合调试环境。 我们先来看下联合调试仿真效果 Keil C51软件版本:V9.54 Proteus软件版本:8.9 怎么搭建这种联合调试环境,我们接下来一步一步实现 我们这里需要用到一个“VDM51.dll”的文件 下载地址: VDM51.dll 163.8K · 百度网盘 第一步:将文件复制到Keil C51的安装目录下 我这里的Keil C51目录是在 D:Keil_v5C51BIN 这里需要修改 TOOLS 这个文件
[单片机]
<font color='red'>Keil</font>与Proteus实现51单片机完美联调
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved