找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

共享一个AVR红外发送和接收的头文件

[复制链接]
慧龙 发表于 2010-5-13 23:42:31 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

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

×
  1. /********************************************************************

  2. * 函数库说明:包含了红外通讯常用收发函数和工具 *

  3. * 版本说明:1.0 Bate *

  4. * 作者:xky183 *

  5. * 日期:2003年7月 *

  6. * 修改:GorgonMeducer *

  7. * 日期:2005年4月21日 *

  8. * 平台:RC 8M *

  9. * *

  10. * 说明:红外通讯使用的格式为字节直接发送模式,提供4位自校验的函数 *

  11. * 通讯时记录载波宽度。未使用串口帧格式。软件载波。 *

  12. * *

  13. * 硬件连接说明:PC5发送数据(可以修改宏定义) 外中断0接收数据 *

  14. * *

  15. * 使用说明:添加必要的代码到定时器中断,并且使用头函数中的定时器初 *

  16. * 始化程序。使用程序中的外中断初始化程序,添加必要的部分 *

  17. * 到外中断处理程序中。 *

  18. * 发送 数据的时候,调用函数RaySend(),也可以调用KeyDeal()*

  19. * 来处理并发送4位的控制信号。 *

  20. * 对于接收信号,直接从Ordar或者RayDataIn中读取收到的字节 *

  21. * 请自己清空RayDataIn变量 *

  22. * 接受到的数据保存在变量ray_ordar *

  23. * 开启红外线接收时要开外中断0: GICR=0x40; *

  24. ********************************************************************/





  25. /*------------------------------------------------------------------*

  26. * 红外发射程序 *

  27. *------------------------------------------------------------------*/





  28. #define ray_IO_on PORTC |=0B00100000;

  29. #define ray_IO_off PORTC &=0B11011111;

  30. #define T1I_on TIMSK |=0B00000001;

  31. #define T1I_off TIMSK &=0B11111110;

  32. /*---------------------*/

  33. /* 红外发射全局变量 */

  34. /*---------------------*/

  35. char ray_Flag = 0;

  36. char ray_Sign = 0;



  37. /*---------------------*/

  38. /* 函数声明区 */

  39. /*---------------------*/

  40. char KeyDeal(char TempData); //数据编码发送函数

  41. void RaySend(unsigned char DataTemp); //数据红外发送函数

  42. void delay_1ms(void);

  43. void Delay_Ms(unsigned int n);

  44. void Timer0_init(void);

  45. void ray_send_init(void);



  46. /***********红外线发射*****************

  47. void ray_send_init(void) *

  48. { *

  49. Timer0_init(); *

  50. } *

  51. **************************************/



  52. /********************************************************************

  53. * 函数说明:1 MS延时程序 *

  54. ********************************************************************/

  55. void delay_1ms(void)

  56. {

  57. unsigned int i;

  58. for(i=1;i<(unsigned int)(8*143-2);i++)

  59. ;

  60. }



  61. /********************************************************************

  62. * 函数说明:MS延时程序 *

  63. * 输入:需要延时的时长 *

  64. ********************************************************************/

  65. void Delay_Ms(unsigned int n)

  66. {

  67. unsigned int i=0;

  68. while(i<n)

  69. {

  70. delay_1ms();

  71. i++;

  72. }

  73. }

  74. /*-------------------------------------------------------------------

  75. * 发射程序需要定时器0的支持,请粘贴以下代码到主程序 *

  76. --------------------------------------------------------------------/

  77. /********************************************************************

  78. * 函数说明:定时器0中断处理程序,用来产生40MHz的载波 *

  79. *********************************************************************

  80. #pragma interrupt_handler timer0_ovf_isr:10

  81. void timer0_ovf_isr(void) //需要定时器0的中断支持本函数库

  82. {

  83. TCNT0=0xa5;

  84. ray_Flag++;

  85. ray_Sign=1;

  86. }

  87. /********************************************************************

  88. * 函数说明:定时器0初始化程序 *

  89. *********************************************************************

  90. void Timer0_init(void)

  91. {

  92. TCCR0=0x01; // CK

  93. TCNT0=0x9b;



  94. }

  95. -------------------------------------------------------------------*/



  96. /*******************************************************************

  97. * 函数说明:红外发送程序 *

  98. * 输入:要发送的数据 *

  99. *******************************************************************/

  100. void RaySend(unsigned char DataTemp)

  101. {

  102. unsigned char i=0,DataBit=0;



  103. ray_Flag=0;

  104. ray_Sign=0;

  105. T1I_off;



  106. for (i=0;i<8;i++)

  107. {

  108. DataBit=DataTemp & 0x01;

  109. if(DataBit==0)

  110. {

  111. T1I_on;

  112. while (ray_Flag<40)

  113. {

  114. ray_IO_on; //产生高电平

  115. ray_Sign=0;

  116. while( ray_Sign !=1);

  117. ray_IO_off; //产生低电平

  118. ray_Sign=0;



  119. while( ray_Sign !=1);

  120. }

  121. ray_Flag=0;

  122. ray_Sign=0;

  123. ray_IO_off; //产生低电平

  124. //13.125us的时间

  125. while (ray_Flag<=40); //50

  126. T1I_off;

  127. ray_Flag=0;

  128. ray_Sign=0;



  129. DataTemp=DataTemp>>1;

  130. }

  131. else

  132. {

  133. T1I_on;

  134. while (ray_Flag<80)

  135. { ray_IO_on; //产生高电平

  136. ray_Sign=0;

  137. while( ray_Sign !=1);

  138. ray_IO_off; //产生低电平

  139. ray_Sign=0;



  140. while( ray_Sign !=1)

  141. ;

  142. }

  143. ray_Flag=0;

  144. ray_Sign=0;

  145. ray_IO_off; //产生低电平

  146. //13.125us的时间

  147. while (ray_Flag<=40); //50

  148. T1I_off;

  149. ray_Flag=0;

  150. ray_Sign=0;

  151. DataTemp=DataTemp>>1;

  152. }

  153. }



  154. ray_Flag=0;

  155. ray_IO_off; //为低电平

  156. i=0;

  157. T1I_off;



  158. Delay_Ms(6); //两个字节的数据之间间隔

  159. }



  160. char KeyDeal(char TempData)

  161. /********************************************************************

  162. * 函数说明:数据格式转换(4位数据加上自己的反码作交验) *

  163. * 输入:需要转换和发送的信息 *

  164. * 输出:转换好的数据,并自动发送数据 *

  165. ********************************************************************/

  166. {

  167. char TempReturn=0;

  168. char i=0;

  169. TempReturn =~ TempData & 0x0f;

  170. TempReturn <<= 4;

  171. TempReturn |= 0x0f & TempData;

  172. for(i=0;i<10;i++)

  173. {

  174. RaySend(TempReturn);

  175. Delay_Ms(6);

  176. }

  177. return TempReturn;

  178. }









  179. /*------------------------------------------------------------------*

  180. * 红外接受程序 *

  181. *------------------------------------------------------------------*/



  182. /*---------------------*/

  183. /* 红外接收全局变量 */

  184. /*---------------------*/

  185. char ray_singal_num = 0; //接受信号

  186. char ray_data_in = 0; //ray_data_in为接收的数据

  187. char ray_symbol = 0;

  188. char ray_count_array[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位数组

  189. char ray_ordar = 0; //最终得到的命令(鸡肋)



  190. /*---------------------*/

  191. /* 函数声明区 */

  192. /*---------------------*/

  193. void ray_judger(void);

  194. void int0_init(void);

  195. void Timer1_init(void);



  196. /*******红外线接收**********

  197. void ray_receive_init(void)

  198. {

  199. int0_init();

  200. Timer1_init();

  201. }

  202. ***************************/





  203. /*-------------------------------------------------------------------

  204. * 发射程序需要定时器1和外中断0的支持,请粘贴以下代码到主程序 *

  205. --------------------------------------------------------------------/

  206. /********************************************************************

  207. * 函数说明:定时器1初始化程序 *

  208. *********************************************************************

  209. void Timer1_init(void)

  210. {

  211. TCNT1 =0;

  212. TCCR1B =0x03;

  213. }

  214. /********************************************************************

  215. * 函数说明:外中断0初始化程序 *

  216. *********************************************************************

  217. void int0_init(void)

  218. {

  219. MCUCR=0x02;//开中断0、下降沿触发脉冲

  220. GIFR=0Xff;

  221. }

  222. #pragma interrupt_handler ext_int0:2 //M8参考外中断向量

  223. /********************************************************************

  224. * 函数说明:外中断0中断处理程序 *

  225. *********************************************************************

  226. void ext_int0(void)

  227. {

  228. char temp =0;

  229. temp = TIMSK;

  230. TIMSK = 0;

  231. if(ray_symbol == 0)

  232. {

  233. if(TCNT1 >= 0x00ff) //大于4MS则重置指针

  234. {

  235. ray_singal_num = 0;

  236. }

  237. TCNT1 = 0X00; //0.5ms记数值为31

  238. MCUCR = 0X03; //INT0上升沿触发

  239. ray_symbol = 1;

  240. }

  241. else

  242. {

  243. if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))

  244. {

  245. ray_count_array[ray_singal_num] = TCNT1L;

  246. ray_singal_num ++;

  247. if (ray_singal_num == 8)

  248. {

  249. ray_singal_num = 0;

  250. ray_judger();

  251. }

  252. ray_symbol = 0;

  253. }

  254. else

  255. {



  256. ray_singal_num = 0;

  257. }



  258. MCUCR = 0X02; //INT0下降沿触发

  259. TCNT1 = 0;

  260. }

  261. TIMSK = temp;

  262. }

  263. /*******************************************************************/



  264. /********************************************************************

  265. * 函数说明:红外信号处理程序 *

  266. ********************************************************************/

  267. void ray_judger(void)

  268. {

  269. char i=0;

  270. ray_data_in=0;



  271. for(i=0;i<8;i++) //加入适当的冗错处理

  272. {

  273. if(ray_count_array[i] < 0x38) //0.5ms为低电平

  274. {

  275. ray_data_in &= ~(1<<i);

  276. }

  277. if(ray_count_array[i] >=0x38) //1ms为高电平

  278. {

  279. ray_data_in |= (1<<i);

  280. }

  281. }

  282. ray_ordar = ray_data_in;

  283. }

复制代码
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 13:54 , Processed in 0.055743 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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