实现流程:
1. 新建一个工程(新项目) 2. 查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚 3. 编写程序(通过查看原理图可以看到我们需要控制整个P2口以控制8个LED灯) 4. 编译程序,下载程序至开发板 5. 查看效果(调试)
进制转换表(因为单片机首先处理的是十六进制的数据,所以我们需要将二进制控制需求转换成十六进制去写代码):
控制代码:
#include <REGX52.H> //头文件
#include "Delay.h"
#include "intrins.h"
/* -------------------------------------------------------
项目名称:流水灯
I/O引脚:P2口(8个引脚)
----------------------------------------------------------*/
unsigned int yanchi = 100; //延时函数参数
unsigned char code Stream_light_array[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯数组(方法二)
void Way_1(); //流水灯控制方法一
void Way_2(); //流水灯控制方法二
void Way_3(); //流水灯控制方法三
void Way_4(); //流水灯控制方法四
void Way_5(); //流水灯控制方法五
int main()
{
Delay_ms(500);
while(1)
{
Way_1();
Way_2();
Way_3();
Way_4();
Way_5();
}
}
/*--------------------------------------------------------
名称:流水灯控制方法五
功能:通过移位指令(且或上0x01)将LED实现流水灯效果
----------------------------------------------------------*/
void Way_5()
{
int i;
P2 = 0xFE;
Delay_ms(500);
for(i=0;i<7;i++)
{
P2=P2 << 1;
P2 = P2 | 0x01;
Delay_ms(500);
}
}
/*--------------------------------------------------------
名称:流水灯控制方法四
功能:LED灯依次左移一位(依次点亮)
----------------------------------------------------------*/
void Way_4()
{
int i;
P2 = 0xFE;
Delay_ms(500);
for(i=0;i<7;i++)
{
P2 = P2 << 1;
Delay_ms(500);
}
P2 = 0xFF;
Delay_ms(500);
}
/*--------------------------------------------------------
名称:流水灯控制方法三
功能:C52 提供了 _crol_(字符循环左移);_cror_ (字符循环右移)
等库函数,包含在头文件intrins.h中 ;
----------------------------------------------------------*/
void Way_3()
{
int i;
P2 = 0xFE;
Delay_ms(500);
for(i=0;i<7;i++)
{
P2=_crol_ (P2,1);
Delay_ms(500);
}
}
/*--------------------------------------------------------
名称:流水灯控制方法二
功能:用数组循环方式控制流水灯
----------------------------------------------------------*/
void Way_2()
{
int i = 0;
for(i = 0;i < 8; i++)
{
P2 = Stream_light_array[i];
Delay_ms(500);
}
}
/*--------------------------------------------------------
名称:流水灯控制方法一
功能:用十六进制赋值方式控制流水灯
----------------------------------------------------------*/
void Way_1()
{
P2 = 0xFE; //D1
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xFD; //D2
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xFB; //D3
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xF7; //D4
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xEF; //D5
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xDF; //D6
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0xBF; //D7
Delay_ms(yanchi);
P2 = 0xFF;
P2 = 0x7F; //D8
Delay_ms(yanchi);
P2 = 0xFF;
}
延时代码C文件
#include "Delay.h"
/*--------------------------------------------
名称:延时函数
功能:Ms延时
----------------------------------------------*/
void Delay_ms(unsigned int xms)
{
unsigned int j,k;
for(j = xms; j > 0; j--)
for(k = 113; k > 0;k--);
}
延时代码H文件
#ifndef __Delay_H_
#define __Delay_H_
void Delay_ms(unsigned int xms); //延时函数
#endif
注意事项:
-
这里要注意勾选HEX这个选项,否则不会生成hex文件(因为我们下载程序使用的是Hex文件)
-
在使用代码中的方法二时一定要记得添加头文件 #include “intrins.h”
-
这里开始使用了模块化编程(模块化中的延时代码已放在代码下面,使用记得要添加 .h 文件)
实现效果:
项目总结: