4.3 程序设计和仿真运行
画好了原理图,接下去就是程序设计了。打开Keil C51 uVision2软件,新建一个工程t4,如图4-13所示。
图4-13 新建工程
接着是选择厂商和单片机型号Atmel和89C52(参看第3讲),然后是新建文本文件,在其中编写或粘贴程序,程序内容如图4-14所示。
图4-14 新建程序文件
将该文件命名为t4.c存盘,如图4-15所示。
将文件加入到工程中(参见第3讲),如图4-16所示。
接着,还要设置工程目标的属性,以便能编译生成可执行文件。将光标放在最上层“Target 1”上,选择菜单“工程”→“目标‘Target 1’属性”,如图4-17所示。
图4-15 文件存盘
图4-16 在工程中添加文件
图4-17 设置目标属性
这样,编译后,就会在工程目录中生成t1.hex可执行文件。
接下来,我们分析一下这个程序的结构和功能,先列出程序及说明:
程序由3部分组成:头文件、主程序和延时子程序。头文件是固定的,每个单片机程序都必须有。延时子程序使发光二极管在变化时有一个停留时间,通过一个外循环和内循环的空操作,共循环255×255次。这里需要说明一点,程序中把延时子程序放在最后,所以需要在头上说明一下,若子程序放在主程序之前,就不需要说明了。
下面我们来分析主程序。
我们要用单片机的P0口控制8个发光二极管循环点亮和关闭,就是要在P0口循环输出一个0,也就是低电平。因为,在前面我们已经做了实验,发光二极管负极接单片机引脚,引脚输出低电平0,发光二极管获得足够的电压降,就会发光,反之,单片机引脚输出高电平1,则发光二极管不亮。P0口8个引脚有几个低电平0,就有几个发光二极管点亮。现在,我们需要只有一个0,其他引脚都是高电平1,并且需要循环变化,让这个0逐个从低到高或从高到低的走。可以用给单片机端口赋值的方法设置引脚的输出,如在开始,P0=0xff,就是给端口P0的所有引脚设置成高电平。0xff就是十六进制ff,折算成二进制就是11111111,正好8个1,每个十六进制对应二进制4位。因此,一开始是没有发光二极管点亮的。
首先是定义变量,i用作循环。temp作为输出的变量。我们来看无线循环中的循环体,先给temp赋一个初值0x80,就是二进制10000000,最高位是1。在以下的8次循环中把temp求反后赋值给P0口,“~”就是求反的运算符。然后是延时一段时间,最后把temp值右移一位,转到下一个循环。见表4-2。
表4-2 temp值与P0口输出值对照
可以看到,P0口的值有一个0从高到低的走,就使得引脚逐个变成低电平,也就控制了发光二极管逐个地点亮和关闭。用temp作为中间变量,是因为要使一个0从高到低地移动是困难的,但要使一个1移动却很容易,只要用“﹥﹥”就做到了,然后求反就可以了。
循环了8次后,temp重新赋值为10000000,继续下一个8次循环,继续不断地进行,就实现了发光二极管不断地从高到低的点亮和关闭。
接下来,我们编译程序,如图4-18所示。
图4-18 编译结果显示
显示0错误和0警告,说明编译成功。这样,我们就可以用编译出来的可执行程序进行仿真了。在电路中双击单片机,在弹出的“编辑元件”对话框的“Program File”栏,选择浏览按钮,找到可执行文件t4.hex,如图4-19所示。
单击“确定”按钮来保存,单击仿真按钮进行仿真运行,如图4-20所示。
我们实现了发光二极管从高到低(P0^7~P0^0)的变化点亮和关闭,那么,如何使它从低到高的变化呢?刚才我们给temp赋值是0x80,最高为为1,只要把它改成0x01,即最低为1,求反后就是最低位为0。另外,还要把移动方向改为向左移动“<<”。这样,变化就是从低到高的点亮和关闭。请读者自己试一下,看能否改过来!只要把程序改动一下,然后重新编译。电路中单片机程序加载不需要重做,很方便吧!
图4-19 浏览查找可执行程序
图4-20 流水灯控制