找回密码
 立即注册
查看: 2875|回复: 27

【已送实验箱】LED点灯学习

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-23 16:39:11 | 显示全部楼层 |阅读模式
本帖最后由 国学芯用 于 2024-1-10 11:58 编辑

stc官方视频讲的真好,跟着冲哥视频学习,很轻松。
第四集   建立工程点亮第一颗灯
1、IO操作
  批量操作 PO是一组GPIO口, P0=0X00;
  P0.0是一组的其中一个GPIO口, P01=P0^1;
2、相关寄存器定义
   SFR  P4 =0XC0;
  SFR   P4M1 = 0XB3;
  SFR   P4M0 = 0XB4;
3、设置IO工作模式
    P4M1=0X00;
    P4M0=0X00;
    设置P4口全为准双向口。
4、typedef  unsigned  char  byte  给unsigned char 取别名,用到他的地方可以用BYTE代替。

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-25 19:28:03 | 显示全部楼层
第5讲 C语言运算符和进制之间转换

转义字符
\n :换行符
\r :回车
及其他字符。
printf("当前温度:%3.3f\n\r",11.2)   //输出当前温度:11.200.  
printf("%c",53) // 显示字符5. 53对应字符是5.
二进制  
逢2进1 ,例如:数字2写成10,3写成11。
十六制
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11-19,1A等。
c语言运算符号
printf("%u %u",100/99,100%99) //输出为1,1.
printf(u"%\r\n",2<<1)//输出为2.
printf(u"%\r\n",0x11&0x10)//输出为0x10.
. 1.jpg
2.png

3.png



4.png
7.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-06-19 07:57:00

114

主题

2028

回帖

5827

积分

论坛元老

积分
5827
发表于 2023-12-24 14:00:59 | 显示全部楼层
记得当年入门单片机,用的是AT89C51,没有P4口,所以不用自己自定义P4口寄存器。点个灯,简单得很。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-26 11:26:07 | 显示全部楼层
第六集视频
1、Delay延时函数
  1秒=1000毫秒=1000000微妙
延时函数
#define  MAIN_FOSC    24000000UL //主时钟
void  delay_ms (u16ms)
{
  u16 i;
      do{
            i=MAIN_FOSC/6000 ;
            while(--i);          }while(--ms);
}

2、while 和do while  用法
    while:先判断,再执行内部语句。
    do  while  :先执行内部语句,再进行while判断。


3、使用模块化编程。
     XXX.h格式
            #ifndef  _xxx_H
            #define  _xxx_H
            调用头文件
            函数申明........
            #endif


      XXX.C 格式
      #include"xxx.h "
      函数定义
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-26 11:26:07 | 显示全部楼层
第六集视频
1、Delay延时函数
  1秒=1000毫秒=1000000微妙
延时函数
#define  MAIN_FOSC    24000000UL //主时钟
void  delay_ms (u16ms)
{
  u16 i;
      do{
            i=MAIN_FOSC/6000 ;
            while(--i);          }while(--ms);
}

2、while 和do while  用法
    while:先判断,再执行内部语句。
    do  while  :先执行内部语句,再进行while判断。
9.jpg

3、使用模块化编程。
     XXX.h格式
            #ifndef  _xxx_H
            #define  _xxx_H
            调用头文件
            函数申明........
            #endif


      XXX.C 格式
      #include"xxx.h "
      函数定义
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:434
  • 最近打卡:2025-06-19 08:08:09

46

主题

390

回帖

1740

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1740
发表于 2023-12-26 19:11:39 | 显示全部楼层
回帖仅作者可见,小心判定你灌水封号
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-29 12:00:09 | 显示全部楼层
reng*** 发表于 2023-12-26 19:11
回帖仅作者可见,小心判定你灌水封号

明白了,马上改,非常感谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2023-12-29 12:12:49 | 显示全部楼层
171412*** 发表于 2023-12-29 12:00
明白了,马上改,非常感谢!

请教下怎么改
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2024-1-3 09:06:26 | 显示全部楼层
第7集  按键点灯
1、按键原理
   对于机械开关,当机械触电断开、闭合时,由于机械触点的弹性动作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。单片机引脚检测按键信号,一般都需要对按键动作信号进行延时消抖,一般时间大约5-10mS.
   按键的代码举例说明:
    if(KEY==0)
    {
       Delay_ms(10);
        if(KEY==0)
        {
           执行功能  
        }
    }
