20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

news2024/12/27 14:22:37


08第六集:LED闪烁第六集:LED闪烁和花式点灯上和花式点灯上.mp4
09第六集:LED闪烁和花式点灯下.mp4


【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑
2023/7/5 17:36


delay_ms(3000);
刷机的时候如果使用11.0592M的Fosc,3秒钟的延迟大概7秒钟。


刷机的时候如果使用24M的Fosc,3秒钟的延迟大概3.5秒钟。


0、
https://www.stcai.com/syx
实验箱

STC32G实验箱9.6
主控芯片使用STC32G12K128,可以做示波器、波形发生器、TFT彩屏显示、OLED 12864、LCD 12864

代码下载
使用说明 STC32G12K128实验箱-V9.6使用说明书.pdf
原理图


STC32G12K128实验箱-V9.6使用说明书.pdf

例程01:


#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            printf("%03.3f\r\n",1.12);
            printf("%u \r\n",1<<3);
        }
        P40 = 0;    //三极管引脚输出低电平
        
        P60 = 0;    //led0引脚输出低电平
        delay_ms(500);
        
        P60 = 1;
        delay_ms(500);
        
        //SOS_Led();

    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

 晚上拍照效果图:


例程02:


#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            printf("%03.3f\r\n",1.12);
            printf("%u \r\n",1<<3);
        }
        P40 = 0;    //三极管引脚输出低电平
        
        P67 = 0;    //led7引脚输出低电平
        
        P60 = 0;    //led0引脚输出低电平
        delay_ms(500);
        
        P60 = 1;
        delay_ms(500);
        
        //SOS_Led();

    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

晚上拍照效果图:

例程03:


#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            printf("%03.3f\r\n",1.12);
            printf("%u \r\n",1<<3);
        }
        P40 = 0;    //三极管引脚输出低电平
        
        P67 = 0;    //led7引脚输出低电平
        
        P60 = 0;    //led0引脚输出低电平
        delay_ms(500);
        
        P67 = 1;
        P60 = 1;
        delay_ms(500);

        
        //SOS_Led();
    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

晚上拍照效果图:

例程11:累加


#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    int a = 0;
    
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            //printf("%03.3f\r\n",1.12);
            //printf("%u \r\n",1<<3);
            
            do
            {
                printf("a的值为:%d\r\n", a);
                a = a+1;
            }while(a<20);

        }
        //P40 = 0;    //三极管引脚输出低电平
        //
        //P67 = 0;    //led7引脚输出低电平
        //
        //P60 = 0;    //led0引脚输出低电平
        //delay_ms(500);
        //
        //P67 = 1;
        //P60 = 1;
        //delay_ms(500);
        
        //SOS_Led();
    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

串口打印:
[21:17:36.854]发送→1
[21:17:36.867]接收←a的值为:0
                    a的值为:1
                    a的值为:2
                    a的值为:3
                    a的值为:4
                    a的值为:5
                    a的值为:6
                    a的值为:7
                    a的值为:8
                    a的值为:9
                    a的值为:10
                    a的值为:11
                    a的值为:12
                    a的值为:13
                    a的值为:14
                    a的值为:15
                    a的值为:16
                    a的值为:17
                    a的值为:18
                    a的值为:19

[21:17:36.854]发送→31 
[21:17:36.867]接收←61 B5 C4 D6 B5 CE AA A3 BA 30 0D 0A 61 B5 C4 D6 
                    B5 CE AA A3 BA 31 0D 0A 61 B5 C4 D6 B5 CE AA A3 
                    BA 32 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 33 0D 0A 
                    61 B5 C4 D6 B5 CE AA A3 BA 34 0D 0A 61 B5 C4 D6 
                    B5 CE AA A3 BA 35 0D 0A 61 B5 C4 D6 B5 CE AA A3 
                    BA 36 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 37 0D 0A 
                    61 B5 C4 D6 B5 CE AA A3 BA 38 0D 0A 61 B5 C4 D6 
                    B5 CE AA A3 BA 39 0D 0A 61 B5 C4 D6 B5 CE AA A3 
                    BA 31 30 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 31 
                    0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 32 0D 0A 61 
                    B5 C4 D6 B5 CE AA A3 BA 31 33 0D 0A 61 B5 C4 D6 
                    B5 CE AA A3 BA 31 34 0D 0A 61 B5 C4 D6 B5 CE AA 
                    A3 BA 31 35 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 
                    36 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 37 0D 0A 
                    61 B5 C4 D6 B5 CE AA A3 BA 31 38 0D 0A 61 B5 C4 
                    D6 B5 CE AA A3 BA 31 39 0D 0A 


