前言:
本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。
引用:
51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili
正文:
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. 结束
本文至此结束