找回密码
 立即注册
查看: 320|回复: 10

跟着冲哥学习stc32

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:04:04 | 显示全部楼层 |阅读模式
第一集,我学习到了stc的功能,单片机是怎样的,我们可以通过单片机实现什么功能。

截图202501101033057629.jpg

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:07:42 | 显示全部楼层
第二集,了解了stc32实验箱各个模块的作用是什么,冲哥举了一些例子,简洁明了
截图202501101034056748.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:11:11 | 显示全部楼层
第三集,开始进入正题,在学习stc32前,我们要把单片机l的开发环境搭建好,stc-ISP的下载,添加相关的头文件到keil中等等。学会怎么使用stc32手册。
截图202501101035027435.jpg 截图202501101035468160.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:13:01 | 显示全部楼层
第四集,建立一个LED点亮的工程,首先是了解LED点亮的原理,理解高低电平的含义,学会配置寄存器
截图202501101037231771.jpg 截图202501101038441970.jpg
部分代码

#include "ai8051u.h"

void main(void)
{
        P0M1=0x00; P0M0=0x00;
        P4M1=0x00; P4M0=0x00;
        
        P40=0;
        
        while(1)
        {
                P00=0;
        }
}
点亮所以LED

#include "ai8051u.h"

void main(void)
{
        P0M1=0x00;                 //配置P0.0-P0.7为准双向口;
        P0M0=0x00;
       
        P4M1=0x00;                 //配置P0.0-P0.7为准双向口;
        P4M0=0x00;
       
       
        while(1)
        {
                P40=0;                //P40为0伏
                P00=0;
                P01=0;
                P02=0;
                P03=0;
                P04=0;
                P05=0;
                P06=0;
                P07=0;
        }
}


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:16:05 | 显示全部楼层
第四集,由于每次烧录程序到单片机上比较繁琐,所以在视频中我学会了编写实现自动下载的程序
截图202501101039533659.jpg stc_usb_cdc程序在COMM文件夹中。
程序如下

#include "ai8051u.h"
#include "stc32_stc8_usb.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
         P_SW2 |= 0x80;
       
        P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
        EA = 1;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                 if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
               
                P40=0;                //P40为0伏
                P00=0;
                P01=0;
                P02=0;
       
        }
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:19:05 | 显示全部楼层
第五集,学习C语言的编写的逻辑,printf函数的实现,2进制,10进制,16进制之间是怎样转换
截图202501101041514881.jpg 截图202501101042251864.jpg 截图202501101043055992.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:23:16 | 显示全部楼层
第六集,学习delay函数进行LED点亮和花式点灯,循环函数是怎样编写的
截图202501101044007575.jpg delay函数需要写在void main函数前或者在main函数前调用

截图202501101045565728.jpg do-while和while循环的编写程序区别
程序如下

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"

#define u8 unsigned char                                                        //8位无符号
#define u16 unsigned int                                                    //16位无符号
       

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

u8 state=0;                                //初始值

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

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

void main(void)
{
        WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
        P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
        EA = 1;
       
        P40=0;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                 if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
                if(P32==0)
                {
                         Delay20ms();
                        if(P32==0)
                        {
                                state=!state;
                                P00=state;
                               
                                while(P32==0);
                        }
                }
       
        }
       
}


截图202501101046384050.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-10 10:25:33 | 显示全部楼层
第七集,理解按键的原理,运用按键进行点灯操作,学会怎样进行按键消抖
截图202501101048257053.jpg 按键按下时出现的抖动,所以我们要对这个抖动进行延时,消去抖动

截图202501101049501191.jpg 按键代码编写例子

截图202501101051268137.jpg 按键点亮LED灯的程序
利用定时器中断,打印按下次数,用ISP生成定时器中断代码
程序如下

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"

#define u8 unsigned char                                                        //8位无符号
#define u16 unsigned int                                                    //16位无符号
        

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

u8 state=0;                                //初始值

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

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

void Timer0_Init(void)                //3秒@24.000MHz
{
        TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x3F;                                //设置定时初始值
        TH0 = 0x01;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}


