- 电子工程师自学宝典:嵌入设计篇
- 蔡杏山编著
- 2461字
- 2022-01-21 14:00:22
4.3 单片机点亮多个LED的电路与程序详解
4.3.1 单片机点亮多个LED的电路
图4-13是单片机(STC89C51)点亮多个LED的电路,当单片机P1端某个引脚为低电平时,LED导通,有电流流过LED,LED点亮,此时LED的工作电流IF=(U-UF)/R=(5-1.5)V/510Ω≈0.007A=7mA。
图4-13 单片机点亮多个LED的电路
4.3.2 采用位操作方式编程点亮多个LED的程序与说明
图4-14是采用位操作方式编程点亮多个LED的程序。接通电源后,单片机P1.0、P1.2、P1.3、P1.4端口外接的LED点亮。
4.3.3 采用字节操作方式编程点亮多个LED的程序与说明
图4-15是采用字节操作方式编程点亮多个LED的程序。
4.3.4 多个LED以不同频率闪烁发光的程序与说明
图4-16是控制多个LED以不同频率闪烁发光的程序。接通电源后,单片机P1.7、P1.5、P1.3、P1.1端口外接的4个LED先以高频率快速闪烁10次,然后以低频率慢速闪烁10次,该过程不断重复进行。
图4-14 采用位操作方式编程点亮多个LED的程序
图4-15 采用字节操作方式编程点亮多个LED的程序
图4-16所示程序的第一个for循环语句使单片机P1.7、P1.5、P1.3、P1.1端口连接的4个LED以高频率快速闪烁10次,第二个for循环语句使这些LED以低频率慢速闪烁10次,主程序中的while循环语句使其首尾大括号内的两个for语句不断重复执行,即让LED快闪10次和慢闪10次不断重复进行。该程序是以字节操作方式编程,也可以使用位操作方式对P1.7、P1.5、P1.3、P1.1端口赋值来编程,具体编程方法可参考图4-14所示的程序。
图4-16 控制多个LED以不同频率闪烁发光的程序
4.3.5 多个LED左移和右移的程序与说明
1.控制多个LED左移的程序
图4-17控制多个LED左移的程序。接通电源后,单片机P1.0端口的LED先亮,然后P1.1~P1.7端口的LED按顺序逐个亮起来,最后P1.0~P1.7端口所有LED全亮。
图4-17 控制多个LED左移的程序
该程序首先给P1赋初值,让P1=FEH=11111110B,P1.0端口输出低电平,P1.0端口连接的LED点亮,然后执行for循环语句,在for语句中,用位左移运算符“<<1”将P1端口数据(8位)左移一位,右边空出的位值用0补充,for语句会执行8次。第1次执行后,P1=11111100,P1.0、P1.1端口的LED点亮;第2次执行后,P1=11111000,P1.0、P1.1、P1.2端口的LED点亮;第8次执行后,P1=00000000,P1所有端口的LED都会点亮。
单片机程序执行到最后时,又会从头开始执行,如果希望程序运行到某处时停止,可使用“while(1){}”语句(或使用“while(1);”),如果while(1){}之后还有其他语句,空{}可省掉,否则空{}不能省掉。图4-17中的主程序最后用while(1){}语句来停止主程序,使之不会从头重复执行,因此P1端口的8个LED全亮后不会熄灭,如果删掉主程序最后的while(1){}语句,LED逐个点亮(左移)到全亮这个过程会不断重复。
2.控制多个LED右移的程序
图4-18是控制多个LED右移的程序。接通电源后,单片机P1.7端口的LED先亮,然后P1.6~P1.0端口的LED按顺序逐个亮起来,最后P1.7~P1.0端口所有LED全亮。
图4-18 控制多个LED右移的程序
该程序与左移程序相同,右移采用了位右移运算符“>>1”,程序首先赋初值P1=7FH=01111111,P1.7端口的LED点亮,然后让for语句执行8次。第1次执行后,P1=00111111,P1.7、P1.6端口的LED点亮;第2次执行后,P1=0001111,P1.7、P1.6、P1.5端口的LED点亮;第8次执行后,P1=00000000,P1所有端口的LED都会点亮。由于主程序最后有“while(1);”语句,故8个LED始终处于点亮状态。若删掉“while(1);”语句,多个LED右移过程会不断重复。
4.3.6 LED循环左移和右移的程序与说明
1.控制LED循环左移的程序
图4-19是控制LED循环左移的程序。单片机P1.7~P1.0端口的8个LED从最右端(P1.0端口)开始,逐个往左(往P1.7端口方向)点亮(始终只有一个LED亮),最左端(P1.7端口)的LED点亮再熄灭后,最右端LED又点亮,如此周而复始。
图4-19 控制LED循环左移的程序
该程序先用P1=P1<<1语句让LED左移一位,然后用P1=P1|0x01语句将左移后的P1端口的8位数与00000001进行位或运算,目的是将左移后最右边空出的位用1填充,左移8次后,最右端(最低位)的0从最左端(最高位)移出,程序马上用P1=0xfe赋初值,让最右端值又为0,然后while语句使上述过程反复进行。“|”为“位或”运算符,在计算机键盘的回车键上方。
2.控制LED循环右移的程序
图4-20是控制LED循环右移的程序。单片机P1.7~P1.0端口的8个LED从最左端(P1.7端口)开始,逐个往右(往P1.0端口方向)点亮(始终只有一个LED亮),最右端(P1.0端口)的LED点亮再熄灭后,最左端LED又点亮,如此周而复始。
图4-20 控制LED循环右移的程序
该程序在右移(高位往低位移动)前,先用P1=0x7f语句将最高位的LED点亮,然后用P1=P1>>1语句将P1的8位数右移一位,执行8次,每次执行后用P1=P1|0x80语句给P1最高位补1,8次执行完后,又用P1=0x7f语句将最高位的LED点亮,接着又执行for语句,如此循环反复。
4.3.7 LED移动并闪烁发光的程序与说明
图4-21是一种控制LED左右移动并闪烁发光的程序。接通电源后,两个LED先左移(即单片机P1.0、P1.1端口的两个LED先点亮),接着P1.1、P1.2端口的LED点亮(P1.0端口的LED熄灭),最后P1.6、P1.7端口的LED点亮,此时P1.0~P1.5端口的LED都熄灭,然后两个LED右移(即从P1.6、P1.7端口的LED点亮变化到P1.0、P1.1端口的LED点亮),之后P1.0~P1.7端口的8个LED同时亮、灭闪烁3次,以上过程反复进行。
图4-21 控制LED左右移动并闪烁发光的程序
该程序中,第一个for语句是使两个LED从右端移到左端,第二个for语句使两个LED从左端移到右端,第三个for语句使8个LED亮、灭闪烁3次,3个for语句都处于while(1)语句的首尾大括号内,故3个for语句反复循环执行。
4.3.8 用查表方式控制LED多种形式发光的程序与说明
图4-22用查表方式控制LED多种形式发光的程序。程序执行后,单片机P1.0~P1.7引脚的8个LED以16种形式变化发光。
该程序首先用关键字code定义一个无符号字符型表格table(数组),在表格中按顺序存放16个数据(编号为0~15)。程序再让for语句循环执行16次,每执行一次将table数据的序号i值加1,并将选中序号的数据赋值给P1端口,P1端口外接LED按表格数值发光。比如for语句第一次执行时,i=0,将表格中第1个位置(序号为0)的数据1FH(即00011111)赋给P1端口,P1.7、P1.6、P1.5端口外接的LED发光,for语句第二次执行时,i=1,将表格中第2个位置(序号为1)的数据45H(即01000101)赋给P1端口,P1.7、P1.5~P1.3和P1.1端口外接的LED发光。
图4-22 用查表方式控制LED多种形式发光的程序
关键字code定义的表格数据存放在单片机的ROM中,这些数据主要是一些常量或固定不变的参数,放置在ROM中可以节省大量RAM空间。table[]表格实际上是一种一维数组,table[n]表示表格中第n+1个元素(数据),比如table[0]表示表格中第1个位置的元素,table[15]表示表格中第16个位置的元素,只要ROM空间允许,表格的元素数量可自由增加。在使用for语句查表时,要求循环次数与表格元素的个数相等,若次数超出个数,则越出表格范围,查到的将是随机数。
4.3.9 LED花样发光的程序与说明
图4-23是LED花样发光的程序。程序执行后,单片机P1.7~P1.0端口的8个LED先往左(往P1.7方向)逐个点亮,全部LED点亮后再熄灭右边的7个LED,接着8个LED往右(往P1.0方向)逐个点亮,全部LED点亮后再熄灭左边的7个LED,然后单个LED先左移点亮再右移点亮(始终只有1个LED亮),之后8个LED按16种形式变化发光。
图4-23 LED花样发光的程序
该程序的第一个for语句将LED左移点亮(最后全部LED都亮),第二个for语句将LED右移点亮(最后全部LED都亮),第三、四个for语句先将一个LED左移点亮再右移点亮(左、右移时始终只有一个LED亮),第五个for语句以查表方式点亮P1端口的LED。本例综合应用了LED的左移、右移、循环左右移和查表点亮LED。