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

冲哥视频学习笔记

[复制链接]
  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    38

    主题

    982

    回帖

    6759

    积分

    荣誉版主

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

    积分
    6759
    QQ
    发表于 2023-3-29 09:31:32 | 显示全部楼层
          
    得在好好理解下逻辑的问题,改成这样:

            P2 = SegLED [Num]; //用数组来实现显示
            if(Num > 0)
            {
                    Num--;      //循环数自减
            }      
            else
            {
                    Num = 9;
            }
            delay_ms(500);   //延时500ms


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-3-29 10:35:24 | 显示全部楼层
    你这样可以,我试过。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-2 14:57:44 | 显示全部楼层
    第13个程序:定时器
    /************************************
    1 按下按键,每10ms最末尾数字加1,
      再次那些按键停止计数
            
    硬件条件:
    屠龙刀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 蜂鸣器控制
    *************************************/
    #include "stc.h"
    #include "usb.h"

    #define MAIN_Fosc 24000000UL

    #define Beep P75                    //蜂鸣器脚位定义
    #define Key1 P32                                //按键1脚位定义
    #define Key2 P33                                //按键2脚位定义
    #define DELAY 1                     //延时时间宏定义
    #define DELAY1s 1000                //延时时间宏定义

    u8 SegLED [21] = {
                    0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
              0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
    };//共阳数码管0-9显示代码,0-9带点显示代码

    u8 SegTex[7] = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
    u8 WeiLed[5] = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
    u8 ShowLed[4] = {1,0,0,0};
    //u8 ShowLed[4] = {5,0,9,1};
    u8 num = 3;
    u32 Scount;                                        //1ms计数
    bit RunStats;       //运行状态标志

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

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

    void LEDsfr()
    {
            P0 = WeiLed[num];                                          //数码管位给P0口
            P2 = SegLED[ShowLed[num]];        //数码管段给P2口

            if(num>0)                                                                                //数码管显示大于0就自减
                    num--;
            else
                    num = 3;                                                                        //数码管显示等于0就显示3
    }        


    void Timer0_Init(void)                //1毫秒@24.000MHz
    {
            AUXR &= 0x7F;                        //定时器时钟12T模式
            TMOD &= 0xF0;                        //设置定时器模式
            TL0 = 0x30;                                //设置定时初始值
            TH0 = 0xF8;                                //设置定时初始值
            TF0 = 0;                                //清除TF0标志
            TR0 = 1;                                //定时器0开始计时
            ET0 = 1;                                //使能定时器0中断
    }


    void main()
    {        

            sys_init();                                //系统初始化
            usb_init();                          //USB初始化
            Timer0_Init();                //定时器0初始化
            EA = 1;                                          //打开总中断
            
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();                                                
                    }



    /*******按下按键,4位数码管每100ms最末尾数字加1,
      再次那些按键停止计数        *************/
            
            if(Key1 == 0)                                                 //按键按下
            {               
                    delay_ms(10);                                         //延时10ms去抖
                    if(Key1 == 0)                       //确认按键按下
                            P75 = 0;                          //按下按键蜂鸣器响
                            delay_ms(10);                     //蜂鸣器响10ms
                            P75 = 1;                                                        //蜂鸣器停止响
    //                        while(Key1 == 0);         //按键松开动作
                            if(RunStats==0)                   //运行状态为0
                                    Scount = 0;                                        //计数清零
                            RunStats = !RunStats;        //运行状态翻转

                            while(Key1 == 0);                        //按键按下动作
            }
            
            }
    }                        

    void Timer0_Isr(void) interrupt 1
    {
            LEDsfr();                                                                     //数码管刷新
            if(RunStats==1)                                                                //运行状态
            {                                                        
                    Scount++;                                                                                 //1ms计数自加
            }
            ShowLed[0] = Scount/10000%10; //数码管显示最高位
            ShowLed[1] = Scount/1000%10;  //数码管显示次高位
            ShowLed[2] = Scount/100%10;   //数码管显示次低位
            ShowLed[3] = Scount/10%10;    //数码管显示最低位
            
    }


    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;               
            P4M0 = 0X00;                //P4口设置为准双向口
            P4M1 = 0X00;               
            P5M0 = 0X00;                //P5口设置为准双向口
            P5M1 = 0X00;               
            P6M0 = 0X00;                //P6口设置为准双向口
            P6M1 = 0X00;               
            P7M0 = 0X00;                //P7口设置为准双向口
            P7M1 = 0X00;        
            
            
            P3M0 &= ~0x03;        //P30P31设置为高阻输入
      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);
    }

    程序压缩如附件:

    13 定时器.rar

    116.52 KB, 下载次数: 10

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-2 15:02:34 | 显示全部楼层
    lclbf 发表于 2023-4-2 14:57
    第13个程序:定时器
    /************************************
    1 按下按键,每10ms最末尾数字加1,

    第14个程序:计数器

    /************************************
    1 转速表
            
    硬件条件:
    屠龙刀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 蜂鸣器控制
    *************************************/
    #include "stc.h"
    #include "usb.h"

    #define MAIN_Fosc 24000000UL

    u8 num = 3;
    u32 Count;
    u32 Scount;


    u8 SegLED [21] = {
                    0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
              0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
    };//共阳数码管0-9显示代码,0-9带点显示代码

    u8 SegTex[7] = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
    u8 WeiLed[5] = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
    u8 ShowLed[4] = {0,0,0,0};
    //u8 ShowLed[4] = {5,0,9,1};


    void sys_init();      //系统初始化
    void delay_ms(u16);   //延时函数
    void LEDsfr();                                //数码管刷新

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



    void Timer0_Init(void)                //1毫秒@24.000MHz
    {
            AUXR &= 0x7F;                        //定时器时钟12T模式
            TMOD &= 0xF0;                        //设置定时器模式
            TL0 = 0x30;                                //设置定时初始值
            TH0 = 0xF8;                                //设置定时初始值
            TF0 = 0;                                //清除TF0标志
            TR0 = 1;                                //定时器0开始计时
            ET0 = 1;                                //使能定时器0中断
    }



    void main()
    {        

            sys_init();                                //系统初始化
            usb_init();                   //USB初始化
            Timer0_Init();                //定时器0初始化
            
            TMOD = 0x50;                        //设置计数器模式
            TL1 = 0x00;                                //设置计数初始值
            TH1 = 0x00;                                //设置计数初始值
            TF1 = 0;                                        //清除TF1标志
            TR1 = 1;                                        //定时器1开始计时
            ET1 = 1;                                        //使能定时器1中断
                
            P3PU = 0x20;                         //打开P35内部上拉4.1K
            
            EA = 1;                                                //开总中断
            
            
            while (1)
            {
                    if( DeviceState != DEVSTATE_CONFIGURED )         //
                            continue;
                    if( bUsbOutReady )                                                               
                    {
                            usb_OUT_done();                                                
                    }
            
            
            }
    }                        


    void Timer0_Isr(void) interrupt 1
    {
            Count++;                                                                          //1ms自加
            if(Count>=1000)                                                                                //1s时间到
            {                                                               
                    Count = 0;                                                                                        //清零
                    Scount = (TH1*256) + TL1;                                //计数值
                    TH1 = 0;
                    TL1 = 0;
                   
                    ShowLed[0] = Scount/1000%10;                //最高为显示
                    ShowLed[1] = Scount/100%10;                        //最次高为显示
                    ShowLed[2] = Scount/10%10;                        //最次低为显示
                    ShowLed[3] = Scount/1%10;                                //最最低为显示
            }
            LEDsfr(); //数码管刷新
    }

    void Timer1_Isr(void) interrupt 3
    {
            
    }

    void LEDsfr()
    {
            P0 = WeiLed[num];                                                //把数码管位给P0口
            P2 = SegLED[ShowLed[num]];        //把数码管段给P0口

            if(num>0)                                                                                //如果数大余0就减
                    num--;
            else                                                                                                //若数减到0就置3
                    num = 3;
    }        

    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;
            P4M0 = 0X00;                //P4口初始化为准双向口
            P4M1 = 0X00;
            P5M0 = 0X00;                //P5口初始化为准双向口
            P5M1 = 0X00;
            P6M0 = 0X00;                //P6口初始化为准双向口
            P6M1 = 0X00;
            P7M0 = 0X00;                //P7口初始化为准双向口
            P7M1 = 0X00;        
            
            
            P3M0 &= ~0x03;          //P30P31设置为高阻输入
      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);
    }

    程序压缩文件如下:

    14 计数器.rar

    116.54 KB, 下载次数: 9

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-2 15:20:33 | 显示全部楼层
    本帖最后由 lclbf 于 2023-4-2 15:21 编辑
    lclbf 发表于 2023-4-2 15:02
    第14个程序:计数器

    /************************************

    第15个程序:多任务处理
        这个视频让我学会了,时间巡回处理问题。
    具体程序压缩如下附件:

    15 多任务处理.rar

    177.5 KB, 下载次数: 11

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-3 09:12:19 | 显示全部楼层
    本帖最后由 lclbf 于 2023-4-3 10:09 编辑

    通过一段时间的学习冲哥视频,收获不少,以前没有对应的开发箱,利用官方免费包邮提供的降龙棍和屠龙刀;
    自己搭建一些电路学习。再次感谢STC官方的支持和帮助,官方认为我是真心学习又给我提供了开发箱9.6和仿真线.

    1.png

    2.png

    现在开始好好利用开发箱,从头再次学习冲哥视频。因为以前硬件不一样,有的程序没有办法实际练习。
    后面将每个视频一个楼层。
    点灯实验用到的电路如下所示:
    1.png
    P4.0口是LED灯的总开关。低电平Q11导通,SYS_VCC的电压通过Q11加到所有LED的正极,给灯点亮提供第一个条件。
    点亮灯的第二个条件是P6口,P6.0-A,P6.1-B,P6.2-C,P6.3-D,P6.4-E,P6.5-F,P6.6-G,P6.7-H,这个P6口也是数码管的段码
    控制口,所以官方图纸上面有后缀字母,表示数码管对应的段。当P6口对应的脚输出低电平,对应的LED就点亮。
    P6.0_A  输出低电平点亮  LED4
    P6.1_B  输出低电平点亮  LED11
    P6.2_C  输出低电平点亮  LED12
    P6.3_D  输出低电平点亮  LED13
    P6.4_E  输出低电平点亮  LED14
    P6.5_F  输出低电平点亮  LED15
    P6.6_G  输出低电平点亮  LED16
    P6.7_H  输出低电平点亮  LED17




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-19 10:40
  • 签到天数: 41 天

    [LV.5]常住居民I

    10

    主题

    320

    回帖

    1399

    积分

    版主

    积分
    1399
    QQ
    发表于 2023-4-3 10:31:42 | 显示全部楼层
    加油,期待您学成的一天!
    www.STCAI.com
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-4 08:48:14 | 显示全部楼层
    STC8H8K64U 发表于 2023-4-3 10:31
    加油,期待您学成的一天!

    谢谢鼓励!一定坚持下去!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-6 09:06:52 | 显示全部楼层
    本帖最后由 lclbf 于 2023-4-7 08:08 编辑
    https://www.stcaimcu.com/forum.php?mod=attachment&aid=NzIyOXw3ODkyOWZjNXwxNzE0Mjk3ODI4fDB8lclbf 发表于 2023-4-3 09:12
    通过一段时间的学习冲哥视频,收获不少,以前没有对应的开发箱,利用官方免费包邮提供的降龙棍和屠龙刀;
    ...

    视频第一集:了解单片机,看看视频即可。
    第二集:硬件介绍,对应没有硬件基础的多看看,特别是实物和原理图要对应看,学习官方的硬件设计思维,单片机编程要
      对硬件结合,必须清楚硬件设计的目的。
    第三集:开发环境的搭建和程序下载,这集视频要结合官方数据手册多看,多联系。官方数据手册有我发现有几个版本,一定
      要看最新的。视频和手册对于软件的下载方法和下载地址都有提供。破解软件后面附件有压缩包,可以破解到2032年,有需要的可以下载。
    第四集:点亮一个LED,1,不用头文件,直接寄存器控制点亮LED。2,USC_HID不断电下载。3,USB_CDC不断电下载。


    程序和破解文件压缩包如下:

    Keil C51 注册软件2032_2.zip

    23.04 KB, 下载次数: 11

    4_1 点亮一个灯.rar

    15.24 KB, 下载次数: 9

    4_2 USB_HID不断电下载.rar

    76.43 KB, 下载次数: 8

    4_3 USB_CDC不断电下载.rar

    79.82 KB, 下载次数: 9

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 73 天

    [LV.6]常住居民II

    11

    主题

    148

    回帖

    426

    积分

    中级会员

    积分
    426
     楼主| 发表于 2023-4-7 16:30:49 | 显示全部楼层
    本帖最后由 lclbf 于 2023-4-14 14:41 编辑
    lclbf 发表于 2023-4-6 09:06
    视频第一集:了解单片机,看看视频即可。
    第二集:硬件介绍,对应没有硬件基础的多看看,特别是实物和原理 ...

    第五集:C语言运算符和进制数入门,这部分是通过打印来学习C语言中关于二进制,十六进制。这是学习单片机常用的两种进制数。
      学习本集视频,打印输出是又出现了前面的错误,打印输出显示“7SEGS”;问题原因和处理方法:config.h文件里面宏定义问题(usb.h
      里面也有这两个宏定义,注意这里修改是无效的),把打印设置到数码管输出了,前面学习遇到也说了解决办法。但是在学习过程中
      初学者要注意:官方的Demo程序中的usb.h、config.h等头文件,不同的Demo里面的内容是不一样的,发现问题按照Keil软件提示多对
      比冲哥视频里面的学习程序包里面的对应文件(有的头文件冲哥目前视频没有讲,可能在后面会有讲解)。
    下面是要掌握是知识点,来自冲哥教程。

    1.png

    2.png
    3.png
    4.png
    5.png

    学习程序文件如下面压缩包,里面有详细注解。



    5_1 printf函数的使用.rar

    79.03 KB, 下载次数: 11

    5_2 通过printf学习C语言的常用运算.rar

    83.87 KB, 下载次数: 12

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-28 17:50 , Processed in 0.080619 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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