找回密码
 立即注册
楼主: 18729***

冲哥单片机视频学习打卡

[复制链接]

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 18:24:38 | 显示全部楼层
本帖最后由 1872978045 于 2023-5-31 21:05 编辑

第六集(下):
总结
define格式:define 名称 需要定义的内容
一、函数的使用
三个步骤:定义——声明——调用
在模块化编程里,函数使用分为如下三步:
1:函数定义
        返回值 函数名称(入口参数)

        {
              函数要执行的功能
        }
         @返回值: 没有返回值就是void
         @函数名称:避开关键词,不重复,非特殊字符随便取
         @入口参数:类型+名称,多个参数“,”分开,空就写void
2.函数声明
        返回值 函数名称( 入口参数 );
3.函数调用
        函数名称(入口参数 ):

函数一般写在后面,然后再主函数前面声明一下
二、新建文件、使用模块化编程
模块化编程使程序整体更加清晰



新建xxx.c和xxx.h文件,代表一个功能块
xxx.h格式:
       #ifndef__XXX_H
       #define__XXX_H
       调用头文件
       函数声明...
       #endif
xxx.c格式
       #include “xxx.h”
       函数定义


添加文件一定要记得引用路径和添加到工程里
步骤:
新建一个.c文件和一个.h文件,取名避开关键词,文件后缀名不要输错,推荐一个.c文件跟着一个.h文件
在.h文件内输入格式

#ifndef__MATH_H   //如果没有定义
#define__MATH_H

int Add(int parm1,int parm);           //函数声明
#endif


.c文件内输入调用格式
#include “math.h”

int Add(int parm1,int parm)         //函数定义
{
    return parm1+parm2;
}


然后主程序顶部引用math.h
#include"math.h"

引用路径:在Options for Target中点击C251标签,然后点击include paths 引用一下.c和.h所在的文件夹

添加到工程里:双极左侧的Source Group 1,然后把math.c添加到工程里


模块化编程好处:
主函数看起来非常清晰,一目了然
在做一个大型项目时,可以只编写自己的这一部分,如果中间需要什么算法可以让同事写,写完之后调用就行了


小结:
熟悉while的循环过程
学会函数的使用(定义——声明——调用)
学会新建文件,添加文件路径和添加到工程
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 18:40:49 | 显示全部楼层
本帖最后由 1872978045 于 2023-6-1 15:40 编辑

第七集(上):
总结
一、按键的原理
按键原理非常简单,本质上就是两个脚或者四个脚、但是两个脚之间一定是有一个开关一样的元件,有的是按下之后两个脚导通,有的是按下之后断开
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下断开,所以在开关闭合及断开的瞬间会伴随抖动
二、按键的代码实现过程
if(KEY == 0)     //判断是否按下
{
   Delay_ms(10);   //延时
   if(KEY == 0)    //再次判断是否按下
  {
  执行功能
  }
}

另一种形式


if(KEY == 0)     //判断是否按下
{
   Delay_ms(10);   //延时
while( KEY==0)
执行功能
}

三、按键的应用
1、按键按下LED灯点亮,松开熄灭

  核心程序
  if(KEY == 0)     //判断是否按下
{
   Delay_ms(10);   //延时
   if(KEY == 0)    //再次判断是否按下
  {
  P60 = 0;
  }
}
esle
{
  P60 = 1;
}

2、按键按下LED灯点熄灭,松开点亮

  if(KEY1 == 0)     //判断是否按下
{
   Delay_ms(10);   //延时
   if(KEY1 == 0)    //再次判断是否按下
  {
  P67 = 1;
  }
}
esle
{
  P67 = 0;
}

3、按键按下一次,LED状态改变一次

if(KEY2 == 0)     //判断是否按下
{
   Delay_ms(500);   //延时
   if(KEY2 == 0)    //再次判断是否按下
  {
  P67 = !P67;
Delay_ms(500);
while(KEY2 == 0)
   {

   }
  }
}

4、按键按下并松开之后,LED状态改变一次

if(KEY2 == 0)     //判断是否按下
{
   Delay_ms(500);   //延时
   if(KEY2 == 0)    //再次判断是否按下
  {

while(KEY2 == 0)
   {

   }


  P67 = !P67;
Delay_ms(500);

  }
}




