17141200320 发表于 2023-12-23 16:39:11

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

本帖最后由 国学芯用 于 2024-1-10 11:58 编辑

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

17141200320 发表于 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.
.






xxkj2010 发表于 2023-12-24 14:00:59

记得当年入门单片机,用的是AT89C51,没有P4口,所以不用自己自定义P4口寄存器。点个灯,简单得很。

17141200320 发表于 2023-12-26 11:26:07

第六集视频
1、Delay延时函数
1秒=1000毫秒=1000000微妙
延时函数
#defineMAIN_FOSC    24000000UL //主时钟
voiddelay_ms (u16ms)
{
u16 i;
      do{
            i=MAIN_FOSC/6000 ;
            while(--i);          }while(--ms);
}

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


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


      XXX.C 格式
      #include"xxx.h "
      函数定义

17141200320 发表于 2023-12-26 11:26:07

第六集视频
1、Delay延时函数
1秒=1000毫秒=1000000微妙
延时函数
#defineMAIN_FOSC    24000000UL //主时钟
voiddelay_ms (u16ms)
{
u16 i;
      do{
            i=MAIN_FOSC/6000 ;
            while(--i);          }while(--ms);
}

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


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


      XXX.C 格式
      #include"xxx.h "
      函数定义

rengran 发表于 2023-12-26 19:11:39

回帖仅作者可见,小心判定你灌水封号

17141200320 发表于 2023-12-29 12:00:09

rengran 发表于 2023-12-26 19:11
回帖仅作者可见,小心判定你灌水封号

明白了,马上改,非常感谢!

17141200320 发表于 2023-12-29 12:12:49

17141200320 发表于 2023-12-29 12:00
明白了,马上改,非常感谢!

请教下怎么改

17141200320 发表于 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灯点亮位
   11111110//0XFE
   11111101//左移一位,后面的位自动补0,需要在此位加1.
   11111011//0XFB
   11110111//0xF7
   11101111//0XEF
   11011111//0XDF
   10111111//0XBF
   01111111//0X7F
   举例
      viodmain()   
      {
            
         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灯点亮位
   11111110//0XFE
   11111101//0XFD
   11111011//0XFB
   11110111//0xF7
   11101111//0XEF
   11011111//0XDF
   10111111//0XBF
   01111111//0X7F
   举例
      viodmain()   
      {
         u8 num=0;
         u8 LED_Data=0xFE;
         u8 LED_DataTab={0XFE,0XFD,0XFB,0XF7 ,0XEF,0XDF,0XBF,0X7F };
            P6=LED_Data;
            while(1)
             {
                P6=LED_DataTab;
                delay_ms(500);
                num++;
               if(num>7)
               {
                   num=0;
                   LED_DataTab=0xFE;//改变数组第1个元素值由0XFD变成0XFE。
               }
             }

      }


17141200320 发表于 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;//执行动作变量
      bitRUN_Flag;//此变量值只有0和1
      RUN_Flag=0;   //开关机变量
      u8RUN_mode;//模式1-8
      voidTest(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));
}

页: [1] 2 3
查看完整版本: 【已送实验箱】LED点灯学习