第2节介绍了如何用单片机控制 LED 小灯闪烁起来,在此基础上,又在上一节讨论了如何制作“呼吸灯”。
![aaa39af8aa5a148a6b1a4d01b6c948ea.png](https://i-blog.csdnimg.cn/blog_migrate/7696964b4803f4770613cac86a84202a.jpeg)
缺乏交互的单片机
不过,这两节制作的小灯时,我们把使用 C语言编写的控制程序烧写到单片机后,就无法再控制 LED 小灯了,也就是说,“只能看不能动”,交互性比较差。接下来两节,将介绍一种交互方法,目的是烧写 C语言控制程序到单片机后,仍然能够从外界控制 LED 小灯。
既然想实现交互,单片机就得能捕捉外界的变化,最简单的方法就是通过按键。不过这里不打算使用按键,而是通过“输入命令”的方式控制 LED 小灯。
将单片机内部的信息,printf 传递给电脑
一般的软件开发中,如果想查看某个变量的值,或者想输出一句提示信息,直接使用 printf 将信息输出到屏幕即可。遇到分支流程需要外界选择时,我们也只需按一下键盘就可以。但是对于 51 单片机来说,怎么输入命令给它呢?我的这款 51 单片机可既没有配屏幕,也没有配键盘:
![6f5a7075924c57f3f1cdcaf002f1c16a.png](https://i-blog.csdnimg.cn/blog_migrate/a1b520438bdc9dae378ff9ac6287da58.jpeg)
其实 printf 只是将信息输出到终端,终端不一定必须是屏幕,也可以是其他字符设备,比如一般单片机都会有的串口外设。所以,没有屏幕的 51 单片机也能够使用 printf 函数,只需要将其输出口重定向到串口即可。
重定向的工作 keil4 已经做好了,剩下需要我们做的工作仅仅只是配置一下单片机的串口寄存器而已,这项工作非常简单,C语言代码可以如下写,请看:
void init_uart(unsigned int baud){ SCON = 0x5a; TMOD = 0x20; TH1 = TL1 = -(FOSC/12/32/baud); TR1 = 1; ES = 1; EA = 1;}
其中 FOSC 是单片机的晶振频率,我使用的单片机频率是 11.0592MHz。现在包含一下“stdio.h”头文件就可以使用 printf 函数了:
#include "reg51.h"#include "stdio.h"void main(){ init_uart(9600); printf("hello world, num: %d