串口2(接收来自上位机的数据,并发回上位机)

看了老师的视频之后,自己手动写了代码。一边写代码,一边编译,这种方式真好,可以及早发现问题。
比如说,这次的代码中,关于中断函数,我就写错了,直接把中断优先级也给写在函数的声明里了,还好及时编译及早的定位了问题点。
想想自己以前也用过中断函数,但为什么这次声明错误呢?因为之前的程序中,我直接在函数声明时就把函数主体给写上去了。
所以,要多动手,多犯错了,记忆就深刻了。
代码如下:

//功能实现:接收从上位机发来的信息

#include <reg51.h>

void uart_init (void);						//串口初始化
void uart_sent_byte (unsigned char b);		//发送给上位机
void uart_receive_byte (void);				//接收来自上位机的东西;注:void uart_receive (void) interrupt 4 unsing 1; ==>这种中断函数的声明是错的,不用带中断优先级	

void main ()
{
	uart_init ();
	while (1)
	{
		uart_receive_byte ();
	}
}

void uart_init (void)
{
	SCON = 0x50;	//配置SCON寄存器工作在方式1	—— 8位uart,并允许串行接收
	PCON = 0X80;	//设置波特率加倍

	TMOD = 0x20;	//设置定时器1工作在方式2 —— 8位自动重装
	TH1 = 243;		//赋初值。波特率设定在 4800
	TL1 = 243;		
	TR1 = 1;		//启动定时器
}

void uart_sent_byte (unsigned char b)
{
	//对于发送,采用查询TI这个标志位的方式,而不使用中断。CPU只需要给SBUF里丢东西就好了,不用盯着它。
	SBUF = b;		//把数据扔到SBUF里,OSC会自动发送;
	while (! TI);	//只有当发送完成之后,TI会被硬件置1,说明发完了,再继续往下走。
	TI = 0;			//标志位要手动复位	
}
																																	 
void uart_receive_byte (void) interrupt 4 using 1	 //使用中断的方式接收串口数据
{
	//如果接到到了数据,那么CPU会来这里
	unsigned char a;
	if (RI)			//接收到中断说明 RI == 1
	{
		a = SBUF;				//接数据读取出来
		RI = 0;					//需要软件复位
		uart_sent_byte (a);		//把从上位机接收到的数据,发回来上位机
	}

}
上一篇:What!前端也能玩硬件:在ESP32上运行JavaScript


下一篇:【NiosII学习】第四篇、USART串口收发