单片机(一)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 ; 
}

上面是对串口方面的浅薄认识,还请指教!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章