找回密码
 立即注册
楼主: lclbf

冲哥视频学习笔记

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 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, 下载次数: 91

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-4-2 15:02:34 | 显示全部楼层
lcl*** 发表于 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, 下载次数: 93

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

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

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

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

15 多任务处理.rar

177.5 KB, 下载次数: 92

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-27 14:40:11
已绑定手机

16

主题

468

回帖

2165

积分

版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

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

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


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

Keil C51 注册软件2032_2.zip

23.04 KB, 下载次数: 106

4_1 点亮一个灯.rar

15.24 KB, 下载次数: 84

4_2 USB_HID不断电下载.rar

76.43 KB, 下载次数: 82

4_3 USB_CDC不断电下载.rar

79.82 KB, 下载次数: 85

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-4-7 16:30:49 | 显示全部楼层
本帖最后由 lcl*** 于 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, 下载次数: 115

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

83.87 KB, 下载次数: 132

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:47 , Processed in 0.144390 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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