请教,关于P口的读写一点疑惑各位大虾好。
我是一名单片机初学者,因为有过几年用高级语言编程的经验.公司有一通信放大电路要用89C51控制,看上去也简单,就是根据P1口P0口的状态变化,通过P2口控制几个继电器的动作(比如电话挂机时P1.0为高电平,当摘机时P1.0变为低电平,此时,给P1.4一个低电平放开继电器K1,给P2.0一个高电平, 吸合继电器K2,诸如此类),于是欣然接受任务,设计了自以为精巧的算法,可实际一作,效果全然不对,晕死,差点被老板逼死.仔细看了看书,特在此向各位请教几个有关P口的问题.
1:书上说”向端口输出1时,若用一根口线去驱动一个晶体管的基极,在射极接地的情况下,晶体管导通,并把引脚上电平拉低到0.7V,此时若从引脚读数据,会把此数据误读为0,若从锁存器Q端读取则可得到正确的数据”,我在实际应用中也体会到这引脚变为0的过程.可要怎么作才是”从锁存器Q端读取”?
用什么指令? 应该不是mov c,p2.0这种吧.
书上说:”ANL p1, A 是(读-修改-写)指令,不读引脚而读锁存器的状态”,那 ANL A ,p1是不是的呢?这样才能在从A中 知道P1某引脚的当前状态吧
2:关于P口的输入,”P0,P1是准双向口,在作输入口使用时,要先对其进行写1操作”,是不是说我要先setb P0.1后,.再mov c,P0.1才能读出引脚当前的信息?(我驱动P2口的继电器用的是setb P0.1和clr P0.1指令,我再读引脚的值,会不会被影响?)
3: 对P口状态的计时: P1.1通常是高电平,当有电话振铃时,应为周期1秒低4秒高的若干个方波,应怎么计时并判断是否符合这个标准?----我是在定时中断里读当前P1.1脚的电平b_now,并与上一个中断周期的历史电平值b_last比较,若不相同就开始计时(数),(并将b_now=> b_last),当出现另一个不相同的情况时,保存当前的计时值,并开始新的计时,可好象得不到正确结果,是不是在读引脚电平值时,为保险起见,每次读前都先写入1才好?
疑惑比较多,总之一句话,就是怎样才是”从锁存器Q端读出P口的值“。旁观者清,敬请一言点醒梦中人,谢了