实验2 设备状态指示灯的控制——LED灯的控制
一.实训目的
1.掌握51单片机I/O的串行和并行应用方法
2.理解延时函数的作用
3.掌握延时函数的编写方法
4.掌握C51程序结构
二.实训任务与要求
任务1.两位LED灯的闪烁控制(两个LED灯分别为A灯和B灯)
要求:采用串行控制I/O引脚的方法
A灯为引脚低电平时点亮LED灯,B灯为引脚高电平时点亮LED灯
任务2.八个LED灯的控制
要求:八个LED灯连接在一组I/O口上;
采用I/O口并行控制的方法实现八个LED灯的控制;
八个LED灯均采用低电平点亮的电路设计方法;
三.实训过程
任务1.两位LED灯的闪烁控制(两个LED灯分别为A灯和B灯)
步骤1.绘制仿真电路图
电路连接错误示范:
错误连接示范1 错误连接示范2

错误连接示范3 错误连接示范4

错误连接示范5 错误连接示范6

步骤2.建立KEIL工程文件并编写程序代码
点亮方式1,A灯亮,B灯亮,延时1秒,A灯灭,B灯灭,延时1秒,循环执行;
参考程序:
#include<reg51.h> sbit LED1=P1^0; sbit LED2=P1^2; void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main() { while(1) { LED1=0; LED2=1; delay(10); LED1=1; LED2=0; delay(10); } } |
点亮方式2,A灯亮,延时1秒,B灯亮,延时1秒,A灯灭,延时1秒,B灯灭,延时1秒,循环执行;
参考程序:
#include<reg51.h> sbit LED1=P1^0; sbit LED2=P1^2; void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main() { while(1) { LED1=0; delay(10); LED2=1; delay(10); LED1=1; delay(10); LED2=0; delay(10); } } |
点亮方式3,A灯亮,B灯灭,延时1秒,A灯灭,B灯亮,延时1秒,循环执行。
参考程序:
#include<reg51.h> sbit LED1=P1^0; sbit LED2=P1^2; void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main() { while(1) { LED1=0; LED2=0; delay(10); LED1=1; LED2=1; delay(10); } } |
步骤3.常见实验故障及解决方法
LED灯不亮的原因:(1)LED灯方向连接是否正确;(2)限流电阻的阻值是否合适;(3)程序是否成功加载;(4)程序中设置的引脚是否为LED灯所连接的引脚。
步骤4.编程方法拓展
(1)#define宏定义语句
#define ON 1
#define OFF 0
#define宏定义语句可以将1或0用特定的字符表示,这样LED1=ON,即表示LED1=1。使用宏定义语句可以增强程序的可移植性,当电路连接发生变化时,只需改变ON或OFF所表示的数值即可。
(2)“~”是取反逻辑运算符
LED1=~LED1,即将LED1的电平取反,这个运算符可以用在LED灯的闪烁控制程序中,简化程序。
任务2.八个LED灯的控制(流水灯控制,即实现八个LED灯依次轮流点亮)
步骤1.绘制仿真电路图
步骤二.建立KEIL工程文件并编写程序代码
编程方法1:采用直接赋值法
#include <reg51.h> //包含头文件 #define LED P1 //宏定义,即将P1用LED表示 void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main( ) //主函数 { int i; while(1) //循环执行while(1)后{}内的程序段 { for(i=0;i<8;i++) { P1=0xfe; delay(10); //延时1s P1=0xfd; delay(10); //延时1s P1=0xfb; delay(10); //延时1s P1=0xf7; delay(10); //延时1s P1=0xef; delay(10); //延时1s P1=0xdf; delay(10); //延时1s P1=0xbf; delay(10); //延时1s P1=0x7f; delay(10); //延时1s }
} } |
编程方法2:采用移位算法实现
| #include <reg51.h> //包含头文件 #define LED P1 //宏定义,即将P1用LED表示 void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main( ) //主函数 { int i; while(1) //循环执行while(1)后{}内的程序段 { LED=0XFE; delay(500); for(i=0;i<7;i++) { LED=(LED<<1)|0x01; //左移移位,右侧补1 delay(10); //延时1秒 } } } |
编程方法3:采用数组方法实现
#include <reg51.h> //包含头文件 #define LED P1 //宏定义,即将P1用LED表示 char shu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(unsigned char n) //延时n*100毫秒函数(也可称为子程序) { unsigned char a,b,c; for(c=n;c>0;c--) for(b=142;b>0;b--) for(a=200;a>0;a--); } void main( ) //主函数 { int i; while(1) //循环执行while(1)后{}内的程序段 { for(i=0;i<8;i++) { P1=shu[i]; //将数组中的元素赋给P1口 delay(10); //延时1s } } } |
步骤3.常见实验故障及解决方法
流水灯实现过程中,出现个别LED灯未按预想的顺序亮灭,很可能是数值赋值有错误导致的,请同学们务必仔细检查。