例程12:自加

#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    //int a = 0;
    int a = 10;

    
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            //printf("%03.3f\r\n",1.12);
            //printf("%u \r\n",1<<3);
            
            do
            {
                printf("a的值为:%d\r\n", a);
                //a = a+1;
                a++;
            }while(a<20);

        }
        //P40 = 0;    //三极管引脚输出低电平
        //
        //P67 = 0;    //led7引脚输出低电平
        //
        //P60 = 0;    //led0引脚输出低电平
        //delay_ms(500);
        //
        //P67 = 1;
        //P60 = 1;
        //delay_ms(500);
        
        //SOS_Led();
    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

串口打印:
[21:19:57.629]发送→1
[21:19:57.635]接收←a的值为:10
                    a的值为:11
                    a的值为:12
                    a的值为:13
                    a的值为:14
                    a的值为:15
                    a的值为:16
                    a的值为:17
                    a的值为:18
                    a的值为:19

[21:19:57.629]发送→31 
[21:19:57.635]接收←61 B5 C4 D6 B5 CE AA A3 BA 31 30 0D 0A 61 B5 C4 
                    D6 B5 CE AA A3 BA 31 31 0D 0A 61 B5 C4 D6 B5 CE 
                    AA A3 BA 31 32 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 
                    31 33 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 34 0D 
                    0A 61 B5 C4 D6 B5 CE AA A3 BA 31 35 0D 0A 61 B5 
                    C4 D6 B5 CE AA A3 BA 31 36 0D 0A 61 B5 C4 D6 B5 
                    CE AA A3 BA 31 37 0D 0A 61 B5 C4 D6 B5 CE AA A3 
                    BA 31 38 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 39 
                    0D 0A 


例程13:自加-自减

#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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


void main()                    //程序开始运行的入口
{
    //int a = 0;
    int a = 10;

    
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            //printf("%03.3f\r\n",1.12);
            //printf("%u \r\n",1<<3);
            
            //do
            //{
            //    printf("a的值为:%d\r\n", a);
            //    //a = a+1;
            //    a++;
            //}while(a<20);
            
            a = 10;
            printf("a的值为:%d\r\n", a);
            printf("a的值为:%d\r\n", --a);
            printf("a的值为:%d\r\n", a);
            
            printf("\r\n");
            
            a = 10;
            printf("a的值为:%d\r\n", a);
            printf("a的值为:%d\r\n", a--);
            printf("a的值为:%d\r\n", a);
            
            printf("\r\n");
            
            
            a = 20;
            printf("a的值为:%d\r\n", a);
            printf("a的值为:%d\r\n", ++a);
            printf("a的值为:%d\r\n", a);
            
            printf("\r\n");
            
            a = 20;
            printf("a的值为:%d\r\n", a);
            printf("a的值为:%d\r\n", a++);
            printf("a的值为:%d\r\n", a);

        }
        //P40 = 0;    //三极管引脚输出低电平
        //
        //P67 = 0;    //led7引脚输出低电平
        //
        //P60 = 0;    //led0引脚输出低电平
        //delay_ms(500);
        //
        //P67 = 1;
        //P60 = 1;
        //delay_ms(500);
        
        //SOS_Led();
    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

串口打印:
[21:22:50.414]发送→1
[21:22:50.424]接收←a的值为:10
                    a的值为:9
                    a的值为:9
                    
                    a的值为:10
                    a的值为:10
                    a的值为:9
                    
                    a的值为:20
                    a的值为:21
                    a的值为:21
                    
                    a的值为:20
                    a的值为:20
                    a的值为:21


[21:22:50.414]发送→31 
[21:22:50.424]接收←61 B5 C4 D6 B5 CE AA A3 BA 31 30 0D 0A 61 B5 C4 
                    D6 B5 CE AA A3 BA 39 0D 0A 61 B5 C4 D6 B5 CE AA 
                    A3 BA 39 0D 0A 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 
                    31 30 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 31 30 0D 
                    0A 61 B5 C4 D6 B5 CE AA A3 BA 39 0D 0A 0D 0A 61 
                    B5 C4 D6 B5 CE AA A3 BA 32 30 0D 0A 61 B5 C4 D6 
                    B5 CE AA A3 BA 32 31 0D 0A 61 B5 C4 D6 B5 CE AA 
                    A3 BA 32 31 0D 0A 0D 0A 61 B5 C4 D6 B5 CE AA A3 
                    BA 32 30 0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 32 30 
                    0D 0A 61 B5 C4 D6 B5 CE AA A3 BA 32 31 0D 0A 


