angmall 发表于 2019-6-12 20:34 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit IR_OUT = P0^0; //红外发射引脚 //T1 13us产生一次中断 用于产生38K载波 //T0 方式1 16位 用于定时 void Init_Timer(void) { TMOD=0x21; //T0 mode 1 T1 mode 2 TH1=243; //特殊 TL1=TH1; ET1=1; EA=1; } //发送引导码 发送方:9ms高电平 4.5ms低电平 void Send_Start_Bit(void) //TR1的值=发送的电平 { //9ms 1 TH0=0xDC; TL0=0xD9; TR0=1; TR1=1; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //4.5ms 0 TH0=0xEE; TL0=0x6E; TR0=1; TR1=0; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送0 void Send_Bit_0(void) { //0.565ms 1 TH0=0xFD; TL0=0xCB; TR0=1; TR1=1; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //0.565ms 0 TH0=0xFD; TL0=0xCB; TR0=1; TR1=0; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送1 void Send_Bit_1(void) { //0.565ms 1 TH0=0xFD; TL0=0xCB; TR0=1; TR1=1; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //1.685ms 0 TH0=0xF9; TL0=0x6C; TR0=1; TR1=0; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } void Send_over(void) //发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿) { //0.500ms 1 //小于0.5ms 接收端很难识别到 TH0=0xFE; TL0=0x0C; TR0=1; TR1=1; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //0.500ms 0 TH0=0xFE; TL0=0x0C; TR0=1; TR1=0; while(!TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送一字节 8位 void Send_Char() { unsigned char i,j1,j2,j3,j4; j1=0xCC; j2=0x1D; j3=0x08; j4=0xF7; Send_Start_Bit(); Send_Bit_0(); //发射引导吗 for(i=0;i<8;i++) { if(j1&1) Send_Bit_1(); else Send_Bit_0(); j1=j1>>1; //先发射低位 } for(i=0;i<8;i++) { if(j2&1) Send_Bit_1(); else Send_Bit_0(); j2=j2>>1; //先发射低位 } for(i=0;i<8;i++) { if(j3&1) Send_Bit_1(); else Send_Bit_0(); j3=j3>>1; //先发射低位 } for(i=0;i<8;i++) { if(j4&1) Send_Bit_1(); else Send_Bit_0(); j4=j4>>1; //先发射低位 } Send_over(); //结束符 } void T1_ISR(void) interrupt 3 { IR_OUT=!IR_OUT; } void main() { Init_Timer(); while(1) { Send_Char(); } } 这个程序可以吗。。。仿真示波器,看着正常。做成电路,不知道为什么不行。 |
angmall 发表于 2019-6-12 20:34 MCU 还是1T的呀。 |
angmall 发表于 2019-6-12 20:34 没法用这,这个是什么型号的51呀。。。 怎么还有P5 IO口呀。 |
angmall 发表于 2019-6-12 20:34 谢谢,我试试。 |
郑汉松 发表于 2019-6-12 19:50 13不是26. 26就成的19KHz了,不是38K了。 |
做红外的话,单片机的精度可能不够,最好用STM32或者K60做,按着解码的步骤,获取高低电平的时间然后解码就可以了 |
我给你来个程序试试
|
38K赫兹载波,每26us取反一次,用中断与子函数配合着用,没那么复杂的 |
yzwzfyz 发表于 2019-6-12 08:14 说一下,这个问题,如何解决。。。 |
sadbkj 发表于 2019-6-12 09:59 没听明白,是什么意思。。。详细说一下吧。。。 |
yzwzfyz 发表于 2019-6-12 08:14 如何解决呀。让单片机只输出信号的高低电平。不产生38K方波吗。 单片机,外部再加一个,38K方波产生的电路吗??? |
51单片机本身执行周期就长,加上你要求这么高的精度,有点难搞。你所看到的高电平多一点,是因为从低电平到高电平的过程中会有波动,也就是常说的抖动,你要从原理上去分析,试着用去抖动的方法来完成。很简单就是判断一下,让它变换的更迅速而已。 |
加上对单片机的了解不够,问题就出来了。 |
一开始的设计方案就不对! |