按下一次状态取反可以用!
疑问:
按键开关要消抖,拨码开关要消抖吗?

回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 19:00:04 | 显示全部楼层
本帖最后由 1872978045 于 2023-6-1 15:59 编辑

第七集(下):
总结
三、按键的应用
5、按键按下一次,LED往左边走一个

P6 = 0xfe;

if(KEY2 == 0)     //判断是否按下
{
   Delay_ms(500);   //延时
   if(KEY2 == 0)    //再次判断是否按下
  {
  P6 = ((P6<<1)+1);   //每次左移一位,并且最低位加一
if (P6 =0Xff)       //如果一次循环结束,则给P6重新赋值0XFE
P6 =0Xfe;

Delay_ms(500);
while(KEY2 == 0);
  }
}

6、按键按下一次,LED往右边走一个


P6 = 0x7f;

if(KEY2 == 0)     //判断是否按下
{
   Delay_ms(500);   //延时
   if(KEY2 == 0)    //再次判断是否按下
  {
  P6 = ((P6>>1)+256);   //每次左移一位,并且最高位加一
if (P6 =0Xff)       //如果一次循环结束,则给P6重新赋值0X7F
P6 =0X7f;

Delay_ms(500);
while(KEY2 == 0);
  }
}


四、数组的使用
数组使用分为如下两步:
1.定义:   类型   名称 [长度] = {数值};
2.使用:   赋值:   名称[索引] = 数值
使用数组实现流水灯核心函数:
u8  led_data[8] ={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
u8 num = 0;
P6 = led_data[num];
delay_ms(500);
num++;
if(num>7)
  num = 0;


数组从0开始并且使用过程中千万要保证数组不要越界


回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 19:24:37 | 显示全部楼层
本帖最后由 1872978045 于 2023-6-1 16:33 编辑

第八集
总结:

一、认识蜂鸣器

区别
1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫,而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
2、价格不同,有源蜂鸣器要比无源蜂鸣器贵,贵在里面多了震荡源


二、控制原理
1.png

P54引脚给高电平关闭
P54引脚给低电平打开

核心程序:
#define BEEP P53

if(KEY == 0)     //判断是否按下
{
   Delay_ms(10);   //延时
   if(KEY == 0)    //再次判断是否按下
  {
  while( KEY == 0)
   BEEP =!BEEP;
  }
}

三、蜂鸣器实战应用
test.c文件内容:

#include“test.h”
bit Run_Flag =0;
u8 Run_Mode = 0;
void Test(void)
{
    if( KEY1 == 0 )
         delay_ms(10);
             if( KEY1 == 0)
             {
                while( KEY1 == 0 );
                  if( Run Flag==0)
                  {
                  Run_Flag = 1;
                  BEEP = 0;
                  delay_ms(10);
                  BEEP = 1;
                  P40= 0;
                  P6 = 0X00;
                  delay_ms(200);
                 P6 = 0XFF;
                  }
                else
               {
                  Run_flag =1;
                  BEEP = 0;
                  Delay_ms(10);
                  BEEP = 1;

                  p6 = 0XFF;
                 }
            }
          }
if (KEY2==0)
{
     delay_ms(10);
     if (KEY2==0);
     {
     while(KEY2 == 0);

                  BEEP = 0;
                  Delay_ms(10);
                  BEEP = 1;

                  Run_Mode++;
                  if(Run_Mode>8)
                  Run_Mode =1;

       P6=~(1<<(Run_Mode-1));
     }
}


void delay_ms(ul6 ms)
{
u16 i;
do
{
i = MAIN Fosc/6000;
}while(--i);
while(--ms);

}


1、了解蜂鸣器怎么使用
2、尝试去使用蜂鸣器
疑问
Run_Mode左移一位用1<<Run_Mode和 Run_Mode<<1都行吗
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 19:33:54 | 显示全部楼层
本帖最后由 1872978045 于 2023-6-1 16:48 编辑

第八集作业
核心程序:
#include“test.h”
bit Run_Flag =0;
u8 Run_Mode = 0;
bit Run_now = 0;
void Test(void)
{
    if( KEY1 == 0 )
         delay_ms(10);
             if( KEY1 == 0)
             {
               
                  if( Run Flag==0)
                  {
                  Run_Flag = 1;
                  BEEP = 0;
                  delay_ms(10);
                  BEEP = 1;
                  P40= 0;
                  P6 = 0X00;
                  delay_ms(200);
                 P6 = 0XFF;
                  }
                else
               {
                  Run_flag =1;
                  BEEP = 0;
                  Delay_ms(10);
                  BEEP = 1;
                 Run_now = 0;
                  p6 = 0XFF;
                 }
               while( KEY1 == 0 );
            }
}
if (KEY2==0)
{
     delay_ms(10);
     if (KEY2==0);
     {
                  if(Run_now==0)
                   {
                  BEEP = 0;
                  Delay_ms(10);
                  BEEP = 1;

                  Run_Mode++;
                  if(Run_Mode>8)
                    Run_Mode =1;

       P6=~(1<<(Run_Mode-1));
                   }
     }
     while(KEY2 == 0);
}


if (KEY2==0)
{
     delay_ms(10);
     if (KEY2==0);
     {


       if(Run_Mode>0)
        {
        BEEP = 0;
        Delay_ms(10);
       BEEP = 1;
       Run_now=!Run_now;
       }
     while(KEY2 == 0);
     }
  if(Run_Mode == 1);
  {
     P6 = 0XFF;
     delay_ms(500);
     P6=~(1<<(Run_Mode-1));
     delay_ms(500);

  }
else
  {
       P6=~(1<<(Run_Mode-1));

  }

}

void delay_ms(ul6 ms)
{
u16 i;
do
{
i = MAIN Fosc/6000;
}while(--i);
while(--ms);

}





bit类型变量只有0和1
定义——声明——调用
定义按键,理清逻辑,边测试代码边修改
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 20:00:02 | 显示全部楼层
第九集:
总结
数码管由多个发光二极管组成,理论可以显示任意的字符或者图案
数码管分为共阳极连法和共阴极连法,尾缀A为共阳,K为共阴,写程序之前要先辨别是共阴还是共阳

回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

22

回帖

93

积分

注册会员

积分
93
 楼主| 发表于 2023-5-29 20:18:17 | 显示全部楼层
第十集
总结:
动态刷新延时不能太短,实际上是4个数码管循环点亮熄灭
显示的段码可以构建一个数组,方便调用

疑问
视频里用define定义延时变量,可以用u4 吗

点评

楼主学习精神可嘉,可至https://www.stcaimcu.com/forum.php?mod=viewthread&tid=438&extra=page%3D1发表提问,有专业大佬来授业解惑  详情 回复 发表于 2023-5-30 09:22
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-13 11:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    337

    回帖

    1653

    积分

    版主

    积分
    1653
    发表于 2023-5-30 09:22:34 | 显示全部楼层
    1872978045 发表于 2023-5-29 20:18
    第十集
    总结:
    动态刷新延时不能太短,实际上是4个数码管循环点亮熄灭

    楼主学习精神可嘉,可至冲哥32位8051视频教程疑问解答贴 - 开源广场及教学视频交流 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)发表提问,有专业大佬来授业解惑
    QQ:2269694595     微信:18106296594
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    3

    主题

    22

    回帖

    93

    积分

    注册会员

    积分
    93
     楼主| 发表于 2023-5-30 16:23:27 | 显示全部楼层
    第十一集
    总结
    定时器是定时器和计数器的统称
    设置为定时器时,可以实现硬件计时
    可以代替长时间的delay,提高cpu的运行效率和处理速度
    C/T位为1时计数,为0是定时
    设置步骤:先设置功能为定时器或者计数器——然后如果再定时器模式下,设置不分频和12分频(默认12分频)——设置定时器工作模式——定时器设置——打开中断
    定时时间计算
    定义中断函数后面要加上interrupt+中断号
    中断函数可以直接通过ISP软件生成
    中断频率越低越好
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 22:31 , Processed in 0.070133 second(s), 62 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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