经典程序STC89C52RC 12M红外二极管发射测试成功
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典程序STC89C52RC 12M红外二极管发射测试成功相关的知识,希望对你有一定的参考价值。
/* 89C52RC 12M晶振 红外发射试验, 在红外解码和机顶盒上都测试可用! 发射的编码是 SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码 红外发射管的正极接VCC 5V 红外发射管的负极接21号引脚 */ #include <REG51.h> static bit wave; //红外发射管的亮灭 static unsigned int count; //延时计数器 static unsigned int endcount; //终止延时计数 static bit flag; //红外发送标志 sbit Send_wave=P2^0; void delay(){ //1秒的延时 int i,j; for(i=0;i<400;i++) { for(j=0;j<100;j++) { } } } void SendByte(unsigned char OneByte){ //发送一个8bit数据 unsigned char irdata,i; irdata=OneByte; for(i=0;i<8;i++) { endcount=10; flag=1; count=0; do{}while(count<endcount); if(irdata & 1){endcount=41;} //如果末位是1,电平持续时间会长一些 else{ endcount=15;} //如果末位是0,电平持续时间短长一些 flag=0; count=0; do{}while(count<endcount); irdata=irdata>>1; } } void SendIRdata(char usercode1,char usercode2,char keycode){ endcount=223; //发送9ms的起始码,在接受端的红外一体化输出,会有一个下降沿 flag=1; count=0; do{}while(count<endcount); endcount=117; //发送4.5ms的结果码 flag=0; count=0; do{}while(count<endcount); SendByte(usercode1); //发送十六位地址的前八位 SendByte(usercode2); //发送十六位地址的后八位 SendByte(keycode); //发送编码 SendByte(~keycode); //发送编码的反码 endcount=10; flag=1; count=0; do{}while(count<endcount); flag=0; } void timeinit(void){ //12M晶振 产生38K载波 EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许 TH0 = 0xFF; TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次 TR0 = 1;//开始计数 } void main(void) { count = 0; flag = 0; wave = 0; Send_wave = 0; timeinit(); while(1){ delay(); SendIRdata(0x48,0x77,0x01); } } //定时器0中断处理 void timeint(void) interrupt 1 { //12M晶振,产生38K的载波 TH0=0xFF; TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次 count++; if (flag){wave=~wave;} else{wave = 0;} Send_wave = wave; }
经典程序2:
不用红外与机顶盒交互
/* 89C52RC 12M晶振 不用任何红外,用连线的方式,与机顶盒交互 在机顶盒上测试可用! 发射的编码是 SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码 机顶盒的GND接单片机的GND 机顶盒的红外接收引脚接单片机第21号引脚 注意是:接的是机顶盒 一体化红外接收的OUT引脚 */ #include <REG51.h> static bit wave; //红外发射管的亮灭 static unsigned int count; //延时计数器 static unsigned int endcount; //终止延时计数 static bit flag; //红外发送标志 sbit Send_wave=P2^0; void delay(){ //1秒的延时 int i,j; for(i=0;i<400;i++) { for(j=0;j<100;j++) { } } } void SendByte(unsigned char OneByte){ //发送一个8bit数据 unsigned char irdata,i; irdata=OneByte; for(i=0;i<8;i++) { endcount=10; flag=1; count=0; do{}while(count<endcount); if(irdata & 1){endcount=41;} //如果末位是1,电平持续时间会长一些 else{ endcount=15;} //如果末位是0,电平持续时间短长一些 flag=0; count=0; do{}while(count<endcount); irdata=irdata>>1; } } void SendIRdata(char usercode1,char usercode2,char keycode){ endcount=223; //发送9ms的起始码,在接受端的红外一体化输出,会有一个下降沿 flag=1; count=0; do{}while(count<endcount); endcount=117; //发送4.5ms的结果码 flag=0; count=0; do{}while(count<endcount); SendByte(usercode1); //发送十六位地址的前八位 SendByte(usercode2); //发送十六位地址的后八位 SendByte(keycode); //发送编码 SendByte(~keycode); //发送编码的反码 endcount=10; flag=1; count=0; do{}while(count<endcount); flag=0; } void timeinit(void){ //12M晶振 产生38K载波 EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许 TH0 = 0xFF; TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次 TR0 = 1;//开始计数 } void main(void) { count = 0; flag = 0; wave = 0; Send_wave = 0; timeinit(); while(1){ delay(); SendIRdata(0x48,0x77,0x01); } } //定时器0中断处理 void timeint(void) interrupt 1 { //12M晶振,产生38K的载波 TH0=0xFF; TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次 count++; // if (flag){wave=~wave;} if (flag){wave=1;} else{wave = 0;} Send_wave = ~wave; }
本文出自 “魂斗罗” 博客,谢绝转载!
以上是关于经典程序STC89C52RC 12M红外二极管发射测试成功的主要内容,如果未能解决你的问题,请参考以下文章
8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED
8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动
STC89C52RC单片机额外篇 | 05 - 把NOP指令封装成微秒级延时函数