请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 10408|回复: 76

冲哥视频学习笔记

[复制链接]
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
    发表于 2023-2-21 17:19:34 | 显示全部楼层 |阅读模式
    本帖最后由 lclbf 于 2023-5-24 11:16 编辑

    首先感谢STC官网免费提供学习视频。发个帖子的目的:主要是借官方网站保存自己学习记录,再是自己学习遇到的问题,
    写出来,避免下次出同样的错误,也给同样的初学者出现同样的问题,提供解决的办法。后面有对应程序的压缩文件。

    很多图片来自官方数据手册和冲哥讲义文档,再次感谢!!!

    第1个程序:用寄存器点亮一个灯。

    实验程序如下:

    /**屠龙刀2022-6-20版***/

    sfr P2   = 0XA0;//用到的P2口相关寄存器设置
    sfr P2M0 = 0X96;
    sfr P2M1 = 0X95;

    sbit P21 = P2^1;

    void main()
    {
            P2M0 = 0X00;//P2口初始化为准双向口
            P2M1 = 0X00;
            
            while(1)
            {
                    P21 = 0;//P21口输出低电平,点亮LED,
            }
    }


    第2个程序:流水灯

    实验程序如下:

    /**屠龙刀2022-6-20版***/

    #include "STC32G.h"

    unsigned char cnt = 0;

    bit flag = 0; //流水标志

    void Delay100ms();

    void main()
    {
            static unsigned char temp = 0x01;
            unsigned char i;
            
            P2M0 = 0X00;//P2口初始化为准双向口
            P2M1 = 0X00;
            
            while(1)
            {
    //                /************方法1 左右流水灯***********/
    //                P2 = ~temp;
    //                temp = temp<<1;
    //                                
    //                if(temp == 0X70)
    //                {
    //                        temp = 0X01;
    //                }
    //                Delay100ms();
    //               
    //                if(flag==0)
    //                {
    //                        P2 = ~(0x01<<cnt);
    //                Delay100ms();
    //                cnt++;
    //                if(cnt>=8)
    //                {
    //                        flag = 1;
    //                        cnt = 0;
    //                }
    //                }
    //               
    //                else
    //                {
    //                        P2 = ~(0x80>>cnt);
    //                Delay100ms();
    //                cnt++;
    //                if(cnt>=8)
    //                {
    //                        flag = 0;
    //                        cnt = 0;
    //                }
    //                }
                   
    ///************方法2 右移动流水灯***********/                        
    //                for(i = 0;i < 9;i++)
    //                {
    //                        P2 = ~(0x01 << i);                        //P2口正向流水灯,移位法
    //                        Delay100ms();                                                //延时500毫秒
    //                }


    /************方法3 ***********/
                    P2 = 0XFE;
                    Delay100ms();
                    P2 = 0XFD;
                    Delay100ms();
                    P2 = 0XFB;
                    Delay100ms();
                    P2 = 0XF7;
                    Delay100ms();
                    P2 = 0XEF;
                    Delay100ms();
                    P2 = 0XDF;
                    Delay100ms();
                    P2 = 0XBF;
                    Delay100ms();
                    P2 = 0X7F;
                    Delay100ms();
                   
            }
    }

    void Delay100ms()                //@24.000MHz
    {
            unsigned long i;

            _nop_();
            _nop_();
            i = 599998UL;
            while (i) i--;
    }

    第2个程序: HIDI不断电下载点亮LED
       此程序在编译的时候出现警告,不影响效果,也可以自动下载。通过反复对比冲哥程序,
    没有问题,把冲哥程序复制过去也会出现警告。后面反复对比设置,发现设置有问题,

    冲哥视频学习笔记-1.png

    在Options for Target 'Target1'里面L251 Misc下面有个disable Waming Numbers;冲哥里面有个57,
    我的里面是空白,输入57,警告就没有了。我把这个数字改成30,56, 58都会出现警告,后面在
    学习的QQ群问了,有群友回复:说的的警告有L57的提示,一看警告前面全都有L57。

    实验程序如下:
    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"

    void sys_init(); //系统初始化

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {
            
            sys_init();  //系统初始化
            usb_init();  //USB初始化
            EA = 1;      //打开总中断
            
            while (1)
            {
    //                P2 = 0X0F;//点亮P2口高4位灯
                    P2 = 0Xf0;//点亮P2口低4位灯
            }
    }


    void sys_init()
    {
        WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度

        P2M0 = 0X00;        //P2口初始化为准双向口
        P2M1 = 0X00;
       
        P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
        P3M1 |= 0x03;
            
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定
    }



    第4个程序:CDC不断电下载点亮LED
       这个程序在实验的时候也出现警告,当时测试时,第3个程序的警告还没有解决。原因和解决办法一样。只是警告数量不一样,
    警告前面都有L57。重新设置一下,警告就没有了。





    实验程序如下:
    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"

    void sys_init();

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

    sbit P21 = P2^1;
    sbit P22 = P2^2;

    void main()
    {
            
            sys_init();
        usb_init();  //USB初始化
        EA = 1;
       
        while (1)
        {
          P2 = 0X0F; //点亮P2口高4位
    //                        P22 = 0;    //点亮P2.2口灯
        }
    }


    void sys_init()
    {
        WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度

        P0M0 = 0X00;         //P0口初始化准双向口
        P0M1 = 0X00;
        P2M0 = 0X00;  //P2口初始化准双向口
        P2M1 = 0X00;
            
        P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
        P3M1 |= 0x03;
       
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定
            
        USBCLK = 0x00;//用CDC不断电下载,必须要这两行,HID下载不用
        USBCON = 0x90;
    }


    第5个程序:打印C语言运算符和进制数
        此实验时也出现打印不是自己想要的内容,如下图所示:后面在QQ群问群友解决了.

    冲哥视频学习笔记-3.png
    出现上面问题的问题原因是:config.h文件里面宏定义问题,把打印设置到数码管输出了,如下图所示:
    冲哥视频学习笔记-4.png

    更改为下图就可以了:
    冲哥视频学习笔记-5.png
    输出结果正确如下图:
    冲哥视频学习笔记-6.png
    第二个问题:
    “printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥”
    看见的朋友若是知道,麻烦回复一下。自己理解是不是“%u”里面有个%的原因。

    冲哥视频学习笔记-7.png

    冲哥给了回复:%在c语言里属于强制转义符,如果想单纯的输出%,而不是作为其他用途的话,在需要输出%的地方写入“%%”,这样两个%就可以了
    如下图所示:
    冲哥视频学习笔记-1.png

    实验程序如下:

    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"

    void sys_init();

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {
            
            sys_init();
            usb_init();  //USB初始化
            EA = 1;
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();
                            printf("1.12=%.3f\r\n",1.12);
                            printf("1<<3=%u \r\n",1<<3);
                            printf("1&3=%u \r\n",1&3);
                            printf("1|3=%u \r\n",1|3);
                            printf("~3=%u \r\n",~3);
                            printf("!3=%u \r\n",!3);
                            printf("当前温度为:%0.1f°\r\n",25.5);
                            printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥
                            printf("100/3=%u \r\n",100/3);  
                            printf("(3+(5取余3)-2)=%u \r\n",3+(5%3)-2);
                    }
            }
    }


    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P3M0 = 0X00;   //P3口设置为准双向口
            P3M1 = 0X00;
            
            P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
            P3M1 |= 0x03;
            
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


    第6个程序: LED闪烁和花样式点灯

    实验程序如下:


    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"

    //#define MAIN_Fosc  24000000UL

    void sys_init();
    void delay_ms(u16);

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {
            u8 a;
            sys_init();
            usb_init();  //USB初始化
            EA = 1;
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();
                            a = 10;
                            
    //                        do{
    //                                printf("%u\r\n",a++);//10 11 12 13 14
    //                        }while(a<15);
                            
                            do{
                                    printf("%u\r\n",++a);//11 12 13 14 15
                            }while(a<15);
                                    
    //                        while(a<15)
    //                        {
    //                                printf("%u\r\n",++a);//11 12 13 14 15
    //                        }
                            
    //                while(a<15)
    //                        {
    //                                printf("%u\r\n",a++);//10 11 12 13 14
    //                        }
    //               
                    }
    ///***********P2口灯全部闪烁****************/
    //                P2 = 0X00;        //点亮P2口
    //                delay_ms(200);
    //                P2 = 0Xff;         //熄灭P2口
    //                delay_ms(200);
                   
    /***********P2口灯花样灯****************/               
            P2 = 0XFE;       //点亮P2.0口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.0口
            delay_ms(200);        
            
            P2 = 0XFD;                        //点亮P2.1口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.1口
            delay_ms(200);

            P2 = 0XFB;                        //点亮P2.2口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.2口
            delay_ms(200);

            P2 = 0XF7;     //点亮P2.3口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.3口
            delay_ms(200);
            
            P2 = 0XEF;     //点亮P2.4口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.4口
            delay_ms(200);
            
            P2 = 0XDF;     //点亮P2.5口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.5口
            delay_ms(200);
            
            P2 = 0XBF;     //点亮P2.6口
            delay_ms(200);
            P2 = 0Xff;                        //熄灭P2.6口
            delay_ms(200);
            
            P2 = 0X7F;    //点亮P2.7口
            delay_ms(200);
            P2 = 0Xff;                //熄灭P2.7口
            delay_ms(200);
            
            P2 = 0X0F;    //点亮高4位
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XF0;    //点亮低4位
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
                   
            P2 = 0X7E;    //点亮P2.7 P2.0
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XBD;    //点亮P2.6 P2.1
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XDB;    //点亮P2.5 P2.2
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XE7;    //点亮P2.4 P2.3
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0X00;    //P2口灯全亮
            delay_ms(200);
            P2 = 0Xff;    //P2口灯全灭
            delay_ms(200);
            
            P2 = 0XE7;    //点亮P2.4 P2.3
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XDB;    //点亮P2.5 P2.2
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0XBD;    //点亮P2.6 P2.1
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
            
            P2 = 0X7E;    //点亮P2.7 P2.0
            delay_ms(200);
            P2 = 0Xff;                //熄灭
            delay_ms(200);
                   
            }
    }


    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P1M0 = 0X00;    //P1口设置为准双向口
            P1M1 = 0X00;
            P2M0 = 0X00;   //P2口设置为准双向口
            P2M1 = 0X00;   
            P3M0 = 0X00;   //P3口设置为准双向口
            P3M1 = 0X00;
            
            P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
            P3M1 |= 0x03;
            
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


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


    第7个程序:模块化编程SOS求救灯

         学习这个的时候也有点小插曲,编译出现错误。代号L127 L128。如下图所示:

    冲哥视频学习笔记-1.png

    后面发现,是忘就添加delay.c和math.c文件。

    冲哥视频学习笔记-2.png

    后面通过反复找原因,反复看冲哥视频,对比以前的学习资料,找到这个问题,添加后,编译没有问题了。

    冲哥视频学习笔记-3.png

    实验程序如下:
    main函数:

    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"
    #include "delay.h"
    #include "math.h"

    #define MAIN_Fosc  24000000UL

    void sys_init();
    void delay_ms(u16 ms);
    //int Add(u16 Number1,u16 Number2);
    //int Sub(u16 Number1,u16 Number2);
    //int Mul(u16 Number1,u16 Number2);
    //int Div(u16 Number1,u16 Number2);

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {
            sys_init();
            usb_init();  //USB初始化
            EA = 1;
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();
                            printf("计算Add(3,7)的结果为:%u\r\n",Add(3,7));
                            printf("计算Sub(10,5)的结果为:%u\r\n",Sub(10,5));
                            printf("计算Mul(10,5)的结果为:%u\r\n",Mul(10,5));
                            printf("计算Div(10,5)的结果为:%u\r\n",Div(10,5));
                    }
    /*********P2口灯闪烁3次间隔时间200ms,再闪烁3次间隔时间600ms,
                    再闪烁3次间隔时间200ms,反复循环********************/
                    P2 = 0X00;     //P2口灯亮
                    delay_ms(200); //延时200ms
                    P2 = 0Xff;                  //P2口灯熄灭
                    delay_ms(200);
                    P2 = 0X00;
                    delay_ms(200);
                    P2 = 0Xff;
                    delay_ms(200);
                    P2 = 0X00;
                    delay_ms(200);
                    P2 = 0Xff;
                    delay_ms(200);
                   
                    P2 = 0X00;                                //P2口灯亮
                    delay_ms(600);    //延时600ms
                    P2 = 0Xff;        //P2口灯熄灭
                    delay_ms(600);   
                    P2 = 0X00;
                    delay_ms(600);
                    P2 = 0Xff;
                    delay_ms(600);
                    P2 = 0X00;
                    delay_ms(600);
                    P2 = 0Xff;
                    delay_ms(600);
                   
                    P2 = 0X00;
                    delay_ms(200);
                    P2 = 0Xff;
                    delay_ms(200);
                    P2 = 0X00;
                    delay_ms(200);
                    P2 = 0Xff;
                    delay_ms(200);
                    P2 = 0X00;
                    delay_ms(200);
                    P2 = 0Xff;
                    delay_ms(200);
            }
    }


    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度
            
    /*******************************
            PnM1  PnM0
             0      0    准双向口
             0      1    推挽输出
             1      0    高阻输入
             1      1    开漏输出
            
            
            
    **********************************/
            
            P1M0 = 0X00;         //P1口设置为准双向口
            P1M1 = 0X00;
            P2M0 = 0X00;  //P2口设置为准双向口
            P2M1 = 0X00;
            P3M0 = 0X00;  //P3口设置为准双向口
            P3M1 = 0X00;
            
            P3M0 &= ~0x03; //P3.0 P3.1口设置高阻输入
      P3M1 |= 0x03;
            
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


    延时函数(delay.h)头文件:


    #ifndef __DELAY_H__
    #define __DELAY_H__

    #include "stc.h"

    void delay_ms(u16 ms);

    #endif


    延时函数(delay.c)C文件:


    #include "delay.h"

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


    数学运算(math.h)头文件:


    #ifndef __MATH_H__
    #define __MATH_H__

    #include "stc.h"

    int Add(u16 Number1,u16 Number2);
    int Sub(u16 Number1,u16 Number2);
    int Mul(u16 Number1,u16 Number2);
    int Div(u16 Number1,u16 Number2);

    #endif


    数学运算(math.c) C文件:


    #include "math.h"

    int Add(u16 Number1,u16 Number2)//加法计算
    {
            return Number1+Number2;       //返回两个数的和
    }

    int Sub(u16 Number1,u16 Number2)  //减法计算
    {
            return Number1-Number2;       //返回两个数的差
    }

    int Mul(u16 Number1,u16 Number2)  //乘法计算
    {
            return Number1*Number2;       //返回两个数的积
    }

    int Div(u16 Number1,u16 Number2)  //除法计算
    {
            return Number1/Number2;       //返回两个数的商
    }


    第8个程序:按键控制灯
    此实验的时候发现了一个问题,按键按下移动灯,需要 加延时,后面自己解决了,没有想明白具体是啥原因。如下图所示:有文字描述。
    冲哥视频学习笔记-1.png
    下面的程序不加延时也可以。
    冲哥视频学习笔记-2.png
    冲哥视频学习笔记-3.png

    实验程序如下:

    /**屠龙刀2022-6-20版***/

    #include "stc.h"
    #include "usb.h"

    #define MAIN_Fosc 24000000UL

    #define Key1 P32
    #define Key2 P33

    void sys_init();
    void delay_ms(u16);

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {
            u8 LED = 0XFE;
            u8 num = 0;
            u8 LedChar[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
            P2 = 0Xfe;
            
            sys_init();
            usb_init();  //USB初始化
            EA = 1;
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();
                            
    //                        printf("%.1f\r\n",1.12);
                    }
    ///************(Key1)P32按下点亮P20,(Key2)P33按下熄灭P20**************/
    //                if(Key1 == 0)
    //                        {
    //                                delay_ms(10);
    //                                if(Key1 == 0)
    //                                {
    //                                        printf("P32按键按下\r\n");
    //                                        P20 = 0;                        
    //                                }
    //                        }
    //                        if(Key2 == 0)
    //                        {
    //                                delay_ms(10);
    //                                if(Key2 == 0)
    //                                {
    //                                        printf("P33按键按下\r\n");
    //                                        P20 = 1;                        
    //                                }
    //                        }
            
    ///************(Key1)P32按下点亮P20,松开灯熄灭**************/
    //if(Key1 == 0)
    //                        {
    //                                delay_ms(10);
    //                                if(Key1 == 0)
    //                                {
    //                                printf("P32按键按下\r\n");//打印按键动作输出,按键按下就打印
    //                                        P20 = 0;                        
    //                                }
    //                                else
    //                                {
    //                                        P20 = 1;
    //                                }
    //                        }

    ///************(Key2)P33按下P20灯取反**************/                        
    //                if(Key2 == 0)
    //                        {
    //                                delay_ms(10);
    //                                if(Key2 == 0)
    //                                {
    //                                printf("P33按键按下\r\n"); //打印按键动作输出,按键按下就打印
    //                                        P20 = !P20;         //按键按下动作
    //                                        while(Key2 == 0)
    //                                        {                                       
    //                                        }
    //                                        P20 = !P20;         //按键松开动作
    //                                }
    //                        }        


    ///************(Key2)P33按下P2灯取反**************/                        
    //                if(Key2 == 0)
    //                        {
    //                                delay_ms(10);
    //                                if(Key2 == 0)
    //                                {
    ////                                printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
    //                                        P2 = ~P2; //按键按下动作
    //                                        while(Key2 == 0);
    ////                                        P2 = ~P2; //按键松开动作

    //                                }
    //                        }        
                            
                            
    ///************(Key2)P33按下P2灯左移**************/                        
                    if(Key2 == 0)
                            {
                                    delay_ms(10);
                                    if(Key2 == 0)
                                    {
                                            printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
    //                                        while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
                                            P2 = ((P2 << 1)+1);
                                            delay_ms(1);                //延时解决        while(Key2 == 0);不同位置,灯不变化的问题               
    //                                        while(Key2 == 0);         //while(Key2 == 0)只能放这个位置,不用此句,按键按下灯也不变化                                
                                            if(P2 == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作,加有延时就可以
                                            P2 = 0XFE;
                                            while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
                                    }
                            }
                            
    /////************(Key2)P33按下P0灯左移 变量操作**************/                        
    //                                if(Key2 == 0)
    //                                                        {
    //                                                                delay_ms(10);
    //                                                                if(Key2 == 0)
    //                                                                {
    //                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
    ////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
    //                                                                        LED  = ((LED  << 1)+1);                                                                        
    //                                                                        if(LED  == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作
    //                                                                        LED  = 0XFE;
    //                                                                        P2 = LED ;
    //                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
    //                                                                }
    //                                                        }
                                                            
    ///************(Key2)P33按下P0灯左移 数组法**************/                        
    //                                if(Key2 == 0)
    //                                                        {
    //                                                                delay_ms(10);
    //                                                                if(Key2 == 0)
    //                                                                {
    //                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
    ////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
    //                                                                        LED  = LedChar[num];                                                                                                                                                
    //                                                                        num++;
    //                                                                        if(num == 8)
    //                                                                                num = 0;
    //                                                                        P2 = LED;
    //                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
    //                                                                }
    //                                                        }
                                                            
                            }
    }                        


    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P0M0 = 0X00;         //P0口设置为准双向口
            P0M1 = 0X00;
            P1M0 = 0X00;         //P1口设置为准双向口
            P1M1 = 0X00;
            P2M0 = 0X00;         //P2口设置为准双向口
            P2M1 = 0X00;        
            P3M0 = 0X00;         //P3口设置为准双向口
            P3M1 = 0X00;
            
            P3M0 &= ~0x03; //P3.0,P3.1设置为高阻输入
      P3M1 |= 0x03;
            
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


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


    第9个程序:驱动蜂鸣器发声
    很久没有更新,今天抽个空更新。我没有有源蜂鸣器,是无源蜂鸣器,声音没有视频的好听,板子是自己做的扩展板。
    冲哥视频学习笔记-1.png
    冲哥视频学习笔记-2.png
    程序如下:

    #include "stc.h"
    #include "usb.h"

    #define MAIN_Fosc 24000000UL

    #define Beep P10  //蜂鸣器为P10口
    #define Key P32   //按键P32口

    bit BeepFlag = 0; //蜂鸣器工作标志,默认不响

    void sys_init(); //系统初始化
    void delay_ms(u16); //延时函数

    //USB调试及复位所需定义
    char *USER_DEVICEDESC = NULL;
    char *USER_PRODUCTDESC = NULL;
    char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令


    void main()
    {        
            sys_init();   //系统初始化
            usb_init();  //USB初始化
            EA = 1;      //开总中断
                   
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();                                                
                    }
                   
    ///**********按键按下不松手蜂鸣器响************/
    //        if(Key==0)  //按键按下
    //        {
    //                delay_ms(10);  //延时10ms
    //                if(Key==0)  //按键再次确认按下
    //                {
    //                        printf("Key已经按下!\r\n");
    //                        BeepFlag = 1; //蜂鸣器响
    //                        while(Key==1);//Key==0测试按键按下时蜂鸣器不
    //                        //响,松开蜂鸣器就响一下;Key==1测试按下按键不松手
    //                        //蜂鸣器就一直响,按键松开,蜂鸣器不响。
    ////                        BeepFlag = 1;        //此行放在while(Key==1);前面效果一样                        
    //                }
    //                else
    //                {
    //                        BeepFlag = 0;//蜂鸣器停止响
    //                }
    //               
    //                if(BeepFlag == 1) //蜂鸣器响
    //                {
    //                        BeepFlag == 0; //蜂鸣器停止响
    //                        Beep = 0;      //蜂鸣器停止响
    //                        delay_ms(20); //延时20ms
    //                        Beep = 1;     //蜂鸣器响
    //                        delay_ms(50); //延时50ms
    //                }
    //                else
    //                {
    //                        BeepFlag == 1;    //蜂鸣器响
    //                        Beep = 1;        //蜂鸣器响
    //                }        
    //        }
                   
    /**********按键控制蜂鸣器响停************/
    if(Key==0)  //按键按下
            {
                    delay_ms(10); //延时10ms
                    if(Key==0)    //按键再次确认按下
                    {
                            printf("Key已经按下!\r\n");//打印输出按键按下
                            BeepFlag = ~BeepFlag; //蜂鸣器状态翻转
                            while(Key==0);//若是Key==1就不能实现按一下按键翻转
    //                        BeepFlag = ~BeepFlag;//此行放在while(Key==1);前面效果一样                        
                            
                    }
            }        
                    if(BeepFlag == 1) //若蜂鸣器响
                    {                        
                            Beep = 0; //蜂鸣器停止响
                            delay_ms(5);//延时5ms
                            Beep = 1;   //蜂鸣器响
                            delay_ms(5);//延时5ms
                    }
                    else
                    {
                            Beep = 1;//蜂鸣器响
                    }
                   
                   
            
            }
    }                        


    void sys_init()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度

            P0M0 = 0X00; //P0口设置为准双向口
            P0M1 = 0X00;
            P1M0 = 0X00; //P1口设置为准双向口
            P1M1 = 0X00;
            P2M0 = 0X00; //P2口设置为准双向口
            P2M1 = 0X00;
            
            P3M0 = 0X00; //P3口设置为准双向口
            P3M1 = 0X00;
            
            P3M0 &= ~0x03;
      P3M1 |= 0x03;
            
            //设置USB使用的时钟源
            IRC48MCR = 0x80;    //使能内部48M高速IRC
            while (!(IRC48MCR & 0x01));  //等待时钟稳定

            USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
      USBCON = 0x90;
    }


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


    第10个程序:按键控制LED灯和蜂鸣器1,按键处理控制LED灯和蜂鸣器2
    按键控制LED灯和蜂鸣器1,只是使用了两个按键,用来模拟电磁炉的开关机和功能切换。
    按键控制LED灯和蜂鸣器2,采用了多函数方法,添加了专用的KEYLED.H KEYLED.C函数
    同时增加了按键3,实现了用LED灯来模拟电磁炉功能切换和开关机,还进行了工作状态指示。

    程序压缩见后面附件。

    第11个程序:数码管静态显示

    1,这个程序学习的时候遇到一个问题,如下:

    // 减法循环
            P2 = SegLED [Num]; //用数组来实现显示
            if(Num > 0)
            {
                    Num--;      //循环数自减
                    if(Num <= 0)    //为什么减法最低不能到0?
                                           //也就是说不显示0,最小显示1又变成9 了
                    {
                            Num = 9;
                    }
            }        
            delay_ms(500);   //延时500ms

    数码管不能显示0,显示到1又变成9了。

    2,通过一个按键设置数码管显示数字0-9循环,在按一下另外一个按键的时候,数码管上显示的数字几,
    蜂鸣器就响几声
         老师的这个作业没有想到方法来实现。
    程序文件见后面附件压缩文件包。

    第12个程序:数码管动态显示
    没有对应的硬件,自己用屠龙刀2022-6-20,自己搭接的四位数码管,硬件接口如下:

    P0.1 数码管最低位阳极控制开关,低电平开。
    P0.2 数码管次低位阳极控制开关,低电平开。
    P0.3 数码管次高位阳极控制开关,低电平开。
    P0.4 数码管最高位位阳极控制开关,低电平开。
    P2.0-P2.7对应数码管a b c d e f g dp。
    P7.5 蜂鸣器控制

    硬件不同,程序也和冲哥视频有区别。
    程序压缩 见后面附件。



    1 点亮一个LED.rar

    14.89 KB, 下载次数: 77

    2 流水灯.rar

    39.17 KB, 下载次数: 75

    3 HIDI不断电下载点亮LED.rar

    112.59 KB, 下载次数: 83

    4 CDC不断电下载点亮LED.rar

    109.3 KB, 下载次数: 76

    5 打印C语言运算符和进制数.rar

    111.22 KB, 下载次数: 83

    6 LED闪烁和花样式点灯.rar

    113.3 KB, 下载次数: 76

    7 模块化编程SOS求救灯.rar

    121.33 KB, 下载次数: 82

    8 按键控制灯.rar

    113.14 KB, 下载次数: 80

    9 驱动蜂鸣器发声.rar

    112.63 KB, 下载次数: 66

    10 按键控制LED和蜂鸣器1.rar

    113.8 KB, 下载次数: 63

    10 按键控制LED和蜂鸣器2.rar

    128.82 KB, 下载次数: 58

    11 数码管静态显示.rar

    115.07 KB, 下载次数: 61

    12 数码管动态显示.rar

    117.6 KB, 下载次数: 55

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:02
  • 签到天数: 83 天

    [LV.6]常住居民II

    37

    主题

    962

    回帖

    6680

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6680
    QQ
    发表于 2023-2-22 09:14:15 | 显示全部楼层
    :handshake楼主很棒
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
     楼主| 发表于 2023-2-22 10:46:09 | 显示全部楼层

    学习遇到问题,冲哥多指点!

    点评

    嗯嗯,有问题随时留言  发表于 2023-2-22 15:14
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
     楼主| 发表于 2023-2-22 15:45:13 | 显示全部楼层
    lclbf 发表于 2023-2-22 10:46
    学习遇到问题,冲哥多指点!

    printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥? 是不是“%u”这里有“%”的原因?

    点评

    %在c语言里属于强制转义符,如果想单纯的输出%,而不是作为其他用途的话,在需要输出%的地方写入“%%”,这样两个%就可以了  发表于 2023-2-22 16:54
  • TA的每日心情
    奋斗
    2024-3-19 10:40
  • 签到天数: 41 天

    [LV.5]常住居民I

    10

    主题

    320

    回帖

    1381

    积分

    版主

    积分
    1381
    QQ
    发表于 2023-2-22 16:48:01 | 显示全部楼层
    棒棒的
    www.STCAI.com
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
     楼主| 发表于 2023-2-22 16:57:53 | 显示全部楼层
    lclbf 发表于 2023-2-22 15:45
    printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(1 ...

    谢谢,就是你说这个原因!
  • TA的每日心情
    开心
    昨天 08:02
  • 签到天数: 83 天

    [LV.6]常住居民II

    37

    主题

    962

    回帖

    6680

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6680
    QQ
    发表于 2023-2-22 17:09:22 | 显示全部楼层
    lclbf 发表于 2023-2-22 16:57
    谢谢,就是你说这个原因!

    :lol
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
     楼主| 发表于 2023-2-22 17:29:04 | 显示全部楼层

    在上面我更新了,附有图片。
  • TA的每日心情
    开心
    昨天 08:02
  • 签到天数: 83 天

    [LV.6]常住居民II

    37

    主题

    962

    回帖

    6680

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6680
    QQ
    发表于 2023-2-22 17:32:12 | 显示全部楼层
    lclbf 发表于 2023-2-22 17:29
    在上面我更新了,附有图片。

    :handshake嗯恩,有这个求知的心看起来非常适合学习,这几步剪视频的时候好像不小心删掉了,在论坛里其实有个帖子里面做了详细描述和解决办法,楼主能自己发现问题并尝试解决问题的心态非常好,到后面建议也可以尝试着做一下课后练习,会很有帮助。加油
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 72 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    422

    积分

    中级会员

    积分
    422
     楼主| 发表于 2023-2-23 08:59:42 | 显示全部楼层
    电子DIY小家 发表于 2023-2-22 17:32
    嗯恩,有这个求知的心看起来非常适合学习,这几步剪视频的时候好像不小心删掉了,在论坛里其实 ...

    学了20多年了,还没有学会。不知道是不是我方法不对,现在把希望寄托在你的视频上。有问题要多麻烦你。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-4-19 04:20 , Processed in 0.080094 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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