例程21:【简单四则运算的】函数调用

#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明

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

int Add(int parm1, parm2)
{
    return parm1 + parm2;
}

int Sub(int parm1, parm2)
{
    return parm1 - parm2;
}

int Mul(int parm1, parm2)
{
    return parm1 * parm2;
}

void main()                    //程序开始运行的入口
{
    //int a = 0;
    int a = 10;
    
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            //printf("%03.3f\r\n",1.12);
            //printf("%u \r\n",1<<3);
            
            printf("计算Add(1, 2)结果为:%d\r\n", Add(1, 2));
            printf("计算Sub(5, 2)结果为:%d\r\n", Sub(5, 2));
            printf("计算Mul(5, 3)结果为:%d\r\n", Mul(5, 3));

        }
        //P40 = 0;    //三极管引脚输出低电平
        //
        //P67 = 0;    //led7引脚输出低电平
        //
        //P60 = 0;    //led0引脚输出低电平
        //delay_ms(500);
        //
        //P67 = 1;
        //P60 = 1;
        //delay_ms(500);
        
        //SOS_Led();
    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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

警告信息:
Rebuild target 'Target 1'
compiling Demo.c...
Demo.c(28): warning C35: 'Add': uses old-style declarator
Demo.c(33): warning C35: 'Sub': uses old-style declarator
Demo.c(38): warning C35: 'Mul': uses old-style declarator
linking...
Program Size: data=8.3 edata+hdata=420 xdata=192 const=122 code=7113
creating hex file from ".\Objects\Demo"...
".\Objects\Demo" - 0 Error(s), 3 Warning(s).
Build Time Elapsed:  00:00:01

串口打印:
[19:59:34.243]发送→1
[19:59:34.256]接收←计算Add(1, 2)结果为:3
                    计算Sub(5, 2)结果为:3
                    计算Mul(5, 3)结果为:15

[19:59:34.243]发送→31 
[19:59:34.256]接收←BC C6 CB E3 41 64 64 28 31 2C 20 32 29 BD E1 B9 
                    FB CE AA A3 BA 33 0D 0A BC C6 CB E3 53 75 62 28 
                    35 2C 20 32 29 BD E1 B9 FB CE AA A3 BA 33 0D 0A 
                    BC C6 CB E3 4D 75 6C 28 35 2C 20 33 29 BD E1 B9 
                    FB CE AA A3 BA 31 35 0D 0A 


例程31:SOS信号的LED表达
【请注意,请配置开发板的晶振为24MHz。如果使用默认的11.0592MHz,间隔时间大概加倍!^_】

sos 
国际摩尔斯电码救难信号

发信号的方法编辑 播报
有几种不同的发信号方法,不过采用何种方式取决于你的情形和你可用的材料。
通用远程表达方式:
求救方式一:发出声响,三短三长三短(. . . _ _ _ . . .)莫尔斯电码。
求救方式二:灯光,如手电,三短三长三短(开关灯)。
亮200、灭200、亮200、灭200、亮200、灭500、亮400、灭200、亮400、灭200、亮400、灭500、亮200、灭200、亮200、灭200、亮200、灭1300(MS)循环低电平LED亮。

#include "COMM/stc.h"        //调用头文件
#include "COMM/usb.h"

#define MAIN_Fosc 24000000L  // 定义一个IRC系统时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
    
//sbit P40 = P4^0;    //三极管控制引脚
//sbit P60 = P6^0;    //LED控制引脚
//sbit P61 = P6^1;    //LED控制引脚

void sys_init();    //函数声明


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


void SOS_Led(void)
{
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    //delay_ms(200);
    delay_ms(500);
    

    P60 = 0;            //点亮
    delay_ms(400);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(400);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(400);
    P60 = 1;            //熄灭
    delay_ms(500);
    
    
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    delay_ms(200);
    
    P60 = 0;            //点亮
    delay_ms(200);
    P60 = 1;            //熄灭
    delay_ms(1300);
    //delay_ms(200);    
    
    //delay_ms(3000);    
    
}


