求助单片机按键控制红外发送0~F,按键控制,接收并显示的解码和编码程序

51单片机红外解码显示 红外遥控器
实际制作效果图:使用说明:1.本系统可以在LCD1602上显示系统码和按键码。2.支持普遍的NEC红外协议。
电路相关文件(请在PC端查看下载)
电路城电路折扣劵获取途径:
电路城7~10折折扣劵(全场通用):对本电路进行评分获取;
电路城6折折扣劵(限购≤100元电路):申请成为卖家,上传电路,审核成功后获取。
版权声明:电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击反馈给电路城。
使用说明:直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
大家都在看:
PS:提供PCB代画 程序代调 论文代写等服务联系Q,丰厚经验电子工程师保障你的设计完美通过上述作品仅提供资料,若有实物需要请移步淘宝 淘短链:c.tb.cn/c.dEN5e 复制使用淘宝APP即可打开电脑链接:https://shop.taobao.com/shop/view_shop.htm?spm=a313o.201708ban.category.d53.7c6a0115bBWA8q&mytmenu=mdianpu&user_number_id=
来自:时间:
简介:频率计作为一种基础测量仪器。它主要由信号输入、放大整形、分频、单片机控制模块、驱动显示电路等组成。本设计以STC80C51单片机作为控制核心,使用它内部的定时/计数器,实现对待测信号的频率的测量。设计过程中,频率计采用外部10分频,以便测量1Hz~1MHz的信号频率,并且实现量程自动切换。显示部分用74LS245驱动,使用四位共阳极数码管显示数据。本设计采用单片机技术,使得设计具有很高的性价比和可靠性,改善了传统频率计的不足,它具有测量精度高、测量省时、价格便宜、使用方便等优点。仿真电路图及结果:附件内容截图:
来自:时间:
本文介绍了一种基于AT89C52单片机控制流水灯的电路设计,整个造型为心型设计,共采用了32个LED进行设计,有多种流水样式设计,里面包含4个源程序(因为单片机有容量限制,一个程序放不下),可以学习到流水灯的不同控制方式。
来自:时间:
本文介绍了一种基于STC89C52单片机控制温湿度传感器SHT10实现的一种数字式温湿度检测,并使用在仓库温湿度检测上。基于SHT10传感器的温湿度检测仪,可以实时测量仓库内的温湿度,并能计算出露点,并将测量得到的信息反馈到串口和LCD显示屏上,供检查人员实时查看。观察温室度是否超过了系统设定值,如果超过了系统警告线,将会在串口和LCD上显示WARNING(警告)的字样,并且报警器长响,LED灯长亮。如果超过了系统注意线,将会在串口和LCD上显示NOTE(注意)的字样,并且报警器间歇响,LED灯间歇亮。
来自:时间:
在Proteus仿真环境下进行办公室门铃控制系统硬件设计,在本次硬件设计中,我主要才用了AT89C51作为主要控制芯片,LCD1602主要用来显示输入的按键数字,门铃使用方的按键主要用来对系统输入数字,门铃应答方我设置了LED灯、蜂鸣器和按键。LED灯与蜂鸣器主要用来提示有人按下了门铃按键,应答方的按键主要用来开门以及关闭应答方的LED灯与蜂鸣器。另外,我用了一个蓝色LED灯来模拟门打开的效果,即在仿真中,蓝色LED灯亮起代表门被打开,蓝色LED灯熄灭代表门被关闭。
在我的设计中,有两种方法可以打开门,第一种就是通过按下键盘上的数字键,输入门牌号,相应的门铃就会有声光提示,这样,门铃的应答方按下应答方的按键,就可以关闭声光提示,并打开房门。第二种是在系统中初设了一个公用密码,即如果是办公室的相关人员要进入,不需要通过呼叫他人,而是输入公用密码并按下确认键,就可以打开房门。
来自:时间:
猜你喜欢(实时推荐最适合你的电路)
一套完整的摄像机PCB方案,文档包括1.摄像机灯板,主板,sensor,原理图和PCB2.所有PCB的BOM3.该PCB都采用AD绘制海思Hi3518e摄像机PCB方案完整分享部分文件截图:
来自:时间:
系统由电源电路、晶振电路、复位电路、LCD驱动电路等组成,此系统用以读取GPS模块的数据并处理,最后显示在LCD12864上面,用户可以实时通过读取12864显示的内容了解自己的位置以及当前时间
来自:时间:
网上看到大多电子爱好者朋友用的40Pin的51单片机做心形流水灯,需要的led量多,焊接时间长,所以本人用20Pin的STC11F02E做一个迷你版的心形流水灯。所需led数量少,易焊接,布线。所需元器件:1.STC11F02E单片机一片2.LED灯14个,颜色随意。3.1K电阻14个(上拉电阻,单片机IO口输出很小)4.电位器(不要也可以,加了调节电压能调节灯亮度,但是电压过小,单片机无法正常工作)5.USB母口(也可以用DC插座,不过不好焊)6.自锁开关7.USB转TTL (PL2302或者CH340)8.洞洞板7×9cm9.面包板(用来测试灯泡好坏,加了上拉之后电阻调整)10.杜邦线(图中没有)11.漆包线(后面飞线,也可以用杜邦线飞,就是太粗)STC11F02E引脚图:LED和引脚对应关系:使用P1.0-1.7和P3.0-3.5一共14个引脚。P1.0对应上面中间的LED,其他一次逆时针焊接。也就是下面中间为P1.7。下面中间右边一个为P3.0,继续逆时针。焊接最外圈为GND,VCC在里面。
来自:时间:
新唐 nulink 仿真器 支持新唐全系列单片机说明:火星科技自主设计的新唐 nulink 仿真器, 支持新唐全系列单片机, 支持脱机下载, 离线编程, 支持 51 内核, Cotex-M0 内核和 Cotex-M4 内核所有芯片。 此电路在市面上的电路进行了全新升级, 修改 USB 口为最常见的 Micro USB:工作电压: 5V±0.5V 模块尺寸: 长 52mm*宽 15mm资料下载地址:http://www.nuvoton.com/hq/support/tool-and-softwar...Nu-Link 不仅是仿真器, 还是在线、 离线下载器, 是一个从研发到量产都适用的 3 合 1的工具◆支持 KEIL,IAR,CoIDE,等 IDE 工具◆ Flash 断点, 不论代码在 RAM 或 ROM 里, 都可以无限制使用断点, 不受 Cortex 芯片断点数量的限制◆ 支持基于 ARM Cortex-M0 设备的串行调试(SWD)◆ 支持程序运行期间的内存读写、 终端仿真和串行调试输出◆ Nu-Link 亦支持片上程序升级及更新(In-Circuit Program 功能), 对于开发量产达到一体化, 简单化的操作◆ USB HID 设备免驱动, 即插即用◆固件程序持续自动更新◆支持 WINXP, XIN7◆ 支持新唐 M0 全系列 MCU◆ 接口定义为官方标准版:1. VCC 2.DATA 3.CLK 4.RST 5.GND支持方案定制,更多新品和优惠请关注小店:https://shop.taobao.com/
来自:时间:
液晶显示的PID炉温控制系统内容概述:本系统为以AT89S51单片机为核心的炉温控制系统。该系统在硬件设计上主要是通过温度传感器DS18B20对温度进行采集,直接输出数字式的温度值。AT89S51将采集到的数字温度送到LCD1602,以数字形式显示测量温度,并采用PID控制来实现对温度的调节。DS18B20温度显示仿真如下,DS18B20的值可以任意调整,模拟温度的采集,LCD的显示值随DS18B20的温度值变化而变化。当温度超过界限,LED亮,同时SOUNDER响,模拟警报系统。当按下k1,显示温度的最高位光标开始闪烁,进入设定温度调整,按下k2,光标右移,按下k3数值加1,按下k4数值减1。PID控制仿真如图,电加热炉OVEN输出的模拟量经ADC0804转化成数字量,再送到LCD显示。OVEN的温度与设定温度在单片机内进行PID运算,PID输出量控制晶闸管的导通,从而控制OVEN的加热。液晶显示的PID炉温控制系统功能要求:1.采用液晶显示器显示温度测量值。2.检测的温度范围为0~128℃。3.温度超过警戒值时能报警提示。4.能通过键盘输入设定温度并显示。5.用PID控制温度,控温精度≦±2℃。
来自:时间:
2014 年 10 月 14日
fxzlxgy123购买了:
theball购买了:
x123xue购买了:
fxzlxgy123购买了:
白鸽侦探购买了:
小司机购买了:
fxzlxgy123购买了:
你尚未购买电路图,点击
进行购买!
您想购买此电路吗?,上传电路,审核成功后获取电路城6折折扣劵。
6折折扣劵只能购买小于100元(含100元)的电路。=== 求&&STC&&1T单片机红外解码程序 ===|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
比如STC12C4052& 之类的 1T 单片机的红外解码程序&&& 我在89C52上用着的红外程序调整延迟 调整好久了 都弄不来~~~& 谁有分享一下谢谢~~~
赞助商链接
这个我知道,不过我的是汇编的呵,C的我可不懂
赞助商链接
我有!编码你自己改下。
这个1T神马意思?
引用第3楼秀才于 20:59发表的&&:这个1T神马意思? 1T是指单片机的运行速度,即一个时钟周期的意思。
解码程序也有,这里有个教程!
宏晶官方的STC15系列只用一个定时器的红外接收程序:/*------------------------------------------------------------------*//* --- STC MCU International Limited -------------------------------*//* --- STC 1T Series MCU RC Demo -----------------------------------*//* --- Mobile: (86) -------------------------------------*//* --- Fax: 86-755- ----------------------------------------*//* --- Tel: 86-755- ----------------------------------------*//* --- Web:
-----------------------------------------*//* If you want to use the program or the program referenced in the&&*//* article, please specify in which data and procedures from STC&&&&*//*------------------------------------------------------------------*//*************&&&&功能说明&&&&**************红外接收程序。适用于市场上用量最大的HT及其兼容IC的编码。对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。本接收程序基于状态机的方式,占用CPU的时间非常少。HEX文件在本目录的/list里面。******************************************//*************&&&&用户系统配置&&&&**************/#define MAIN_Fosc&&&&&&&&L&&&&//定义主时钟, 模拟串口和红外接收会自动适应。5~36MHZ#define D_TIMER0&&&&&&&&125&&&&&&&&&&&&//选择定时器时间, us, 红外接收要求在60us~250us之间#define&&&&User_code&&&&&&&&0xFD02&&&&&&&&//定义红外接收用户码/*************&&&&以下宏定义用户请勿修改&&&&**************/#include&&&&&reg51.H&#define&&&&uchar&&&&unsigned char#define uint&&&&unsigned int#define freq_base&&&&&&&&&&&&(MAIN_Fosc / 1200)#define Timer0_Reload&&&&&&&&(65536 - (D_TIMER0 * freq_base / 10000))/*************&&&&本地常量声明&&&&**************//*************&&&&本地变量声明&&&&**************/sbit&&&&P_TXD1 = P3^1;&&&&&&&&//定义模拟串口发送脚,打印信息用sbit&&&&P_IR_RX = P0^1;&&&&&&&&//定义红外接收输入端口bit&&&&&&&&P_IR_RX_&&&&&&&&//Last samplebit&&&&&&&&B_IR_S&&&&&&&&&&&&//已收到同步标志uchar&&&&IR_SampleC&&&&&&&&//采样计数uchar&&&&IR_BitC&&&&&&&&&&&&//编码位数uchar&&&&IR_UserH;&&&&&&&&&&&&//用户码(地址)高字节uchar&&&&IR_UserL;&&&&&&&&&&&&//用户码(地址)低字节uchar&&&&IR_&&&&&&&&&&&&//数据原码uchar&&&&IR_DataS&&&&&&&&//数据反码bit&&&&&&&&B_IrUserE&&&&&&&&//User code error flagbit&&&&&&&&B_IR_P&&&&&&&&&&&&//Key press flag,include repeat key.uchar&&&&IR_&&&&&&&&&&&&//IR code&&&&红外键码/*************&&&&本地函数声明&&&&**************/void&&&&Tx1Send(uchar dat);uchar&&&&HEX2ASCII(uchar dat);void&&&&InitTimer(void);void&&&&PrintString(unsigned char code *puts);/*************&&外部函数和变量声明 *****************//********************* 主函数 *************************/void main(void){&&&&InitTimer();&&&&&&&&//初始化Timer&&&&&&&&PrintString(&****** STC系列MCU红外接收程序
******\r\n&);&&&&//上电后串口发送一条提示信息&&&&while(1)&&&&{&&&&&&&&if(B_IR_Press)&&&&&&&&//有IR键按下&&&&&&&&{&&&&&&&&&&&&PrintString(&红外码: 0x&);&&&&&&&&&&&&//提示红外键码&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_code && 4));&&&&//键码高半字节&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_code));&&&&&&&&//键码低半字节&&&&&&&&&&&&if(B_IrUserErr)&&&&&&&&&&&&&&&&&&&&&&&&//用户码错误,则发送用户码&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Tx1Send(' ');&&&&&&&&&&&&&&&&&&&&//发空格&&&&&&&&&&&&&&&&Tx1Send(' ');&&&&&&&&&&&&&&&&&&&&//发空格&&&&&&&&&&&&&&&&PrintString(&用户码: 0x&);&&&&&&&&//提示用户码&&&&&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_UserH && 4));&&&&//用户码高字节的高半字节&&&&&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_UserH));&&&&&&&&//用户码高字节的低半字节&&&&&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_UserL && 4));&&&&//用户码低字节的高半字节&&&&&&&&&&&&&&&&Tx1Send(HEX2ASCII(IR_UserL));&&&&&&&&//用户码低字节的低半字节&&&&&&&&&&&&}&&&&&&&&&&&&Tx1Send(0x0d);&&&&&&&&//发回车&&&&&&&&&&&&Tx1Send(0x0a);&&&&&&&&//发回车&&&&&&&&&&&&B_IR_Press = 0;&&&&&&&&//清除IR键按下标志&&&&&&&&}&&&&}}/********************* 十六进制转ASCII函数 *************************/uchar&&&&HEX2ASCII(uchar dat){&&&&dat &= 0x0f;&&&&if(dat &= 9)&&&&return (dat + '0');&&&&//数字0~9&&&&return (dat - 10 + 'A');&&&&&&&&&&&&//字母A~F}//*******************************************************************//*********************** IR Remote Module **************************//*********************** IR Remote Module **************************//this programme is used for Receive IR Remote (HT6121).//data format: Synchro,AddressH,AddressL,data,/data, (total 32 bit).//send a frame(85ms), pause 23ms, send synchro of another frame, pause 94ms//data rate: 108ms/Frame//Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms//Bit0:high=0.5626ms,low=0.5626ms//Bit1:high=1.6879ms,low=0.5626ms//frame space = 23 ms or 96 ms/******************** 红外采样时间宏定义, 用户不要随意修改&&&&*******************/#if ((D_TIMER0 &= 250) && (D_TIMER0 &= 60))&&&&#define&&&&D_IR_sample&&&&&&&&&&&&D_TIMER0&&&&&&&&//定义采样时间,在60us~250us之间#endif#define D_IR_SYNC_MAX&&&&&&&&(15000/D_IR_sample)&&&&//SYNC max time#define D_IR_SYNC_MIN&&&&&&&&(9700 /D_IR_sample)&&&&//SYNC min time#define D_IR_SYNC_DIVIDE&&&&(12375/D_IR_sample)&&&&//decide data 0 or 1#define D_IR_DATA_MAX&&&&&&&&(3000 /D_IR_sample)&&&&//data max time#define D_IR_DATA_MIN&&&&&&&&(600&&/D_IR_sample)&&&&//data min time#define D_IR_DATA_DIVIDE&&&&(1687 /D_IR_sample)&&&&//decide data 0 or 1#define D_IR_BIT_NUMBER&&&&&&&&32&&&&&&&&&&&&&&&&&&&&//bit number//*******************************************************************************************//**************************** IR RECEIVE MODULE ********************************************void IR_RX_HT6121(void){&&&&uchar&&&&SampleT&&&&IR_SampleCnt++;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//Sample + 1&&&&F0 = P_IR_RX_&&&&&&&&&&&&&&&&&&&&&&&&//Save Last sample status&&&&P_IR_RX_temp = P_IR_RX;&&&&&&&&&&&&&&&&&&&&//Read current status&&&&if(F0 && !P_IR_RX_temp)&&&&&&&&&&&&&&&&&&&&//Last sample is high,and current sample is low, so is fall edge&&&&{&&&&&&&&SampleTime = IR_SampleC&&&&&&&&&&&&//get the sample time&&&&&&&&IR_SampleCnt = 0;&&&&&&&&&&&&&&&&&&&&//Clear the sample counter&&&&&&&&&&&& if(SampleTime & D_IR_SYNC_MAX)&&&&&&&&B_IR_Sync = 0;&&&&//large the Maxim SYNC time, then error&&&&&&&&else if(SampleTime &= D_IR_SYNC_MIN)&&&&&&&&&&&&&&&&&&&&//SYNC&&&&&&&&{&&&&&&&&&&&&if(SampleTime &= D_IR_SYNC_DIVIDE)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&B_IR_Sync = 1;&&&&&&&&&&&&&&&&&&&&//has received SYNC&&&&&&&&&&&&&&&&IR_BitCnt = D_IR_BIT_NUMBER;&&&&//Load bit number&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&else if(B_IR_Sync)&&&&&&&&&&&&&&&&&&&&&&&&//has received SYNC&&&&&&&&{&&&&&&&&&&&&if(SampleTime & D_IR_DATA_MAX)&&&&&&&&B_IR_Sync=0;&&&&//data samlpe time to large&&&&&&&&&&&&else&&&&&&&&&&&&{&&&&&&&&&&&&&&&&IR_DataShit &&= 1;&&&&&&&&&&&&&&&&&&&&//data shift right 1 bit&&&&&&&&&&&&&&&&if(SampleTime &= D_IR_DATA_DIVIDE)&&&&IR_DataShit |= 0x80;&&&&//devide data 0 or 1&&&&&&&&&&&&&&&&if(--IR_BitCnt == 0)&&&&&&&&&&&&&&&&//bit number is over?&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&B_IR_Sync = 0;&&&&&&&&&&&&&&&&&&&&//Clear SYNC&&&&&&&&&&&&&&&&&&&&if(~IR_DataShit == IR_data)&&&&&&&&//判断数据正反码&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&if((IR_UserH == (User_code / 256)) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&IR_UserL == (User_code % 256))&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B_IrUserErr = 0;&&&&//User code is righe&&&&&&&&&&&&&&&&&&&&&&&&else&&&&B_IrUserErr = 1;&&&&//user code is wrong&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&IR_code&&&&&&= IR_&&&&&&&&&&&&&&&&&&&&&&&&B_IR_Press&& = 1;&&&&&&&&&&&&//数据有效&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&else if((IR_BitCnt & 7)== 0)&&&&&&&&//one byte receive&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&IR_UserL = IR_UserH;&&&&&&&&&&&&//Save the User code high byte&&&&&&&&&&&&&&&&&&&&IR_UserH = IR_&&&&&&&&&&&&&&&&//Save the User code low byte&&&&&&&&&&&&&&&&&&&&IR_data&&= IR_DataS&&&&&&&&&&&&//Save the IR data byte&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}}/**************** Timer初始化函数 ******************************/void InitTimer(void){&&&&TMOD = 0;&&&&&&&&//for STC15Fxxx系列&&&&Timer0 as 16bit reload timer.&&&&TH0 = Timer0_Reload / 256;&&&&TL0 = Timer0_Reload % 256;&&&&ET0 = 1;&&&&TR0 = 1;&&&&EA&&= 1;}/********************** Timer0中断函数************************/void timer0 (void) interrupt 1{&&&&IR_RX_HT6121();}/********************** 模拟串口相关函数************************/void&&&&BitTime(void)&&&&//位时间函数{&&&&&&&&i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;&&&&&&&&//根据主时钟来计算位时间&&&&while(--i);}//模拟串口发送void&&&&Tx1Send(uchar dat)&&&&&&&&//9600,N,8,1&&&&&&&&发送一个字节{&&&&uchar&&&&i;&&&&EA = 0;&&&&P_TXD1 = 0;&&&&BitTime();&&&&for(i=0; i&8; i++)&&&&{&&&&&&&&if(dat & 1)&&&&&&&&P_TXD1 = 1;&&&&&&&&else&&&&&&&&&&&&P_TXD1 = 0;&&&&&&&&dat &&= 1;&&&&&&&&BitTime();&&&&}&&&&P_TXD1 = 1;&&&&EA = 1;&&&&BitTime();&&&&BitTime();}void PrintString(unsigned char code *puts)&&&&&&&&//发送一串字符串{&&&&for (; *puts != 0;&&&&puts++)&&Tx1Send(*puts);&&&& //遇到停止符0结束}
我对楼上发的这段程序中,比较有兴趣的是以下两段。。摘下来研究一下/********************* 十六进制转ASCII函数 *************************/uchar&&&&HEX2ASCII(uchar dat){&&&&dat &= 0x0f;&&&&if(dat &= 9)&&&&return (dat + '0');&&&&//数字0~9&&&&return (dat - 10 + 'A');&&&&&&&&&&&&//字母A~F}/********************** 模拟串口相关函数************************/void&&&&BitTime(void)&&&&//位时间函数{&&&&&&&&i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;&&&&&&&&//根据主时钟来计算位时间&&&&while(--i);}//模拟串口发送void&&&&Tx1Send(uchar dat)&&&&&&&&//9600,N,8,1&&&&&&&&发送一个字节{&&&&uchar&&&&i;&&&&EA = 0;&&&&P_TXD1 = 0;&&&&BitTime();&&&&for(i=0; i&8; i++)&&&&{&&&&&&&&if(dat & 1)&&&&&&&&P_TXD1 = 1;&&&&&&&&else&&&&&&&&&&&&P_TXD1 = 0;&&&&&&&&dat &&= 1;&&&&&&&&BitTime();&&&&}&&&&P_TXD1 = 1;&&&&EA = 1;&&&&BitTime();&&&&BitTime();}void PrintString(unsigned char code *puts)&&&&&&&&//发送一串字符串{&&&&for (; *puts != 0;&&&&puts++)&&Tx1Send(*puts);&&&& //遇到停止符0结束}
也可以看下我以前的转贴子,在8楼有相关内容:
STC15系列是不是没有源生的串口,只能用模拟的?
;**遥控器信号接收到**;12M晶振,外中断1接收,1T单片机IR_INT:CLR&&&& EAPUSH ACCPUSH PSWPUSH DPHPUSH DPLLCALL&& DELAY1MSLCALL&& DELAY1MSLCALL&& DELAY1MSLCALL&& DELAY1MSJB P3.3,IR_OUT;;高电平退出JNB&& P3.3,$;等 IR 变为高电平LCALL DELAY2MS380USLCALL DELAY2MS380USJB&&&& P3.3,IR_OUT;是否低电平MOV&&R0,#7CH;起始内存为7CH,共4个内存JJJ:MOV&&R3,#8&&;8位BBB:JNB&&P3.3,$;等 IR 变为高电平;高电平后开始计数,计数值1 高电平1MOV&&&&R2,#0&&;1MS计数CCC:LCALL&& DELAY1MSJNB&&&& P3.3,DDD ;低电平跳出计数INC&&&& R2;;高电平继续计数AJMP CCCDDD:CLR ACLR CSUBB A,R2 ;判断位,是否计过数,没计数为0,计过数为1MOV&&&& A,@R0RRC&&&& AMOV&&&& @R0,A&&;处理完一位DJNZ&& R3,BBB;8位数据INC&&&& R0;换下一个内存CJNE&&&&R0,#80H,JJJ&&;写完个4内存RPP:MOV&&&& A,7CH&&&&&& ;对接收码进行判断,是否接收完成、正确CJNE&&&&A,7DH,IR_OUTCJNE&&&&A,#0EH,IR_OUT;用户码MOV&&&& A,7FH&&&&&& ;对接收码进行判断,是否接收完成、正确CPL&&&& ACJNE&&&&A,7EH,IR_OUTLCALL IR_GOTO ;调出按键的处理程序IR_OUT:POP&& DPLPOP&& DPHPOP&&&& PSWPOP&&&& ACCSETB&&&&EARETI;--------延时------DELAY2MS380US:&& ;MOV R7,#03HDL1TT:MOV R6,#0A4HDL0TT:MOV R5,#0DHDJNZ R5,$DJNZ R6,DL0TTDJNZ R7,DL1TTRETDELAY1MS:&& ;MOV R6,#0DEHDL0:MOV R5,#0CHDJNZ R5,$DJNZ R6,DL0RETIR_GOTO :;按键处理程序
#define uint&&&& unsigned int#define uchar&&&& unsigned charsbit IRIN = P3^2; uchar red_flag=0,key=0;uchar IRCOM[7]; void red_init() {IT0=1;EX0=1;EA=1;&& IRIN=1;&&&&&&&&&&} void delay2(uchar x)&&&&//x*0.14MS{&&while(x--) {&&for (i = 0; i&156; i++) {} }}void IR_IN() interrupt 0 {&&unsigned char j,k,N=0;&&&& EX0 = 0;&& &&&& delay2(15);&&&&&&&& if (IRIN==1) &&&& { EX0 =1;&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&& //确认IR信号出现&&while (!IRIN)&&&&&&&&&&&&//等IR变为高电平,跳过9ms的前导低电平信号。&&&&{delay2(1);} for (j=0;j&4;j++)&&&&&&&& //收集四组数据 { &&for (k=0;k&8;k++)&&&&&&&&//每组数据有8位&&{&& while (IRIN)&&&&&&&&&&&&//等 IR 变为低电平,跳过4.5ms的前导高电平信号。&&&& {delay2(1);}&&&&while (!IRIN)&&&&&&&&&&//等 IR 变为高电平&&&& {delay2(1);}&&&& while (IRIN)&&&&&&&&&& //计算IR高电平时长&&&&&&{&&&&delay2(1);&&&&N++;&&&&&&&&&& &&&&if (N&=30)&&&& { EX0=1;&&&&}&&&&&&&&&&&&&&&&&&//0.14ms计数过长自动离开。&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&//高电平计数完毕&&&&&&&&&&&&&&&&&&&& IRCOM[j]=IRCOM[j] && 1;&&&&&&&&&&&&&&&&&&//数据最高位补“0”&&&& if (N&=8) {IRCOM[j] = IRCOM[j] | 0x80;}&&//数据最高位补“1”&&&& N=0;&&}//end for k }//end for j&& && if (IRCOM[2]!=~IRCOM[3])&& { EX0=1;&&&& }key=IRCOM[2];red_flag=1;&&&& EX0 = 1; }
上面的大侠程序学习了!下来试试!
回复:11lou貌似不行啊 ~~~&&程序会死在中断里...........
先谢谢楼主了!
为什么都不判断遥控器的重复码呢&&&&&&&&&&&&。。。。求怎么判断遥控器的 重复码&&比如 当按键1一直按下时,使接收单片机 P1.0一直输出低电平。当按键松开输出高电平
为什么都不判断遥控器的重复码呢&&&&&&&&&&&&。。。。求怎么判断遥控器的 重复码&&比如 当按键1一直按下时,使接收单片机 P1.0一直输出低电平。当按键松开输出高电平
用89C52解码出来 长按 键值是 FF FF FF FF&& 然后用标志位的方式执行 FF FF FF FF 之前那个键值 应该可以吧&&我没试过 理论上这样子应该行得通哈
看看,看看
干吗要长按啊,长按就是周期性发出重复码,比如一般NEC码是9MS低电平2。25高电平的重复码,你按下为什么要接收单片机 P1.0一直输出低电平?这个已经不是解码的问题,而是判断处理的问题了,如果一直接收到9MS低电平2.25高电平,那么单片机 P1.0一直输出低电平,这样行吗
T就是时钟周期,1T就是一个时钟周期,stc的1T单片机就是说指令周期=时钟周期,一个始终周期执行一条指令。
正好需要STC1T单片机的红外解码程序。。。。
其实STC的1T单片机并不算真正的1T,因为只有少一部分指令是用一个周期执行;而另一部分,有2周期、3周期、4周期、8周期等等。故不能算得上是真正的1T
我也想看看啊,可惜M币不足则么办,还要等15分钟才能回帖,真郁闷了
先谢谢楼主了!
给你一个汇编我编来读NEC标准的键值解码!单片机是STC12C5A60S2&& 晶振 16M 可以解码任何NEC编码标准的任何值;基于NEC标准红外遥控解码,带有地址码键值码显示功能&&&&;晶振为16M&&&&&&&&P4SW EQU 0BBH&&&& CLK_DIV EQU 097H&&&&ADC_RESL EQU 0BEH&& &&&&ADC_RES&&EQU 0BDH&&&&&&&&&&&&AUXR EQU 08EH&&&&&&&&&&P1ASF EQU 09DH&&&&&&&&&& AUXR1 EQU 0A2H&&&&&&&& IPH EQU 0B7H&& &&&&&&&& IPL EQU 0B8H&& && WDT_CONTR EQU 0C1H&&&&&& ADC_CONTR EQU 0BCH&&&&&&&&&&&&&&P4&&EQU 0C0H&&&&&&&&&&&& P5&&EQU 0C8H&&&&&&&&&&&&P1M1 EQU 091H&&&&&&&&&&&&P1M0 EQU 092H&& &&&&&&&&P0M1 EQU 093H&&&&&&&&&&&&P0M0 EQU 094H&&&&&&&&&&&&P2M1 EQU 095H&&&&&&&&&&&&P2M0 EQU 096H&&&&&&&&&&&&P3M1 EQU 0B1H&&&&&&&&&&&&P3M0 EQU 0B2H&&&&&&&&&&&&P4M1 EQU 0B3H&&&&&&&&&&&&P4M0 EQU 0B4H&&&&&&&&&&&&P5M1 EQU 0C9H&&&&&&&&&&&&P5M0 EQU 0CAH&&&&;----------------------------------------------------&&;--------------------------------------------&&&&&&&&ORG 00H&&&&&&&&LJMP STARTSTART:&&MOV SP,#80H&&&&&&&&&&&&&&&&MOV P0,#0FFH&&&&&&&&MOV P2,#0FFH&&&&&&&&MOV P3,#0FFH&&&&&&&&&&&&MOV&&&&P1M1,#00H&&&& &&&&&&&&MOV P1M0,#00H&&&&&&&&&&&&&&MOV P0M1,#00H&&&& &&&&&&&&MOV P0M0,#00H&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&MOV P2M1,#00H&&&& &&&&&&&&MOV P2M0,#00H&&&& &&&&&&&&MOV P3M1,#00H&&&& &&&&&&&&MOV P3M0,#00H&&&& &&&&&&&&MOV P4M1,#00H&&&& &&&&&&&&MOV P4M0,#00H&&&& &&&&&&&&MOV P5M1,#00H&&&& &&&&&&&&MOV P5M0,#00H ;------------------------------------------;端口设置;------------------------------------------&&&&&&&&MOV P4SW,#B &&&&&&&&MOV CLK_DIV,#B &&&&&&&&MOV AUXR,#B &&&&&&&&MOV IE,#B&&&&&&&&&&MOV IPH,#B&&&&&&&&&&&&MOV IPL,#B&&&&&&&&&&&&MOV TCON,#B&&&&&&&&&&&&MOV P1ASF,#B&&&&&&&&MOV&&&&AUXR1,#B&&&&&&&&MOV P3,#0FFH;//////////////////////////////////////////////////////;红外遥控内存定义;//////////////////////////////////////////////////////&&&&&&&& HWDLED EQU P0&&&&&&&&&&&&;数据输出LED阵列&&&&&&&& HWDAIN BIT P3.7&&&&&&&&;遥控信号输入&&&&&&&& LEDOUT BIT P2.0&&&&&&&&;LED阵列输出控制&&&&&&&& HWDATS EQU 30H&&&&&&&&&&&&;红外解码内存&&&&&&&&HWDABT1 EQU 31H&&&&&&&&&&&&;红外解码地址数据1&&&&&&&&HWDABT2 EQU 32H&&&&&&&&&&&&;红外解码地址数据2&&&&&&&&HWDABT3 EQU 33H&&&&&&&&&&&&;红外解码键值数据&&&&&&&&HWDABT4 EQU 34H&&&&&&&&&&&&;红外解码键值反码数据&&&&&&&&HWCPDA1 EQU 3AH&&&&&&&&&&&&;红外解码数据移位值,8位8次;//////////////////////////////////////;初始化寄存器&&&&&&&&MOV HWDLED,#0FFH&&&&&&&&&&&&&&&&MOV HWDATS,#00H&&&&&&&&MOV HWDABT1,#00H&&&&&&&&MOV HWDABT2,#00H&&&&&&&&MOV HWDABT3,#00H&&&&&&&&MOV HWDABT4,#00H&&&&&&&&MOV HWCPDA1,#8;//////////////////////////////////////////////////////;//////////////////////////////////////////////////////LOP1:&&&&&&NOP&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&;9MS引导 解码&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JB HWDAIN,LOP1&&&&&&;检测GSDD1:&&&&NOP&&&&&&&&JNB HWDAIN,GSDD1&&&&&&;等待信号变高,使之修正对齐信号温漂,对齐后,输出4.5MS,解码&&&&&&&&NOP&&&&&&&&AJMP JM45;/////////////////////////////////////////////////////////////////////////////////////////////////LOP2:&& NOP&&&&&&&&AJMP LOP1&&&&&&&&&& ;借用;//////////////////////////////////////////////////////////////////////////////////////////////////JM45:&&&&NOP&&&&&&&& ;输出4.5MS,解码&&&&&&&&NOP&&&&&&&&JNB HWDAIN,LOP2&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JNB HWDAIN,LOP2&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&JNB HWDAIN,LOP2&&&&&&&&NOP&&&&&&&&LCALL DEL095&&&&&&&&NOP&&&&&&&&NOPGSDD2:&&&&NOP&&&&&&&&JB HWDAIN,GSDD2&&&&&&;等待信号变低,使之修正对齐信号温漂,对齐后,开始地址码较验&&&&&&&&NOP&&&&&&&&NOP&&&&&&&&NOP&&&&&&&&LCALL JMDZ1;////////////////////////////////////////////////////////////////&&&&&&&&MOV HWDABT1,HWDATS&&&&&&&&LCALL JMDZ1&&&&&&&&MOV HWDABT2,HWDATS&&&&&&&&LCALL JMDZ1&&&&&&&&MOV HWDABT3,HWDATS&&&&&&&&LCALL JMDZ1&&&&&&&&MOV HWDABT4,HWDATS&&&&&&&&MOV HWDLED,HWDABT1&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&JB LEDOUT,$&&&&&&&& MOV HWDLED,HWDABT2&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&JB LEDOUT,$&&&&&&&& MOV HWDLED,HWDABT3&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&JB LEDOUT,$&&&&&&&&MOV HWDLED,HWDABT4&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&LCALL DELS&&&&&&&&JB LEDOUT,$&&&&&&&&MOV P0,#0FFH&&&&&&&&AJMP LOP1;/////////////////////////////////////////////////////////////////////////////////////////;红外字节解码;/////////////////////////////////////////////////////////////////////////////////////////;//////////////////////////////////////////////////////////////////////DEL06:MOV R4,#10&&&&&&&& ;0.6MS&&&& 16MD5: MOV R5,#150D6: MOV R6,#150D7: DJNZ R5,D7D8: DJNZ R6,D8&&&&DJNZ R4,D5&&&&&&RET;//////////////////////////////////////////////////////////////////////////////DEL095:MOV R1,#10&&&&&&&& ;0.95MS&&&&&& 16MD1: MOV R2,#250D2: MOV R3,#100D3: DJNZ R2,D3D4: DJNZ R3,D4&&&&DJNZ R1,D1&&&&&&RET;/////////////////////////////////////////////////////////////////////////////////////////JMDZ1:&&NOP&&&&&&&&MOV HWCPDA1,#8&&&&&&;载入移位值&&&&&&&&MOV HWDATS,#00H&&&&&&&&MOV A,HWDATS&&&&&&&&NOPJMDSU:&&&&NOP&&&&&&&&NOP&&&&&&&&LCALL DEL06&&&&&&&& ;延时大于0.56MS,&&&&&&&&NOP&&&&&&&&MOV R4,#10&&&&&&&& ;0.6MS&&&& 16M 不断检测数据线,诺在0.6MS延时中有低电平,表明数据为0,诺大于0.6表明为1D1A:&&&&MOV R5,#100&&&&&&&&MOV R6,#100SSBC1:&&DJNZ R5,SSBD1SSBC2:&&DJNZ R6,SSBD2&&&&&&&&DJNZ R4,D1A&&&&&&&&AJMP HWBT1;//////////////////////////////////////////////////SSBD1:&&JB HWDAIN,SSBC1&&&&&&&&NOPSSBD2:&&JB HWDAIN,SSBC2&&&&&&&&NOP&&&&&&&&AJMP HWBT0;//////////////////////////////////////////////////////HWBT1:&&&&NOP&&&&&&&&SETB C&&&&&&&& ;移位移入1&&&&&&&&NOP&&&&&&&&MOV R4,#500&&&&&&&& ;等待变低,诺超5MS,表明解码出错,返回防止死循环D1B:&&&&MOV R5,#500&&&&&&&&MOV R6,#500SSBC3:&&DJNZ R5,SSBD3SSBC4:&&DJNZ R6,SSBD4&&&&&&&&DJNZ R4,D1B&&&&&&&&AJMP HWJMEND&&&& ; 出错,退出解码SSBD3:&&&&JB HWDAIN,SSBC3&&;等待数据同步,纠正因温漂引起时序不稳定&&&&&&&&NOPSSBD4:&&&&JB HWDAIN,SSBC4&&;等待数据同步,纠正因温漂引起时序不稳定&&&&&&&&NOP&&&&&&&&&&&&AJMP GH&&&&;//////////////////////////////////////////////////////HWBT0:&&NOP&&&&&&&&CLR C&&&&&&&&&&;移位移入0&&&&&&&&CLR P3.3&&&&&&&&NOP&&&&&&&&AJMP GH;///////////////////////////////////////////GH:&&&&&&&&NOP&&&&&&&&RRC A&&&&&&&&NOP&&&&&&&&DJNZ HWCPDA1,JMDSU&&&&&& ;到达一个字节,取回结果&&&&&&&&NOP&&&&&&&&MOV HWDATS,A&&&&&&&&&& ;转换结果取出&&&&&&&&NOPHWJMEND:NOP&&&&&&&&NOP&&&&&&&&RET;//////////////////////////////////////////////////////////////////////////////////////;//////////////////////////////////////////////////////////////////////////////////////;////////////////////////////////////////DELS:MOV R1,#500&&&& ;0.95MS&&&&&& 16MD1S: MOV R2,#500D2S: MOV R3,#500D3S: DJNZ R2,D3SD4S: DJNZ R3,D4S&&&&DJNZ R1,D1S&&&&&&RET
:宏晶官方的STC15系列只用一个定时器的红外接收程序:http://www.stcmcu.com/datasheet/stc/STC-USER-CODE/STC15系列只用一个定时器的红外接收程序.rar....... ( 17:26) 谢谢转载,抽空琢磨下。
stc有原声的串口。。。
:宏晶官方的STC15系列只用一个定时器的红外接收程序:http://www.stcmcu.com/datasheet/stc/STC-USER-CODE/STC15系列只用一个定时器的红外接收程序.rar....... ( 17:26) 最近也在研究这个STC的范例程序,发现关键的一段:/********************** 模拟串口相关函数************************/ void&&&&BitTime(void)&&&&//位时间函数{&&&&&&&&i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;&&&&&&&&//根据主时钟来计算位时间&&&&while(--i);}这里的140000 只适用于STC-Y3内核的单片机,STC-Y5内核要改成130000.也就是:void&&&&BitTime(void)&&&&//位时间函数{&&&&&&&&i = ((MAIN_Fosc / 100) * 104) / 130000 - 1;&&&&&&&&//STC-Y5根据主时钟来计算位时间&&&&while(--i);}其实我用STC15W系的单片机,有原生COM口,不知谁能改一下用定时器2的COM。
查看完整版本: [--
Powered by
Time 0.091924 second(s),query:5 Gzip enabled

我要回帖

更多关于 单片机独立按键程序 的文章

 

随机推荐