找回密码
 立即注册
查看: 232|回复: 0

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

[复制链接]

该用户从未签到

12

主题

7

回帖

82

积分

注册会员

积分
82
发表于 2023-8-17 09:12:24 | 显示全部楼层 |阅读模式
本帖最后由 打酱油的工程师 于 2023-8-18 15:01 编辑

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

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





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















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




闹钟中间有两个点,两个点是不断的闪动,0.5秒点亮0.5秒熄灭0.5秒点亮0.5秒熄灭. 这一亮一灭的过程,利用Delay函数实现LEB的闪烁的过程。 1秒=1000毫秒=1000 000微秒,0.5s=500毫秒=500 000微秒

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

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











  1. <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:






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

如果需要两个等一起闪,修改代码:

  1. <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 执行流程图:




常用死循环while(1). 2.do {

}while();

验证代码
  1. do
  2.                         {
  3.                                 printf("a的值: %d\r\n",a);
  4.                                 a = a + 1;
  5.                         }while( a <20 );
复制代码

改成while循环:
  1.    while( a <20 )
  2.                         {
  3.                                 printf("a的值: %d\r\n",a);
  4.                                 a++;
  5.                         }
复制代码


执行结果:





本例中作用相同。

Tips:a--和--a的区别(--ms 的用法)
测试代码:
  1.    a =10;
  2.                         printf("a的值: %d\r\n",a);
  3.                         printf("a的值: %d\r\n",--a);  //先运算再输出
  4.                         printf("a的值: %d\r\n",a);
  5.                         a =10;
  6.                         printf("a的值: %d\r\n",a);
  7.                         printf("a的值: %d\r\n",a--); //先输出再运算
  8.                         printf("a的值: %d\r\n",a);
复制代码

执行结果:








欢迎大家访问我的CSDN:打酱油的工程师
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-21 21:27 , Processed in 0.059521 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表