0 i5 Q: \6 |. O( U- L5 n. D这是用一个晶体管控制继电器的输出,pkn接单片机的输出,R14是上拉电阻。这个图的出处,是以前的设计,我直接抄过来用了。一向也还好用。( b( ~& @4 a. c4 k* k" l
但是必须指出,前一段用万用表 eepw.com.cn/news/listbylabel/label/万用表量过单片机的pkn引脚,在输出为高时,只有0.7V的电压,理论上应为单片机的供电电压5V。这大概是被晶体管拉低了。单片机是Microchip的DSPic,单腿的输出可到8mA,看样子单片机勉为其难了。长期这样会不会损坏单片机? 8 i) P$ A+ } i' ^( l% s 3 b& U) F$ b0 N5 U 出问题的是下面一段程序,要根据pkn的状态进入一段程序: , J4 l8 u* G4 x' g1 f if(PORTBbits.PKN == 1) ) P. ]9 y4 e: K: b { …… }' }; D2 B& d' _: ~
结果有一万次路过这个块,该进而没有进去。这是为什么?" C6 b7 U) E0 u' A6 w4 ^
检查了半天,逻辑没有错。: k y' r' m9 t: R K8 U' M! Q
& z; D6 E, w1 K5 u3 e6 R ]! _3 d 不废话了。想到了前面说的,在程序让pkn输出为高的时候,它被三极管拉低到0.7V,这时三极管是开通的,但是单片机管脚的状态却是“0”。所以上面的判断语句,从程序本身没有错,因为已在稍早时对PORTBbits.PKN赋1了,但是这个脚的实际状态却是“0”。 F1 \* h7 x6 C. v
g1 p0 [8 K3 D) P8 U
这个程序,把PORTBbits.PKN,改为LATBbits.PKN,就是正确的。因为此时读、写的是输出锁存的状态,即使管脚的实际状态为零,锁存也告诉我们,他内心的态度是1。 2 P; p. Z5 r: v8 Z& Q 程序虽然对了,硬件还是不好,因为管脚还是要被拉低为零。而且R14的上拉是没有用处的。应把上拉的R14改为串在单片机管脚与三极管基极之间。