单片机型号:NY8A054E
读取脚(RX):PB0
时钟:16MHz , 2T
一、GPIO初始化:
a) IOSTB = C_PB0_Input; // 先设置 PB0 为输入脚;
b) INTEDG = C_INT0_En | C_INT0_FallingEdge ;// 打开中断0,并设置中断0为下降沿触方式,这个很重要,因为TTL是由高电平到低电平的变换作为开头;
c) INTE = C_INT_EXT0 | C_INT_PABKey; //C_INT_PABKey对串口没有实际帮助的;
d) INTF = 0x00; // Clear all interrupt flags;
二、数据接收业务实现代码:
char rbuf ; //先定义一个字节变量,用来接收数据
//! interrupt service routine
void isr(void) __interrupt(0)
{
if(INTFbits.INT0IF)
{
delay_52us();
if(0 == RX){
rbuf = 0;
for( i = 0; i < 8; i++){
rbuf >>= 1;
delay_104us();
if(1 == RX)
rbuf |= 0x80;
}
}
//清除中断0标志,等待下次数据到来
INTF = (unsigned char)~(C_INT_EXT0); // Clear INT0IF(External interrupt 0 flag bit)
}
}
三、延时解析:
1、52us是用来过滤一些杂波的;
2、104us 是【波特率9600】的时钟宽度,计算公式如下:
1s/9600 = 0.000104S = 0.104ms = 104us;
1 000 000us /9600 = 104us;