衫正 发表于 2025-1-10 10:04:04

跟着冲哥学习stc32

第一集,我学习到了stc的功能,单片机是怎样的,我们可以通过单片机实现什么功能。



衫正 发表于 2025-1-10 10:07:42

第二集,了解了stc32实验箱各个模块的作用是什么,冲哥举了一些例子,简洁明了


衫正 发表于 2025-1-10 10:11:11

第三集,开始进入正题,在学习stc32前,我们要把单片机l的开发环境搭建好,stc-ISP的下载,添加相关的头文件到keil中等等。学会怎么使用stc32手册。


衫正 发表于 2025-1-10 10:13:01

第四集,建立一个LED点亮的工程,首先是了解LED点亮的原理,理解高低电平的含义,学会配置寄存器

部分代码

#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;
        }
}


衫正 发表于 2025-1-10 10:16:05

第四集,由于每次烧录程序到单片机上比较繁琐,所以在视频中我学会了编写实现自动下载的程序
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;
       
        }
}

衫正 发表于 2025-1-10 10:19:05

第五集,学习C语言的编写的逻辑,printf函数的实现,2进制,10进制,16进制之间是怎样转换


衫正 发表于 2025-1-10 10:23:16

第六集,学习delay函数进行LED点亮和花式点灯,循环函数是怎样编写的
delay函数需要写在void main函数前或者在main函数前调用

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);
                        }
                }
       
        }
       
}


衫正 发表于 2025-1-10 10:25:33

第七集,理解按键的原理,运用按键进行点灯操作,学会怎样进行按键消抖
按键按下时出现的抖动,所以我们要对这个抖动进行延时,消去抖动

按键代码编写例子

按键点亮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;
}


8H8K64U 发表于 2025-2-27 10:29:43

催更催更

衫正 发表于 2025-3-12 21:19:17

第八集:学习定时器周期性调查

理解如何使用函数及变量,用数组定义变量U16 State={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={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={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 >=500)                                                        //500ms到达
                {
                        Count_ms = 0;
                        P0 = ~State;                                                //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++;
        }
       
}

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





页: [1] 2
查看完整版本: 跟着冲哥学习stc32