点亮LED小灯作为一项最简单的应用,可以帮助大家理解单片机工作方式,学会操控某些I/O口的电平。
学习开发板的LED一般采用共阳的连接方式,LED所需电流较小,可直接由单片机I/O口提供。控制I/O输出低电平,LED小灯两端即会产生电势差,从而点亮。
本次实验内容:
1.使 LED1 亮灭;
2.LED1 闪烁(delay);
3.流水灯(>、while、for、delay)
(1)从 LED1 到 8 按顺序亮
(2)流两个来回
(3)从 LED1 开始每次亮两个灯循环
(4)LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。
4.更多有趣设计!!!
参考代码:
(参考代码格式相对标准易读,适合大家学习、理解。但并非最简单的代码)
1.使 LED1 亮灭;
/**************************************************************************************
*使 LED1 亮*
实现现象:下载程序后D1指示灯点亮
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
sbit led=P2^0; //将单片机的P2.0端口定义为led
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
while(1)
{
led=0; //P2.0端口设置为低电平
}
}
2.LED1 闪烁(delay);
/**************************************************************************************
*LED闪烁实验 *
实现现象:下载程序后D1指示灯闪烁
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0; //将单片机的P2.0端口定义为led
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
while(1)
{
led=0;
delay(50000); //大约延时500ms
led=1;
delay(50000); //大约延时500ms
}
}
3.流水灯
(1)从 LED1 到 8 再从8到1流两个来回
方法一:
/*******************************************************************************
*LED流水灯实验*
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
********************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将P2口定义为led 后面就可以使用led代替P2口
/******************************************************************************
函 数 名: delay 函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/******************************************************************************
* 函 数 名: main 函数功能: 主函数
*******************************************************************************/
void main()
{
u8 i,k;
for(k=0;k<2;k++)
{
for(i=0;i<7;i++) //将led左移一位
{
led=_crol_(led,1);
delay(50000); //大约延时500ms
}
for(i=0;i<7;i++) //将led右移一位
{
led=_cror_(led,1);
delay(50000); //大约延时500ms
}
}
while(1);
}
方法二:
/*******************************************************************************
*LED流水灯实验*
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
********************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将P2口定义为led 后面就可以使用led代替P2口
/******************************************************************************
函 数 名: delay 函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/******************************************************************************
* 函 数 名: main 函数功能: 主函数
*******************************************************************************/
void main()
{
u8 i,k;
for(k=0;k<2;k++)
{
for(i=0;i<7;i++)
{
led=~(0x01<<i); //将0000 0001左移i位,然后将结果取反赋值到P2口
delay(50000); //大约延时500ms
}
for(i=0;i<7;i++)
{
led=~(0x80>>i); //将1000 0000右移i位,然后将结果取反赋值到P2口
delay(50000); //大约延时500ms
}
}
while(1);
}
方法三:
小笨蛋专用:一个灯一个灯分开定义,按亮灭顺序写一大长串代码。不建议使用,看起来太呆啦!!
(2)从 LED1 开始每次亮两个灯循环
/*******************************************************************************
*LED双流水灯实验*
实现现象:下载程序后LED呈现双流水灯效果进行左移右移滚动
********************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将P2口定义为led 后面就可以使用led代替P2口
/******************************************************************************
函 数 名: delay 函数功能: 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/******************************************************************************
* 函 数 名: main 函数功能: 主函数
*******************************************************************************/
void main()
{
u8 i,k;
for(k=0;k<2;k++)
{
for(i=0;i<6;i++)
{
led=~(0x03<<i); //将0000 0011左移i位,然后将结果取反赋值到P2口
delay(50000); //大约延时500ms
}
for(i=0;i<6;i++)
{
led=~(0xc0>>i); //将1100 0000右移i位,然后将结果取反赋值到P2口
delay(50000); //大约延时500ms
}
}
while(1);
}
(3)LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。
/*******************************************************************************
*LED控制实验*
实现现象:LED1.3.5.7 亮 0.5s 灭 0.5s,2.4.6.8 亮 0.5s 灭 0.5s,全亮 0.5s 全 灭 0.5s,循环。
********************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将P2口定义为led 后面就可以使用led代替P2口
/******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
delay(50000); //大约延时500ms
while(1)
{
led=0xaa; //将1010 1010赋值到P2口
delay(50000); //大约延时500ms
led=0xff; //将1111 1111赋值到P2口
delay(50000); //大约延时500ms
led=0x55; //将0101 0101赋值到P2口
delay(50000); //大约延时500ms
led=0xff; //将1111 1111赋值到P2口
delay(50000); //大约延时500ms
led=0x00; //将0000 0000赋值到P2口
delay(50000); //大约延时500ms
led=0xff; //将1111 1111赋值到P2口
delay(50000); //大约延时500ms
}
}
无线电小组——TZ