打酱油的工程师 发表于 2023-8-17 09:12:24

学习笔记|基于Delay实现的LED闪烁|STC32G冲哥视频|第6集:实现LED闪烁

本帖最后由 打酱油的工程师 于 2023-8-18 15:01 编辑

摘要
1.基于Delay实现的LED闪烁 2.函数的使用 3,新建文件,使用模块化编程

软件更新
打开时会提示有版本更新,需要及时更新为最新版本。选择立即下载,选择保存路径,运行。 目前最新的是6.92a版本,选择可执行文件,发送到桌面快捷方式。



https://pica.zhimg.com/80/v2-8fb0b883c7e1df9d3ca47cee36200868_720w.jpg?source=d16d100b​

新版软件,资料下载里下载最新版手册(8-15):



https://pic1.zhimg.com/80/v2-1e04a333c5cb46e00ef961410eae9549_720w.jpg?source=d16d100b​









https://picx.zhimg.com/80/v2-70baeb297bf1fda5dd8f9e06a6d37b1d_720w.jpg?source=d16d100b​

什么是闪烁
根据百度百科释义。 闪烁是一个汉语词语,拼音:shǎn shuò。释义:指光亮晃动不定、忽明忽暗;(说话)稍微露出一点想法,但不肯说明确;物体忽隐忽现,变动不定;显露,现出。出自南朝·梁·王僧孺《中寺碑》:“日流闪烁,风度清锵。” 1.基于Delay实现的LED闪烁



https://picx.zhimg.com/80/v2-e7b0eaf34c0c41d732ded4936f598217_720w.jpg?source=d16d100b​
闹钟中间有两个点,两个点是不断的闪动,0.5秒点亮0.5秒熄灭0.5秒点亮0.5秒熄灭. 这一亮一灭的过程,利用Delay函数实现LEB的闪烁的过程。 1秒=1000毫秒=1000 000微秒,0.5s=500毫秒=500 000微秒

复制示例工程,改名为LED闪烁,添加以下语句:

#define MAIN_Fosc 24000000UL ////定义IRC系统时钟24M,方便下载时选择,定义的名称写在前面。
定义IRC系统时钟,方便下载时选择,方便查看和修改。ISP中IRC频率和系统时钟的IRC频率应该保持一致,防止程序出现错误。



https://picx.zhimg.com/80/v2-b7ce54265f8025d4a0b7636721bb5800_720w.jpg?source=d16d100b​






https://pica.zhimg.com/80/v2-f2c1af930febaf52b95569fa6006c26e_720w.jpg?source=d16d100b​
<div style="text-align: left;">void delay_ms(u16 ms)</div><div style="text-align: left;">{</div><div style="text-align: left;">u16 i;</div><div style="text-align: left;">do{</div><div style="text-align: left;">i = MAIN_Fosc / 6000;</div><div style="text-align: left;">while(--i);</div><div style="text-align: left;">}while(--ms);</div><div style="text-align: left;">}</div>
Tips:u16是什么?
选中u16,右键选中:Go To Definition Of "u16',转至u16的定义头文件stc.h:



https://pic1.zhimg.com/80/v2-192f5dde3107f40603515c55ce2f97ee_720w.jpg?source=d16d100b​


typedef unsigned int u16; //定义的名称写在后面,开头无“#”号,末位加“;”号。
我们的编译器(也就是这个KEIL C251)会把我们写的"u16"替换成“ unsigned int”。
取值范围是:u16 取值0-65535。
之后采用do...while循环:
do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
//主while循环中加入延时代码,实现闪烁
               P22 = 0; //设置低电平      (屠龙刀三板载led)
               delay_ms(500);
               P22 = 1; //设置低电平      (屠龙刀三板载led)
               delay_ms(500);
如果需要两个等一起闪,修改代码:

<blockquote><span style="white-space: normal;"><span style="white-space:pre">                </span> P22 = 0; //设置低电平<span style="white-space:pre">      </span>(屠龙刀三板载led)</span>
delay很方便,但需要等待踏步结束后,才能接着往下走。

语法分析:
1.while 执行流程图:



https://picx.zhimg.com/80/v2-4f977b970ca82ece2b1bc6ac3ab0d79f_720w.jpg?source=d16d100b​
常用死循环while(1). 2.do {

}while();

验证代码
do
                        {
                              printf("a的值: %d\r\n",a);
                              a = a + 1;
                        }while( a <20 );
改成while循环:
   while( a <20 )
                        {
                              printf("a的值: %d\r\n",a);
                              a++;
                        }

执行结果:



https://picx.zhimg.com/80/v2-17fb09634c78f2b09b485c986218c4ec_720w.jpg?source=d16d100b​

本例中作用相同。

Tips:a--和--a的区别(--ms 的用法)
测试代码:
   a =10;
                        printf("a的值: %d\r\n",a);
                        printf("a的值: %d\r\n",--a);//先运算再输出
                        printf("a的值: %d\r\n",a);

                        a =10;
                        printf("a的值: %d\r\n",a);
                        printf("a的值: %d\r\n",a--); //先输出再运算
                        printf("a的值: %d\r\n",a);
执行结果:



https://picx.zhimg.com/80/v2-df0effbd29aaa23ed623177f48b95e91_720w.jpg?source=d16d100b​




页: [1]
查看完整版本: 学习笔记|基于Delay实现的LED闪烁|STC32G冲哥视频|第6集:实现LED闪烁