在读引脚时,该端口的锁存储器必须事先写1,这是因为该端口既是输出端同时也是外部信号的输入端。假设该端口的状态此时为0,则驱动器的下方场效应管导通,此时相当于输出0。缺碧如果有一外部输入信号是高电平且加到该引脚上枣滑,则该引脚伏岩举会被强行箝拉到低电平,故造成读到CPU中的数据为0,同时也可能造成器件损环。
一直循环检测IO口状态,检测到起始信号边缘(如51单御答片机IO口一直是高电平,当检简唯测到出现低电平即为启动信号),然后利用延时程序延时0.5ms,读取每个数据位的中间位置,判断是0还是1。根据你的实际要求,第一次读取肯定是高电平,第二次读取为低电平,你需要再判断第三次和第四次,如果第三、四次均为低电平则为数据1,如果不是则为数据0。
个人感觉你这个通信协议有点问题,需要改进。原因如下:
比如顺氦矗份匪莓睹逢色抚姬序出现高、低、低电平时已经可以判断为1了,第四个电平是没有作用的。还有你这个协议由于数据1传输结尾时低电平,因此需要以高电平作为镇咐慧启动信号,而大部分单片机都是以低电平为启动信号的。
本来要说明具体在什么地方用,但是只按你的要求处理的话脊宏段如下假设IO的脚位是P1^0
int DELAY_CNT
if(P1^0==X)
{
DELAY_CNT++
if(DELAY_CNT>樱誉10000)
{
if(P1^0==X)
CNT++
if(CNT>4)
{
FLAG_X=1
}
}
}
在主函数里判断FLAG_X是否等于1如果是,那就处理你要处理的,如果不是,就说明没达绝搜到处理要求。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)