登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
AVR单片机论坛
›
共享一个AVR红外发送和接收的头文件
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
共享一个AVR红外发送和接收的头文件
[复制链接]
2660
0
慧***
超级版主
发表于 2010-5-13 23:42:31
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
/********************************************************************
* 函数库说明:包含了红外通讯常用收发函数和工具 *
* 版本说明:1.0 Bate *
* 作者:xky183 *
* 日期:2003年7月 *
* 修改:GorgonMeducer *
* 日期:2005年4月21日 *
* 平台:RC 8M *
* *
* 说明:红外通讯使用的格式为字节直接发送模式,提供4位自校验的函数 *
* 通讯时记录载波宽度。未使用串口帧格式。软件载波。 *
* *
* 硬件连接说明:PC5发送数据(可以修改宏定义) 外中断0接收数据 *
* *
* 使用说明:添加必要的代码到定时器中断,并且使用头函数中的定时器初 *
* 始化程序。使用程序中的外中断初始化程序,添加必要的部分 *
* 到外中断处理程序中。 *
* 发送 数据的时候,调用函数RaySend(),也可以调用KeyDeal()*
* 来处理并发送4位的控制信号。 *
* 对于接收信号,直接从Ordar或者RayDataIn中读取收到的字节 *
* 请自己清空RayDataIn变量 *
* 接受到的数据保存在变量ray_ordar *
* 开启红外线接收时要开外中断0: GICR=0x40; *
********************************************************************/
/*------------------------------------------------------------------*
* 红外发射程序 *
*------------------------------------------------------------------*/
#define ray_IO_on PORTC |=0B00100000;
#define ray_IO_off PORTC &=0B11011111;
#define T1I_on TIMSK |=0B00000001;
#define T1I_off TIMSK &=0B11111110;
/*---------------------*/
/* 红外发射全局变量 */
/*---------------------*/
char ray_Flag = 0;
char ray_Sign = 0;
/*---------------------*/
/* 函数声明区 */
/*---------------------*/
char KeyDeal(char TempData); //数据编码发送函数
void RaySend(unsigned char DataTemp); //数据红外发送函数
void delay_1ms(void);
void Delay_Ms(unsigned int n);
void Timer0_init(void);
void ray_send_init(void);
/***********红外线发射*****************
void ray_send_init(void) *
{ *
Timer0_init(); *
} *
**************************************/
/********************************************************************
* 函数说明:1 MS延时程序 *
********************************************************************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(8*143-2);i++)
;
}
/********************************************************************
* 函数说明:MS延时程序 *
* 输入:需要延时的时长 *
********************************************************************/
void Delay_Ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
delay_1ms();
i++;
}
}
/*-------------------------------------------------------------------
* 发射程序需要定时器0的支持,请粘贴以下代码到主程序 *
--------------------------------------------------------------------/
/********************************************************************
* 函数说明:定时器0中断处理程序,用来产生40MHz的载波 *
*********************************************************************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void) //需要定时器0的中断支持本函数库
{
TCNT0=0xa5;
ray_Flag++;
ray_Sign=1;
}
/********************************************************************
* 函数说明:定时器0初始化程序 *
*********************************************************************
void Timer0_init(void)
{
TCCR0=0x01; // CK
TCNT0=0x9b;
}
-------------------------------------------------------------------*/
/*******************************************************************
* 函数说明:红外发送程序 *
* 输入:要发送的数据 *
*******************************************************************/
void RaySend(unsigned char DataTemp)
{
unsigned char i=0,DataBit=0;
ray_Flag=0;
ray_Sign=0;
T1I_off;
for (i=0;i<8;i++)
{
DataBit=DataTemp & 0x01;
if(DataBit==0)
{
T1I_on;
while (ray_Flag<40)
{
ray_IO_on; //产生高电平
ray_Sign=0;
while( ray_Sign !=1);
ray_IO_off; //产生低电平
ray_Sign=0;
while( ray_Sign !=1);
}
ray_Flag=0;
ray_Sign=0;
ray_IO_off; //产生低电平
//13.125us的时间
while (ray_Flag<=40); //50
T1I_off;
ray_Flag=0;
ray_Sign=0;
DataTemp=DataTemp>>1;
}
else
{
T1I_on;
while (ray_Flag<80)
{ ray_IO_on; //产生高电平
ray_Sign=0;
while( ray_Sign !=1);
ray_IO_off; //产生低电平
ray_Sign=0;
while( ray_Sign !=1)
;
}
ray_Flag=0;
ray_Sign=0;
ray_IO_off; //产生低电平
//13.125us的时间
while (ray_Flag<=40); //50
T1I_off;
ray_Flag=0;
ray_Sign=0;
DataTemp=DataTemp>>1;
}
}
ray_Flag=0;
ray_IO_off; //为低电平
i=0;
T1I_off;
Delay_Ms(6); //两个字节的数据之间间隔
}
char KeyDeal(char TempData)
/********************************************************************
* 函数说明:数据格式转换(4位数据加上自己的反码作交验) *
* 输入:需要转换和发送的信息 *
* 输出:转换好的数据,并自动发送数据 *
********************************************************************/
{
char TempReturn=0;
char i=0;
TempReturn =~ TempData & 0x0f;
TempReturn <<= 4;
TempReturn |= 0x0f & TempData;
for(i=0;i<10;i++)
{
RaySend(TempReturn);
Delay_Ms(6);
}
return TempReturn;
}
/*------------------------------------------------------------------*
* 红外接受程序 *
*------------------------------------------------------------------*/
/*---------------------*/
/* 红外接收全局变量 */
/*---------------------*/
char ray_singal_num = 0; //接受信号
char ray_data_in = 0; //ray_data_in为接收的数据
char ray_symbol = 0;
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位数组
char ray_ordar = 0; //最终得到的命令(鸡肋)
/*---------------------*/
/* 函数声明区 */
/*---------------------*/
void ray_judger(void);
void int0_init(void);
void Timer1_init(void);
/*******红外线接收**********
void ray_receive_init(void)
{
int0_init();
Timer1_init();
}
***************************/
/*-------------------------------------------------------------------
* 发射程序需要定时器1和外中断0的支持,请粘贴以下代码到主程序 *
--------------------------------------------------------------------/
/********************************************************************
* 函数说明:定时器1初始化程序 *
*********************************************************************
void Timer1_init(void)
{
TCNT1 =0;
TCCR1B =0x03;
}
/********************************************************************
* 函数说明:外中断0初始化程序 *
*********************************************************************
void int0_init(void)
{
MCUCR=0x02;//开中断0、下降沿触发脉冲
GIFR=0Xff;
}
#pragma interrupt_handler ext_int0:2 //M8参考外中断向量
/********************************************************************
* 函数说明:外中断0中断处理程序 *
*********************************************************************
void ext_int0(void)
{
char temp =0;
temp = TIMSK;
TIMSK = 0;
if(ray_symbol == 0)
{
if(TCNT1 >= 0x00ff) //大于4MS则重置指针
{
ray_singal_num = 0;
}
TCNT1 = 0X00; //0.5ms记数值为31
MCUCR = 0X03; //INT0上升沿触发
ray_symbol = 1;
}
else
{
if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))
{
ray_count_array[ray_singal_num] = TCNT1L;
ray_singal_num ++;
if (ray_singal_num == 8)
{
ray_singal_num = 0;
ray_judger();
}
ray_symbol = 0;
}
else
{
ray_singal_num = 0;
}
MCUCR = 0X02; //INT0下降沿触发
TCNT1 = 0;
}
TIMSK = temp;
}
/*******************************************************************/
/********************************************************************
* 函数说明:红外信号处理程序 *
********************************************************************/
void ray_judger(void)
{
char i=0;
ray_data_in=0;
for(i=0;i<8;i++) //加入适当的冗错处理
{
if(ray_count_array[i] < 0x38) //0.5ms为低电平
{
ray_data_in &= ~(1<<i);
}
if(ray_count_array[i] >=0x38) //1ms为高电平
{
ray_data_in |= (1<<i);
}
}
ray_ordar = ray_data_in;
}
复制代码
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
I2C通信接口段码液晶驱动芯片VK2C21C SOP20
产品品牌:永嘉微电/VINKA 产品型号:VK2C21C 封装形式:SOP20 概述 VK2C21C是
VK2C21B SOP24高抗干扰LCD液晶段码驱动芯片
产品品牌:永嘉微电/VINKA 产品型号:VK2C21B 封装形式:SOP24 概述 VK2C2B是一
低成本、高性能、带EEPROM了解一下
无锡矽杰微电子的XCE855E 是一颗带 EEPROM 的 8 位单片机,专为多 IO 产品的应用而设
工控仪表/水电气表LCD驱动/抗干扰液晶段码
产品品牌:永嘉微电/VINKA 产品型号:VK2C21A 封装形式:SOP28 概述 VK2C21是一
为什么电动车会着火?原因是什么?电动车充
其实电动车起火的新闻我们也不是第一次看到了,让很多人对电动车的安全性产生质疑,但
更多
精华推荐
I2C通信接口段码液晶驱动芯片VK2C21C SOP20
VK2C21B SOP24高抗干扰LCD液晶段码驱动芯片
低成本、高性能、带EEPROM了解一下
工控仪表/水电气表LCD驱动/抗干扰液晶段码
软件模拟2812通信协议导致的种种问题,你遇
适用于电子鞭炮、电子蜡烛灯等方案的单片机
为什么电动车会着火?原因是什么?电动车充
性价比超高的国产单片机了解一下
更多
社区学堂
I2C通信接口段码液晶驱动芯片VK2C21C S
VK2C21B SOP24高抗干扰LCD液晶段码驱动
I2C通信接口段码液晶驱动芯片VK2C21C SOP20
产品品牌:永嘉微电/VINKA 产品型号:VK2C21C 封装形式:SOP20 概述 VK2C21C是
VK2C21B SOP24高抗干扰LCD液晶段码驱动芯片
产品品牌:永嘉微电/VINKA 产品型号:VK2C21B 封装形式:SOP24 概述 VK2C2B是一
低成本、高性能、带EEPROM了解一下
无锡矽杰微电子的XCE855E 是一颗带 EEPROM 的 8 位单片机,专为多 IO 产品的应用而设
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表