3.1.3 并行口(位、段)(输入/输出方式)设计的应用编程

3.1.3 并行口(位、段)(输入/输出方式)设计的应用编程

1.应用电路

用单片机I/O实现流水灯电路设计的应用电路如图3.1所示。

图3.1 6个数码管接口电路

图3.1中74LS573接成直通方式驱动数码管,用两个短接块将J2、J3上面的两引脚相连(见图3.1的黑线),这样P1.4和P1.5就连接了第5个和第6个数码管的阴极,此时这两个数码管可受程序控制工作。

图3.1所示的为接有6个共阴极数码管的动态显示接口电路,用74LS573接成直通的方式作为驱动电路,阴极用非门74LS04反向门驱动,字形选择由P2口提供,位选择由P1口控制。

2.应用内容

1)实验1——控制发光二极管的闪烁

(1)设计及要求。

设计:控制1~6盏发光二极管的闪烁。

要求:通过实践本实验,掌握延时语句、延时函数的编写;掌握延时时间的仿真测量方法,掌握带形参函数或者不带形参函数的编写。

(2)解析。

什么是闪烁?闪烁其实就是灯的亮灭状态转换。闪烁的快慢就是灯亮灭状态切换的频率。如果灯闪烁太快,或者说切换频率太快,那么人眼就会无法分辨灯亮灭状态,最终看到的是灯处于常亮状态。这点同学们可以在实验中通过调节延时时长来体会。

(3)参考程序。

软件仿真参考流程图如图3.2所示。

图3.2 实验1软件仿真参考流程图

参考程序1——采用循环语句实现延时的程序如下。

参考程序2——不带形参的延时函数的程序如下。

参考程序3——带形参的延时函数的程序如下。

2)实验2——流水灯

(1)设计及要求。

设计:用不同的方法实现流水灯。

要求:在单片机系统运行时,可以在不同状态下让流水灯显示不同的组合,作为单片机系统运行正常的指示。当单片机系统出现故障时,可以利用流水灯显示当前的故障码。

(2)解析。

将若干个灯泡有规律依次点亮或依次熄灭的灯就称为流水灯,流水灯更像“马儿一样跑动”的灯,故也称为“跑马灯”。一般情况下,单片机的流水灯由若干个LED发光二极管组成。

有DO、D1、D2、D3、D4、D5等6盏LED,可以设计如图3.3所示的右移流水灯。实现流水灯的方法很多,以下仅选取其中三种方法加以说明。

图3.3 右移流水灯状态转移图

(3)参考程序。

①方法一:对P1口直接赋状态值。

参考程序流程图如图3.4所示。

图3.4 实验2方法一的参考程序流程图

参考程序如下。

可通过主菜单中的“外设”→“端口“,按热键F7或F8,进行单步跟踪,观察P1口的变化。

将上述程序烧进单片机,观察实验板的执行现象。

将上述程序中的P1口改为P2口,完成上面相同的步骤。

②方法二:将灯的状态编写成字符型数组(注意:用来存放字符型数据的数组称为字符型数组),通过循环左移实现。举例如下。

char code a[3]={'H','0','W'};

参考程序流程图如图3.5所示。

图3.5 实验2方法二的参考程序流程图

参考程序如下。

③方法三:用库函数(循环左移)实现。

循环左移示意图如图3.6所示。

图3.6 循环左移示意图

循环左移函数,即库函数_crol_(unsigned char,unsigned char)

如何使用库函数crol_()来实现循环左移呢?

例如:“a=_crol_(a,1);”表示将a左移1位后再赋给a;假设a=0x01,转换为二进制为00000001b,那么执行一次该语句后,a=0x02,即00000010b,……每执行一次,“1”就左移一位。另外,_crol_()函数包含在头文件intrins.h中,所以使用该函数之前一定要先添加该头文件。

参考程序流程图如图3.7所示。

图3.7 实验2方法三的参考程序流程图

参考程序如下。

3)实验3——数码的显示控制程序设计

(1)设计及要求。

设计:从左往右每次点亮1个LED,并在数码管上显示0~F的字形码,当点亮最右边即第6个LED时,再从左往右每次点亮1个LED,点亮每个LED后的延时时间约为200 ms。

要求:通过实验,熟练掌握数组和位控。

(2)解析。

软件延时时间估算方法:为了观察发光二极管循环点亮,需要在点亮每个LED后,延时一段时间。关于延时程序有两种常用的方法:一是用定时器中断来实现,时间控制比较精准,但要占用单片机定时器/计数器硬件资源;二是用软件延时来实现。

例如:假如晶振为12 MHz。一个时钟周期(也称为振荡周期)=(1÷12)μs,即一个机器周期包含12个时钟周期。一个机器周期=12×(1÷12)μs=1μs,执行一条NOP指令需要花费一个机器周期,所以运行一条NOP指令所花费时间是1μs。

(3)参考程序。