看了老师的视频之后,自己手动写了代码。一边写代码,一边编译,这种方式真好,可以及早发现问题。
比如说,这次的代码中,关于中断函数,我就写错了,直接把中断优先级也给写在函数的声明里了,还好及时编译及早的定位了问题点。
想想自己以前也用过中断函数,但为什么这次声明错误呢?因为之前的程序中,我直接在函数声明时就把函数主体给写上去了。
所以,要多动手,多犯错了,记忆就深刻了。
代码如下:
//功能实现:接收从上位机发来的信息
#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); //把从上位机接收到的数据,发回来上位机
}
}