2、按键的应用
    2.1、 按键按下 LED点灯,松手熄灭。
            举例
                 if(KEY2==0)
                  {
                    delay_ms(10);
                      if(KEY2==0)
                       {
                         printf("按键P33已按下\r\n") ;
                          P67=0;
                        }
                 }
                    else
                        {
                          P67=1;
                         }

    2.2、 按键按下LED熄灭,松松点灯。
                     if(KEY2==0)
                  {
                    delay_ms(10);
                      if(KEY2==0)
                       {
                         printf("按键P33已按下\r\n") ;
                          P67=1;
                        }
                 }
                    else
                        {
                          P67=0;
                         }



    2.3、按键按下一次,LED灯状态改变一次。
                   if(KEY2==0)
                  {
                      delay_ms(10);
                      if(KEY2==0)
                       {
                          while(KEY2==0)//松手检测
                          {
                           };
                          printf("按键P33已按下,LED取反一次\r\n") ;

                          P67=!P67;
                       }
                 }
                    
    2.4按键按下一次,LED往左边走一个。
     led灯点亮位
     1111  1110  //0XFE
     1111  1101  //左移一位,后面的位自动补0,需要在此位加1.
     1111  1011  //0XFB
     1111  0111  //0xF7
     1110  1111  //0XEF
     1101  1111  //0XDF
     1011  1111  //0XBF
     0111  1111  //0X7F
     举例
      viod  main()   
      {
            
           u8 LED_Data=0xFE;   
            P6=LED_Data;
            while(1)
             {   
                  if(KEY2==0)
                  {
                      delay_ms(10);
                      if(KEY2==0)
                       {
                         LED_Data=((LED_Data<<1)+1);  
                           if(  LED_Data=0xff)
                           {
                              LED_Data=0xfe;
                            }   
                          printf("按键P33已按下,LED取反一次\r\n") ;

                          P6=LED_Data;
                          while(KEY2==0)
                           {

                             }
                       }
                   }

               }
      }

数组的使用
  数组使用分为两步
1、、定义
         类型  名称[长度]={数值};
2、使用
         赋值  名称[ 索引]=数值

举例

     led灯点亮位
     1111  1110  //0XFE
     1111  1101  //0XFD
     1111  1011  //0XFB
     1111  0111  //0xF7
     1110  1111  //0XEF
     1101  1111  //0XDF
     1011  1111  //0XBF
     0111  1111  //0X7F
     举例
      viod  main()   
      {
           u8 num=0;
           u8 LED_Data=0xFE;
           u8 LED_DataTab[8]={  0XFE,0XFD,0XFB,0XF7 ,0XEF,0XDF,0XBF,0X7F };
            P6=LED_Data;
            while(1)
             {  
                P6=LED_DataTab[num];
                delay_ms(500);
                num++;
                 if(num>7)
                 {
                   num=0;
                   LED_DataTab[1]=0xFE;//改变数组第1个元素值由0XFD变成0XFE。
                 }
             }

      }


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-04-02 20:10:12

21

主题

80

回帖

1343

积分

金牌会员

积分
1343
发表于 2024-1-3 17:17:35 | 显示全部楼层
第八集  蜂鸣器的应用

1、蜂鸣器分有源蜂鸣器和无源蜂鸣器。有源蜂鸣器内部有自带震荡源,通电会叫。无源蜂鸣器内部无震荡源,直接通电不会叫。有源蜂鸣器价格比无源蜂鸣器价格贵。
2、蜂鸣器实战应用
     例题   2.1、按键1按下,蜂鸣10ms,LED1-8全部点亮200ms在熄灭,表示开机。
              2.2、 开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
              2.3、开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。

/*********2.1,2.2,2.3题目部分程序*******
      bit RUN_NOW;//执行动作变量
      bit  RUN_Flag;  //此变量值只有0和1
      RUN_Flag=0;   //开关机变量
      u8  RUN_mode;//模式1-8
        void  Test(void)
         {
            if(KEY1==0)
             {
                 Delay_ms (10);
                  if(KEY1==0)
                   {
                      RUN_Flag=1;//开机变量变1
                       BEEP=0;
                       Delay_ms(10);
                       BEEP=1;
                       P40=0;
                       P6=0X00;
                       Delay_ms(200);
                       P6=0XFF;
                     }
                  else
                   {
                      RUN_Flag=0;//  关机复位
                       BEEP=0;
                        Delay_ms(10);
                        BEEP=1;
                        P6=0XFF;
                       RUN_mode=0;
                       RUN_NOW=0;
                   }

                }
         }
   
if(KEY2==0)
{

           Delay_ms (10);
                if(KEY2==0)
                   {
                       BEEP=0;
                       Delay_ms(10);
                       BEEP=1;
                       RUN_mode++;    //模式选择
                       if(  RUN_mode>8)   //如果模式大于8
                       RUN_mode=1;        //回到模式1
                       P6=~(<<(RUN_mode-1));
                       Delay_ms(200);
                       P6=0XFF;
                     }

}

if(KEY3==0)
{

           Delay_ms (10);
                if(KEY3==0)
                   {
                       BEEP=0;
                       Delay_ms(10);
                       BEEP=1;
                       if(  RUN_mode>0)  //已选择模式
                       {
                            BEEP=0;
                            Delay_ms(10);
                            BEEP=1;
                            RUN_NOW=!RUN_NOW;  //运行与停止之间切换
                       }  
               }

}
if(RUN_NOW==1)//正在运行
{
   P6=0XFF;           //全部熄灭
   Delay_ms(200);   
   P6=~(1<<(RUN_mode-1));   //点亮这个灯
   Delay_ms(200);
}


else                      //停止运行
{
P6=~(1<<(RUN_mode-1));
}

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-19 17:50 , Processed in 0.168676 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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