单片机(一)51单片机串口接收、发送通信
这次做课设整体不太顺利,因为学校的开发板真的是……一言难尽
这里就选择性的分享一点代码方面,有据可循,不那么玄学的问题。
1、中断
只要开了中断,一点要写中断函数,可以是
void timer0() interrupt 4 { ; }
可以是这样,先放一个空函数,不会有什么玄学问题
不信,嘿嘿🤭,你试试
2、SBUF发送/接收寄存器
这是个串口收发寄存器,教科书里面稀奇的是,接收、发送寄存器是两个寄存器,分别是接收寄存器、发送寄存器,不过两个寄存器的名字是一样的。可能你会疑问,他们不冲突矛盾🐎?奇妙的是总线就是同时操作两个的,但由于功能不同,就没事了。比如接收,总线让他们接收,但发送寄存器不会接收,就没事了,很巧妙。
这个初衷是个人性化的设计,减少一点寄存器 的数量,可以少记一点,但事实却是让初学者一头雾水。
教科书里面这个是稀奇的,实操中,硬件才是要命的,由于一些usb转ttl芯片不能完全隔离两边的信号,当使用主机usb口供电的时候,主机信号就会越过转换芯片影响串口的电平,导致串口数据错误。
这点很魔性,如果有人能告诉你这些,你要尊重他,因为这都是泪水和肝。
3、收发机制
做课设,同学问我,为什么数据 放进寄存器,就能直接发送了,当时给他解释,就是一个投喂机制,像喂狗一样,肉包子扔那就行了,他不傻。
回来之后,觉得是很奇怪,就查了查。因为有串口中断啊。倒不是中断就发送了,是因为中断里面查询判断了寄存器的标志位,对,就是标志位,因为这个才会投喂发送的。
原来肉包子扔那不行,还得喂给她。
#include <reg52.h> unsigned char RxBuff = 0xff ; void uart_init() { SCON = 0x50;//´®¿Ú¹¤×÷·½Ê½1 TMOD = 0x21;//T1¹¤×÷·½Ê½2,T0¹¤×÷·½Ê½1 PCON = 0x00;//¼´SMOD=1£¬²¨ÌØÂʲ»¼Ó±¶ TH1 = 0xFD;//¼ÆÊýÆ÷T1³õÖµ£¬²¨ÌØÂÊ9600£¬¾§ÕñΪ11.0592MHz TL1 = 0xFD; TH0 = 0xFC;//T0¸³Öµ0XFC67,¶¨Ê±1ms TH0 = 0x67; ES = 1; //´®ÐпÚÖжÏÔÊÐí ET0 = 1; //T0ÖжÏÔÊÐíλ EA = 1;//ʹÄÜ×ÜÖÐ¶Ï TR1 = 1;//Æô¶¯T1 TR0 = 1; //Æô¶¯T0 } void putChar (unsigned char chr) { SBUF = chr; led0 =~led0; } void Mode1() { unsigned char i = 0; M485 = 1; led1=~led1; for(i = 0; i < 100; ++i) { putChar(i); delayms(1000); if(RxBuff != 0xff) disp(RxBuff); } return ; } void main() { uart_init(); while(1) { Mode1(); } } void timer1(void) interrupt 4 { if( RI ) { RI = 0; RxBuff = SBUF; } if( TI ) { TI = 0; } return ; }
上面是对串口方面的浅薄认识,还请指教!!!