历史上的今天
今天是:2025年03月23日(星期日)
2021年03月23日 | 51单片机综合学习系统演示程序 - 红外遥控器键
2021-03-23 来源:eefocus
简介:51单片机综合学习系统演示程序 - 红外遥控器键
/*********************************************************************/
#include #include sbitIRIN = P3 ^ 2; //红外接收器数据线 sbit BEEP = P3 ^ 7; //蜂鸣器驱动线 sbit RELAY = P1 ^ 3; //继电器驱动线 unsigned char IRCOM[] = { 0x00, 0x00, 0x00, 0x00, 0x10, 0x10 }; unsigned char code table[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,//0,1,2,3,4,5,6,7 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf //8,9,A,B,C,D,E,F,- }; char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节 /********************************************************** ms延时子函数 **********************************************************/ void delayms(unsigned int ms) { unsigned char k; while (ms--) { for (k = 0; k < 114; k++) ; } } /********************************************************** us延时子函数 **********************************************************/ void delay(unsigned char x) //x*0.14MS { unsigned char i; while (x--) { for (i = 0; i < 14; i++) ; } } /********************************************************** 蜂鸣器驱动子函数 **********************************************************/ void beep() { unsigned char i; for (i = 0; i < 100; i++) { BEEP = !BEEP; //BEEP取反 delay(6); } BEEP = 1; //关闭蜂鸣器 } /********************************************************** 显示函数 **********************************************************/ void play() { P0 = (table[IRCOM[4]]); //个位 P2 = 0xfe; delayms(1); P0 = (table[IRCOM[5]]); //十位 P2 = 0xfd; delayms(1); P2 = 0xff; //关闭显示 delayms(1); } /********************************************************** 主函数 **********************************************************/ void main(void) { P0 = 0xff; //I/O口初始化 P2 = 0xff; IRIN = 1; BEEP = 1; RELAY = 1; IE = 0x81; //允许总中断中断,使能 INT0 外部中断 TCON = 0x01; //触发方式为脉冲负边沿触发 play(); while (1) { if (IRCOM[2] == 0x1d) //UP键 RELAY = 0; //继电器吸合 if (IRCOM[2] == 0x12) //DOWN键 RELAY = 1; //继电器关闭 play(); //显示 } } /********************************************************** INT0 中断服务子函数 **********************************************************/ void IR_IN()interrupt 0 { unsigned char j, k, Num = 0; EX0 = 0; //关闭INT0中断 delay(15); //延时 if (IRIN == 1) //再确认IR信号是否出现 { EX0 = 1; //开INT0中断 return ; //退出 } while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 { delay(1); } while (IRIN) //等IR变为低电平,跳过4.5ms的前导高电平信号。 { delay(1); } for (j = 0; j < 4; j++) //收集四组数据 { for (k = 0; k < 8; k++) //每组数据有8位 { while (IRIN) //等 IR 变为低电平 { delay(1); } while (!IRIN) //等 IR 变为高电平 { delay(1); } while (IRIN) //计算IR高电平时长 { delay(1); Num++; if (Num >= 15) { EX0 = 1; //0.14ms计数过长自动离开。 return ; } } //高电平计数完毕 IRCOM[j] = IRCOM[j] >> 1; //数据最高位补“0” if (Num >= 8) IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补“1” Num = 0; } //end for k } //end for j if (IRCOM[0] != 0x00) //比较用户码 { EX0 = 1; //开INT0中断 return ; //退出 } if (IRCOM[2] != ~IRCOM[3]) //接收数据是否正确 { EX0 = 1; //开INT0中断 return ; //退出 } IRCOM[4] = IRCOM[2] &0x0F; //取键码的低四位 IRCOM[5] = IRCOM[2] >> 4; //右移4次,高四位变为低四位 play(); //显示键码 beep(); //蜂鸣器响一声 EX0 = 1; //重新开INT0中断 } /********************************************************** ;================================ ;6121码 遥控器(晶控电子) ;******红外遥控器键值表****** 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B ;================================ IRCOM[0] --- 存放用户码 00H IRCOM[1] --- 存放用户反码ffH IRCOM[2] --- 存放数据码 IRCOM[3] --- 存放数据反码 *********************************************************/
上一篇:单片机位操作的逻辑运算详解
下一篇:51单片机学前基础知识
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3648721&bbs_page_no=1&bbs_id=9999 暑假学校里做机器人比赛,就是做出一个人型机器人来互相对打,要求无线控制的。 我因为去年做过这个 ...… 查看全部问答> |
|
应用场合不同,选择交流或直流取决于线圈,直流接触器的线圈只能通直流,交流接触器的线圈只能通交流工作。一般来说,在交流回路当中,主回路用的交流,辅助助回路一般都是从主回路上取电做控制回路,那么控制回路显然也是交流的,那么就要用交流接 ...… 查看全部问答> |
|
小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手… 查看全部问答> |
|
#include <STM8S105C_S.h> #define uchar unsigned char #define uint unsigned int #define data_out PB_DDR|=0X04; #define data_in PB_DDR&=~0X04; #define scl_H PB_ODR|=0X02; #define scl_L PB_ODR&=~0X02; #define sda_ ...… 查看全部问答> |
|
用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...… 查看全部问答> |
|
lowlevel_init.S的system_clock_init函数放到C语言下面实现——更好处理 在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了 ...… 查看全部问答> |




