一个红外解码 返回串口显示的程序
时间:10-02
整理:3721RD
点击:
- #include <reg52.h>
- typedef unsigned char uint8;
- sbit Ir_Pin = P3^2;
- uint8 Ir_Buf[4]; //用于保存解码结果
- void uart_init(void)
- {
- TMOD = 0x21; //0010 0001 定时器1工作2 定时器0工作方式1
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = 0xFD;
- TR1 = 1;
- }
- void UART_Send_Byte(uint8 dat)
- {
- SBUF = dat;
- while(TI == 0);
- TI = 0;
- }
- unsigned int Ir_Get_Low()
- {
- TL0 = 0;
- TH0 = 0;
- TR0 = 1;
- while (!Ir_Pin && (TH0&0x80)==0);
-
- TR0 = 0;
- return (TH0 * 256 + TL0);
- }
- unsigned int Ir_Get_High()
- {
- TL0 = 0;
- TH0 = 0;
- TR0 = 1;
- while (Ir_Pin && (TH0&0x80)==0);
- TR0 = 0;
- return (TH0 * 256 + TL0);
- }
- main()
- {
- unsigned int temp;
- char i,j;
- uart_init();
-
- while (1)
- {
- start:
- while (Ir_Pin);
- temp = Ir_Get_Low();
- if ((temp < 7833) || (temp > 8755)) //引导脉冲低电平8500~9500us
- goto start;
- temp = Ir_Get_High();
- if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us 检测引导码
- goto start;
- for (i=0; i<4; i++) //4个字节
- {
- for (j=0; j<8; j++) //每个字节8位
- {
- temp = Ir_Get_Low();
- if ((temp < 184) || (temp > 737)) //200~800us 低电平不在560us左右
- goto start;
- temp = Ir_Get_High();
- if ((temp < 184) || (temp > 1843)) //200~2000us 高电平1680us
- goto start;
- Ir_Buf[i] >>= 1;
- if (temp > 1032) //1120us 写“1”
- Ir_Buf[i] |= 0x80;
- }
- }
- UART_Send_Byte(Ir_Buf[0]);
- UART_Send_Byte(Ir_Buf[1]);
- UART_Send_Byte(Ir_Buf[2]);
- UART_Send_Byte(Ir_Buf[3]);
- }
- }
void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
这段的意思是什么?
不是发送完一个8位数据会机械置1要软件清零吗
需要软件清0.发送完了会自动标志位1.如果你还需要下次继续发送,那么TI久需要被手动清0.
