江协科技51单片机学习- p6 LED流水灯

前言:

本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。

引用:

51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili

c51语言变量语句意思,C51中循环语句-CSDN博客

正文:

0. 概述

今天 (2024/06/13)在淘宝上购买了江协科技51单片机开发板套件,就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。

1. LED流水灯

LED闪烁需要使用到延时函数,本节先使用软件延时,在 STC-ISP 软件中,选择“软件延时计算器”,可以选择让STC-ISP生成延时500ms,或者延时200ms的函数。

延时500ms软件软件延时函数

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

延时200ms的软件软件延时函数

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

然后再 main.c 函数中调用软件生成的延时函数来实现LED流水灯效果,依次控制8个LED灯亮灭。

#include <REGX52.H>
#include <intrins.h>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
		P2 = 0xFE;		//1111 1110 
		Delay500ms();
		
		P2 = 0xFD;		//1111 1101 
		Delay500ms();
		
		P2 = 0xFB;		//1111 1011 
		Delay500ms();
		
		P2 = 0xF7;		//1111 0111 
		Delay500ms();
		
		P2 = 0xEF;		//1110 1111 
		Delay500ms();
		
		P2 = 0xDF;		//1101 1111 
		Delay500ms();
		
		P2 = 0xBF;		//1011 1111 
		Delay500ms();
		
		P2 = 0x7F;		//0111 1111 
		Delay500ms();
	}
}

2. 当前延时函数的缺陷

STC-ISP生成延时500ms,或者延时200ms的函数,函数生成的代码的名字会随着延时时间的长短发生改变,当需要修改延时时间的时候就需要对已经写好的程序进行修改替换掉原有的延时函数。

void Delay500ms()    

void Delay200ms()    

我们希望能够控制延时函数延时的长短,先让STC-ISP生成一个延时时间为 1毫秒的软件延时函数,然后对这个函数进行修改,给函数添加形参,通过传入实参的值控制延时多少个 1毫秒,来实现延时任意毫秒数的功能。

 STC-ISP生成一个延时时间为 1毫秒的软件延时函数

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

对该函数进行修改,给函数添加形参,通过形参的值控制循环多少个1毫秒,从而实现了延时指定数量毫秒的功能。

void Delay1ms(unsigned int ms)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();

	while(ms){
	    i = 2;
	    j = 199;
		do
		{
			while (--j);
		} while (--i);
		
		ms--;
	}
}

3. 烧录下载验证程序

最终版本LED流水灯实验程序

#include <REGX52.H>
#include <intrins.h>

void Delay1ms(unsigned int ms)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	
	
	while(ms){
		i = 2;
		j = 199;
		
		do
		{
			while (--j);
		} while (--i);
		
		ms--;
	}
}

void main()
{
	unsigned char i = 8;
	
	while(1)
	{
		i = 8;
		do{
			P2 = ~(1 << i);
			Delay1ms(200);
		}while(i--);
	}
}

烧录下载验证程序,验证结果正常,8个LED按照顺序依次亮灭实现LED流水灯的效果。

4. 总结和实验遇到的问题记录

4.1 问题1:修改了带有参数的 'delay1ms(unsigned int ms)' 延时函数之后,没有实现指定的延时

问题原因是如下代码写错,没有把对变量“i,j”的赋值写到循环体的内部,这样在第一次循环之后,变量 i 和 j 的值就变为负值了(这样延时函数行为就不正确了),需要每次最外层循环是对i,j重新赋值。

正确的行为是:每次循环下一次1毫秒延时,需要对i,j重新赋值

5. 结束

本文至此结束 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值