1、(完整word)基于51单片机红外发射与接收C程序 基于51单片机红外发射与接收程序实验证明,效果非常好。红外发射程序includereg51.h#include#define uchar unsigned char#define uint unsigned intsbit key1=P33;sbit key2=P34;sbit key3=P35;sbit LED=P10; /发射指示灯sbit out=P37;uchar i,a,num1;void init()/初始化作用key1=1;key2=1;key3=1;void delay(uchar aa)uchar bb,cc;for(bb=
2、aa;bb0;bb-)for(cc=200;cc0;cc-);void delayms(uchar aa)/延时程序for(a=aa;a0;a-)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void khz(uchar aa)/是发射38KHZ的程序for(a=aa;a0;a-) /这个for语句可以得到准确的26。3波特率out=0;i=7;/低了17uswhile(i0)i-;/ 38kHZ out=1;/高了9us 17+9=26us 比26.3快一点点/khz(116);/3.028ms 精确的时间/k
3、hz(64);/2.006ms/khz(40); /1.052ms/delayms(125);/2.012ms 这里是一些时间的介绍/delayms(65);/1。054ms/delayms(93);/1.5msvoid fashu(uchar num)khz(116);/发射3ms 38khzdelayms(125);for(num1=8;num10;num1-) /原来用的是a 后来出错,肯定在这里!khz(40);if(num0x01)delayms(93);/delay 1。5mselsedelayms(65);/delay 1msnum=num1;khz(20);void tishi
4、() LED=0;delay(50);LED=1;delay(50);LED=0;delay(50);LED=1;void keyscan()/按键扫描if(key1=0)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();if(key1=0)while(!key1);fashu(0xf3);tishi();if(key2=0)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();if(key2=0)while(!key2);fashu(0x3f
5、);tishi();if(key3=0)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();if(key3=0)while(!key3);fashu(0xf5);tishi();void main()init();while(1)keyscan();红外接收程序#includereg51。h#includedefine uchar unsigned char#define uint unsigned intsbit led1=P10;sbit led2=P11;sbit led3=P12;sbit in=P32;uch
6、ar i,a,num;bit fleg;void init()fleg=1;in=1;EA=1;EX0=1;IT0=1;void delayms(uchar aa)for(i=aa;i0;i-)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void main()init();/delayms(45);/0.642ms/delayms(35);/0。502ms/delayms(115);/1.623ms/delayms(72);/1。02ms/delayms(84);/1.188ms/delayms(31);/0.446mswhile(1);vo
7、id sieasdf() interrupt 0EX0=0;for(a=5;a0;a-)delayms(35);/延时0。5ms 判断5次 50。52.5msif(in)fleg=0;if(fleg)delayms(72);/延时1ms 判断是不是高电平了if(in)delayms(115);/延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据delayms(118);/若偏移一位,可以去掉。for(a=8;a0;a)while(!in);delayms(86);/延时1。188ms 判断IO高低,从而得0或1num=num1;if(in)num=num0x80;delayms(31);/延时0。6ms 因为上面延时1。2ms+0。6 刚好跳过1。5msP2=num;fleg=1;EX0=1;