请
登录
后使用快捷导航
没有帐号?
注册
首页
论坛
设计作品
全志V85x硬件设计大赛作品精选第一期
全志V85x硬件设计大赛作品精选第二期
瑞萨RA4M2物联网网关设计挑战赛作品集
国民技术N32开源移植挑战赛作品精选
2022福建省大学生人工智能创意赛作品合集
OpenHarmony开发者成长计划学生挑战赛优秀作品
精选帖子
【作品合集】龙芯2K0300蜂鸟开发板试用精选
【资源下载】英飞凌PSoC 6 RTT物联网开发板
【正点原子STM32精英V2开发板】HC-SR501红外人体感应
【沁恒CH32V208开发板试用】跳动的心脏-Systick
【鲁班猫创意氛围赛】现代化无线哨兵
【飞凌RK3588开发板试用】基于pyqt5的人脸识别
书籍评测
电子工程师必备丛书系列——电路板技能速成宝典
Proteus实战攻略:从简单电路到单片机电路的仿真
电子工程师必备丛书系列——九大系统电路识图宝典
OpenHarmony嵌入式系统原理与应用——基于RK2206芯片
深入理解微电子电路设计——数字电子技术及应用(原书第5版)
资深工程师十余年实战经验,PADS PCB设计指南
社区工程师专题
第一期:坚持兴趣成就嵌入式工程师
第二期:电子工程师需要在参赛中历练成长
第三期:创意源于生活,工具始于懒惰
第四期:工程师漫谈开发板评测的乐趣
第五期:硬件工程师的心路历程
第六期:宁精勿杂,在嵌入式领域做到优秀
版块
技术社区
FPGA开发者技术社区
RISC-V MCU技术社区
HarmonyOS技术社区
瑞芯微Rockchip开发者社区
OpenHarmony开源社区
嵌入式技术论坛
单片机及嵌入式
单片机/MCU论坛
ARM技术论坛
STM32/STM8技术论坛
RISC-V技术社区
FPGA|CPLD|ASIC论坛
DSP论坛
电源与无线技术
电源技术论坛
无线充电技术
WIFI技术
蓝牙技术
天线|RF射频|微波|雷达技术
EDA设计论坛
PCB设计论坛
DFM|可制造性设计论坛
Protel|AD|DXP论坛
PADS技术论坛
Allegro论坛
KiCad EDA 中文论坛
proteus论坛|仿真论坛
电路设计与测试
电路设计论坛
电子元器件论坛
LabVIEW论坛
Matlab论坛
传感技术
测试测量技术
DIY及创意
综合应用与活动
电机控制
发烧友官方/活动
模拟技术论坛
机器人论坛
USB论坛
音视频技术
综合技术交流
小组
厂商
龙芯技术社区
先楫半导体HPMicro
其利天下技术小组
瑞萨单片机论坛
芯海科技论坛
飞凌嵌入式论坛
国民技术论坛
飞腾派开发者社区
创龙科技论坛
米尔电子
技术
Linux论坛
单片机学习小组
嵌入式学习小组
电子行业动态
工程资源中心
电磁兼容设计与整改
物联网技术
汽车电子技术论坛
氮化镓技术社区
HiHope开发者社区
高校
东莞理工学院电子协会
西安电子科技大学西电实验室
深圳大学电子协会
桂林电子科技大学机电工程协会
湘潭大学电子科技协会
名人
张飞硬件学习小组
韦东山Linux嵌入式课程社区
黄工无刷电机学习
MILL小眼睛FPGA小组
龙哥 Labview 学习群
淘贴
开源硬件项目分享
开发板免费试用
沁恒微CH32V307试用合集
芯昇RISC-V开发板试用合集
乐鑫ESP32-C3试用合集
活动
设计大赛
瑞萨RA4M2物联网网关设计挑战赛
华秋电子x全志在线开源硬件设计大赛
RT-Thread 创新设计大赛
星核计划-高云FPGA开发者计划
OpenHarmony成长计划学生挑战赛
RT-Thread全球巡回线下培训
国民技术N32开源移植挑战赛
开发板试用
【创客营】新品Vision Board开发板免费评测
龙芯2K0300蜂鸟开发板免费试用
米尔-STM32MP135开发板-入门级MPU设计平台
风火轮YY3568开发板免费体验
【新品试用】英飞凌PSoC 6 RTT开发板试用
正点原子STM32战舰V4开发板
【有奖评测】为昕原理图设计EDA软件免费试用
社区之星
杨永胜:兴趣加努力,嵌入式工程师最好的前进之路
谢小龙:五年嵌入式开发,一个“博大”+“精深”的老鸟
罗大信:从工程师到创始人,我的20年嵌入式经验
刘建华:如果不想虚度一生,那就学习一辈子
贺婷婷:不退则进,遇到问题面对它,你会登上新台阶
罗除博士:共同携手,助力鸿蒙生态冲破牢笼
官方活动
【有奖征文】赢千元现金!发文章、上传资料送壕礼
每日打卡活动,赢取OH定制礼品
RISC-V MCU 技术社区打卡活动
【有奖打卡活动】2023年打卡计划
【书单评测】27本电子工程书籍
【书籍评测】PADS PCB设计指南
【精选集合】野火鲁班猫创意氛围赛作品
技术峰会/沙龙
2024 KiCon Asia KiCad 用户大会
2023 电子工程师大会暨第三届社区年度颁奖
开放原子开源基金会OH技术峰会
电子设计与制造技术研讨会
PCB设计与制造技术研讨会
2022 OH主题线下技术沙龙
2022开放原子全球开源峰会
专栏
技术原创
从编程到应用——从零开始学ARM
基于STM32设计的数码相册
基于DWC2的USB驱动开发-IAD描述符详解
基于CW32L083的线控器方案设计
RISC-V内核RC遥控车拆解:空心杯电机+2.4G跳频控制
最新资讯
SK海力士2023年HBM3营收增长5倍
夺得多项第一!问界M7冬测成绩大翻身
ASML 2023年末爆单,中国贡献营收翻倍
谁能打造最强车型?从OTA看车企的智能化之争有多激烈
首个石墨烯功能半导体面世,硅基的陌路?
企业
推荐企业号
Aigtek安泰电子
斯丹麦德电子
张飞实战电子
芯佰微电子
其利天下技术
扬兴科技
飞凌嵌入式
米尔电子
RA生态工作室
生态平台
OpenHarmony生态平台
RISC-V生态平台
瑞芯微Rockchip生态平台
精选内容
大咖齐聚,飞凌嵌入式技术创新日活动
米尔NXP i.MX 93开发板免费评测试用
Docker容器安装及运行测试方案详解
用时钟频率精度测量电路进行时间校验
基于Realtek的智能语音服务解决方案
问答
年度榜单
2022年度TOP榜单——模拟技术论坛问答
2021年度TOP榜单——电路设计论坛问答
2021年度TOP榜单——电源技术论坛问答
2021年度TOP榜单——电机控制技术论坛问答
高手问答
电子老顽童带你看懂电路设计
资深产品硬件研发工程师,与你讨论电路设计!
layout leader工程师任工谈PCB设计
与搞电源小哥一起揭秘电源设计那些难点
下载
电子书
电源技术知识总结
常用电源设计技巧图解
开关电源噪声-EMC(上)
开关电源噪声-EMC(下)
凡亿电路-PCB封装设计指导白皮书
精华资料
龙芯生态白皮书
中国物联网操作系统市场研究白皮书
AIGC(GPT-4)赋能通信行业应用白皮书
OPPO 《6G:极简多能 构建移动的世界》白皮书
智慧充电桩物联网技术白皮书
常用软件
Altium Designer21.9.2软件安装包下载
Cadence SPB OrCAD Allegro 17.4安装包及补丁下载
MATLAB 2020软件安装包下载
PADS 软件下载
LabVIEW 软件下载
学院
课程
直播
开发板购买
更多
电子发烧友
电子新闻
电子电路
技术文库
行业应用
电子标签
资料下载
电子元器件
技术研讨会
在线研讨会
特色服务
企业号
硬声APP
发烧友APP
产品库
积分商城
VIP会员
签到
经验
淘贴
华秋智造
PCB计价
SMT计价
元器件采购
BOM计价
Layout计价
钢网计价
PCB下单助手
工程师工具
PCB在线检查
华秋CAM
datasheet查询
替代料查询
免费样品申请
在线计算工具
工程师专区
品牌厂商查询
华秋DFM
帖子
搜索历史
清空
搜索热词
本版
帖子
用户
发 帖
提问题
发文章
发资料
发讨论
发视频
草稿箱
登录/注册
完善资料让更多小伙伴认识你,还能领取
20
积分哦,
立即完善>
3天内不再提示
每日签到
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》
电子发烧友论坛
/
嵌入式论坛
/
嵌入式论坛
电路图及DIY
电源技术论坛
综合技术与应用
无线通信论坛
EDA设计论坛
测试测量论坛
招聘/交友/外包/交易/杂谈
官方社区
单片机/MCU论坛
ARM技术论坛
STM32/STM8技术论坛
嵌入式技术论坛
RISC-V技术论坛
瑞芯微Rockchip开发者社区
FPGA|CPLD|ASIC论坛
DSP论坛
/
红外接收头遥控解码实验
[文章]
红外接收头遥控解码实验
张斌
2012-9-14 08:57:51
3533
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
0
0
//本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器 实验板采用11.0592MHZ晶振
#include
//包含
单片机
寄存器的头文件
#include
//包含_nop_()函数定义的头文件
***it IR=P3^2; //将IR位定义为P3.2引脚
***it RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
***it RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
***it E=P2^2; //使能信号位,将E位定义为P2.2引脚
***it BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
***it BEEP = P3^6; //蜂鸣器控制端口P36
unsigned char flag;
unsigned char code string[ ]= {"1602IR-CODE TEST"};
unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码
unsigned int Low
ti
me,HighTime; //储存高、低电平的宽度
/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i
delay1ms();
}
/*********************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{
unsigned char i,j;
unsigned char temp; //储存解码出的数据
for(i=0;i<4;i++) //连续读取4个用户码和键数据码
{
for(j=0;j<8;j++) //每个码有8位数字
{
temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待
; //低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平宽度
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
}
a[i]=temp; //将解码出的字节值储存在a[i]
}
if(a[2]==~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
return 1; //解码正确,返回1
}
/*------------------二进制码转换为压缩型BCD码,并显示---------------*/
void two_2_bcd(unsigned char date)
{
unsigned char temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
WriteData(0x48); //显示字符'H'
}
/************************************************************
函数功能:1602LCD显示
*************************************************************/
void Disp(void)
{
WriteAddress(0x40); // 设置显示位置为第一行的第1个字
two_2_bcd(a[0]);
WriteData(0x20);
two_2_bcd(a[1]);
WriteData(0x20);
two_2_bcd(a[2]);
WriteData(0x20);
two_2_bcd(a[3]);
}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
i = 0;
while(string[i] != '