void main(void)
{
        int        count;                                                                                //定义次数变量
        
        WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
        
        P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
        
        usb_init();                                     //USB CDC 接口配置
        Timer0_Init();                                                                        //定时器初始化
        EA = 1;
        
        P40=0;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                 if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
                if(P32==0)                                                                        //判断按键是否按下
                {
                         Delay20ms();                                                        //延时消抖
                        if(P32==0)                                                                //再次确定按键是否按下
                        {
                                
                                printf("按下次数\xfd:%d次\r\n",(int)count);
                                count++;
                                
                                while(P32==0);
                        }
                }
        
        }
        
}

void Timer0_Isr(void) interrupt 1
{
        state=!state;
        P00=state;
}


回复 支持 反对

使用道具 举报 送花

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

16

主题

468

回帖

2165

积分

版主

积分
2165
QQ
发表于 2025-2-27 10:29:43 | 显示全部楼层
催更催更  
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:40:36
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-3-12 21:19:17 | 显示全部楼层
第八集:学习定时器周期性调查

理解如何使用函数及变量,用数组定义变量U16 State[10]={0,1,2,3,4,5,6,7,8,9}

任务一:用定时器取反,LED1在0.3秒取反一次,LED2在0.6秒取反一次,LED3在0.9秒取反一次


#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"

#define u8 unsigned char                                                        //8位无符号
#define u16 unsigned int                                                    //16位无符号
       

u8 state1=0;                                //LED1初始值
u8 state2=0;                                //LED2初始值
u8 state3=0;                                //LED3初始值

u8 Run_State;                                //运行状态

u16 Count_300 = 0;                        //定义300ms变量
u16 Count_600 = 0;                        //定义600ms变量
u16 Count_900 = 0;                        //定义900ms变量

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void Timer0_Init(void);


void main(void)
{
        int        count = 1;                                                                                //定义按键次数变量
       
        WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
        P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
        Timer0_Init();                                                                        //定时器初始化
        EA = 1;
       
        P40=0;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                 if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
                if(Count_300 >=300)                                                        //300ms到达
                {
                        Count_300 = 0;
                        state1 =!state1;                                                //LED1取反
                        P00 = state1;
                }
                if(Count_600 >=600)                                                        //600ms到达
                {
                        Count_600 = 0;                                                       
                        state2 =!state2;                                                //LED2取反
                        P01 = state2;
                }
                if(Count_900 >=900)                                                        //900ms到达
                {
                        Count_900 = 0;                                                       
                        state3 =!state3;                                                //LED3取反
                        P02 = state3;
                }
        }
       
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}



void Timer0_Isr(void) interrupt 1
{
        Count_300++;
        Count_600++;
        Count_900++;

       
}


二是利用数组形式,依次点亮8颗LED灯

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"

#define u8 unsigned char                                                        //8位无符号
#define u16 unsigned int                                                    //16位无符号
       

u8 state1=0;                                //LED1初始值
u8 state2=0;                                //LED2初始值
u8 state3=0;                                //LED3初始值

u8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

u8 Run_State = 0;                                //运行状态
u8 i;
u8 num = 0;

//u16 Count_300 = 0;                        //定义300ms变量
//u16 Count_600 = 0;                        //定义600ms变量
//u16 Count_900 = 0;                        //定义900ms变量

u16 Count_ms[3]={0,0,0};

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void Timer0_Init(void);


void main(void)
{
        int        count = 1;                                                                                //定义按键次数变量
       
        WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
        P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
        Timer0_Init();                                                                        //定时器初始化
        EA = 1;
       
        P40=0;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                 if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
                if(Count_ms[0] >=500)                                                        //500ms到达
                {
                        Count_ms[0] = 0;
                        P0 = ~State[num];                                                //num0——7
                        num ++;
                        if(num >7)
                                num =0;
                }
        }
       
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}



void Timer0_Isr(void) interrupt 1
{
        for(i=0;i<=3;i++)
        {
                Count_ms[i]++;
        }
       
}

任务三:按键按一下,LED灯随数组移动一下





回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:33 , Processed in 0.165142 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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