void main()                    //程序开始运行的入口
{
    //int a = 0;
    int a = 10;

    
    sys_init();                //USB功能+IO口初始化
    usb_init();                //usb库初始化
    EA = 1;                    //CPU开放中断,打开总中断。
    
    while(1)        //死循环
    {
        if( DeviceState != DEVSTATE_CONFIGURED )     //
            continue;
        if( bUsbOutReady )                                
        {
            usb_OUT_done();
            //printf("%03.3f\r\n",1.12);
            //printf("%u \r\n",1<<3);
            
            //printf("计算Add(1, 2)结果为:%d\r\n", Add(1, 2));
            //printf("计算Sub(5, 2)结果为:%d\r\n", Sub(5, 2));
            //printf("计算Mul(5, 3)结果为:%d\r\n", Mul(5, 3));
        }
        P40 = 0;    //三极管引脚输出低电平
        
        SOS_Led();

        //
        //P67 = 0;    //led7引脚输出低电平
        //
        //P60 = 0;    //led0引脚输出低电平
        //delay_ms(500);
        //
        //P67 = 1;
        //P60 = 1;
        //delay_ms(500);

    }
}


void sys_init()        //函数定义
{
    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;   //设置为准双向口
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

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


参考资料:
http://stcmcudata.com/
https://www.stcai.com/jxsp
演示视频
实验箱-STC32G12K128 教学视频
屠龙刀-STC32G12K128 教学视频


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ardupilot学习笔记

参考文献 【1】https://ardupilot.org 主打的就是一个炫酷 自驾仪 Ardupilot 一套开源的自驾仪&#xff0c;集成了各种各样的代码&#xff0c;包括其他开源代码(如PX4代码)和项目、驱动等。 即&#xff1a;自驾仪即集成了整个可以实现无人载具&#xff08;如无人机&#xff…

Day_61-62 决策树

目录 Day_61-62决策树(准备工作) 一. 算法的基本概念 1. 决策树的定义 2. 如何构建决策树&#xff1f; 2.1 熵 2.2 信息增益原则 2.3 计算步骤 二. 示例演示 1. 第一次节点决策分类&#xff1a; 2. 后续节点的决策分类 3. 决策分类的结束条件 三. 代码实现 1. 主函数 2. 两个构…

Matlab把两个不同的x轴和y轴画在同一个图里

我们知道画两个y轴可以用yyaxis. 那么画两个x轴呢? 这时候可以用神奇的tiledlayout. % 创建两组数据 x1 0:0.1:40; y1 4.*cos(x1)./(x12); x2 1:0.2:20; y2 x2.^2./x2.^3;t tiledlayout(1,1); % 创建一个tiledlayout % 第一个坐标系 ax1 axes(t); % 创建坐标系, 指定t为…

Go语言MinGW的安装

Go语言MinGW的安装 相比在 Linux 平台上安装 GCC 编译环境&#xff0c;在 Windows 平台上安装 MinGW 是比较简单的&#xff0c;只需经历以下几个过 程。 1、MINGW32位安装 1、打开 [MinGW 官网] https://osdn.net/projects/mingw/&#xff0c;下载 MinGW 安装包。 点击即可…

个人对于SAR的粗浅理解

个人对于SAR的粗浅理解 有同学问我是做成像的&#xff0c;让我解释一下SAR成像&#xff0c;我思索了一下&#xff0c;决定这样简单回答&#xff1a; 首先SAR的全称为Synthetic Aperture Radar&#xff0c;即合成孔径雷达&#xff0c;本质还是一种Radar 合成孔径&#xff0c;其…

CSS 制作动态蚂蚁线

效果&#xff1a; 代码&#xff1a; <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <style type"text/css"> .line{position:relative;margin-bottom: 5px;width: 1200px;height: …

【电商API接口系列】关键词搜索商品列表,品牌监控场景

API接口允许不同应用程序之间共享数据&#xff0c;在系统之间传输、读取和更新数据。例如&#xff0c;一个电商网站可以通过API接口获取支付系统的支付状态。API接口允许开发人员使用他人开发的功能来扩展自己的应用程序。通过调用第三方API接口&#xff0c;开发人员无需重新实…

我的创作纪念日兼GPT模型简单介绍

目录 一、引言 二、收获与开端 2.1 问题&#xff1a;在创作的过程中都有哪些收获&#xff1f; 2.2 模型开端 三、日常与深入 3.1 问题&#xff1a;当前创作和你的学习是什么样的关系&#xff1f; 3.2 模型深入介绍 3.2.1 无监督预训练 3.2.2 有监督下游任务精调 四、…

自动驾驶产业链躁动,四维图新能否做好新时代“Tier 1”?

自动驾驶行业的“劲风”又来了。 6月21日&#xff0c;工信部副部长辛国斌在国务院政策例行吹风会上表示&#xff0c;将启动智能网联汽车准入和上路通行试点&#xff0c;他强调&#xff0c;“这里面讲的是L3级&#xff0c;及更高级别的自动驾驶功能商业化应用”。此前工信部曾透…

C#实现低耦合读卡

我们经常要给用户实现读卡查询。有很多种读卡器&#xff0c;每个厂商的接口也不同。归纳为两类&#xff0c;一类是感应式读卡&#xff0c;卡片接触上去就读出数据。一种是触发式的&#xff0c;程序调用读卡方法&#xff0c;硬件再进入读卡轮询。对应触发式的只能加按钮触发了&a…

技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别

Toast 是 Android 系统中的一种消息框类型&#xff0c;它属于一种轻量级的消息提示&#xff0c;常常以小弹框的形式出现&#xff0c;一般出现 1 到 2 秒会自动消失&#xff0c;可以出现在屏幕上中下任意位置。它不同于 Dialog&#xff0c;它没有焦点。Toast 的设计思想是尽可能…

不要再纠结了!看完这篇,你就能秒懂webpack、vite、rollup三者间差异!

前端打包工具webpack、vite、rollup的区别及使用 webpack、vite、rollup的区别webpack、vite的区别为什么vite比webpack打包快&#xff1f;为什么有人会说vite慢&#xff1f;首屏问题懒加载问题解决方案注意点 webpackwebpack打包过程webpack打包原理第一次冷启动慢的原因热更新…

在yolov5源码中添加注意力机制

yolov5源码中添加注意力机制 1 项目环境配置1.1 yolov5 源码下载1.2 创建虚拟环境1.3 安装依赖 2 常用的注意力机制2.1 SE 注意力机制2.2 CBAM 注意力机制2.3 ECA 注意力机制2.4 CA 注意力机制 3 添加方式3.1 修改 common.py 文件3.2 修改 yolo.py 文件3.3 修改 yolov5s.yaml 文…

易查分如何导入数据?这个最关键的要点别忽略

我们在使用易查分制作查询系统时&#xff0c;偶尔会遇到Excel文件没有办法正常上传的情况。这个问题困扰着许多老师&#xff0c;他们不知道该如何解决。今天我想和大家讨论一下&#xff0c;易查分导入数据时最常出现错误的原因&#xff0c;其中这个要点最关键&#xff0c;但很多…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型&#xff0c;也称为对话式 AI 或聊天机器人&#xff0c;经过训练&#xff0c;内容丰富且全面。Bard 接受过大量…

Mysql——》哈希索引

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

接口测试-postman,JMeter与LoadRunner比较

目录 JMeter与LoadRunner比较 JMeter缺点 一.创建测试用例集、子集 二.创建测试用例 三.设置变量 四.添加响应处理 五.批量执行测试用例 总结&#xff1a; postman是一个谷歌出的轻量级的专门测试接口的小工具~&#xff08;PS&#xff1a;postman包括两种&#xff1a;C…

PostgreSQL如何根据执行计划进行性能调优?

EXPLAIN命令 PG中EXPLAIN命令语法格式如下&#xff1a; EXPLAIN [(option[,...])] statement EXPLAIN [ANALYZE] [VERBOSE] statement该命令的options如下&#xff1a; ANALYZE [boolean]VERBOSE [boolean]COSTS [boolean]BUFFERS [boolean]FORMAT {TEXT | XML | JSON | YAM…

【UnityDOTS 十】DynamicBufferComponent介绍

DynamicBufferComponent 前言 DynamicBufferComponent 作为一种特殊的组件存在&#xff0c;可以作为一种非托管内存下可动态调整带下的数组容器组件。 一、DynamicBufferComponent是什么&#xff1f; DynamicBufferComponent也是组件的一种。 需要关注的是内部指针&#xf…

spring使用01

① 导入 Spring 开发的基本包坐标 ② 编写 Dao 接口和实现类 ③ 创建 Spring 核心配置文件 ④ 在 Spring 配置文件中配置 UserDaoImpl ⑤ 使用 Spring 的 API 获得 Bean 实例 第一步&#xff1a;创建maven的web骨架 然后&#xff0c;导入 Spring 开发的基本包坐标 <depe…