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


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 教学视频


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode周赛】2022上半年题目精选集——思维题

文章目录 2211. 统计道路上的碰撞次数&#xff08;栈 || 脑筋急转弯&#xff09;解法1&#xff1a;自己想的——使用栈解法2——思维&#xff1a;去掉左右两边往左右开的车代码写法1——找左右端点代码写法2——正则表达式去除流处理api补充&#xff1a;replaceAll() 和 正则表…

python图像处理实战(三)—图像几何变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

c语言修炼之猜数字游戏

前言 小伙伴们&#xff0c;今天来学习猜数字游戏叭&#xff01;废话不多说&#xff0c;让我们一起开始学习叭! 思路&#xff1a; 一打开游戏就出现一个菜单然后可以让我们选择是进入游戏还是退出游戏&#xff01; #include<stdio.h> void menu() {printf("*****…

【MySQL】基本查询之表的增删改查

【MySQL】表的增删改查 一、插入操作----insert1.1 简单插入1.2 插入时是否更新----ON DUPLICATE KEY UPDATE1.3 插入时替换----REPLACE 二、查询----select2.1 简单查询与去重2.2 基本查询----where条件2.2.3 案列演示 2.4 排序----order by 三、修改操作----update四、删除--…

Lua学习笔记:浅谈table的实现

前言 本篇在讲什么 Lua中的table的实现 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…

大数据Doris(五十三):MySQL Dump 导出

文章目录 MySQL dump 导出 一、Dump导出案例 二、注意事项 MySQL Dump 导出 mysqldump是一个常用的 MySQL 数据库备份工具&#xff0c;它可以将 MySQL 数据库中的数据导出为 SQL 格式的文件&#xff0c;从而实现对数据的备份、迁移和恢复等操作。Doris 在0.15 之后的版本已…

青岛大学_王卓老师【数据结构与算法】Week04_03_双向链表_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

Spring Boot 集成 Redisson分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

Oracle数据库软件安装与卸载

Oracle数据库软件安装与卸载 实验目的及要求 学习Oracle12c数据库服务器软件和客户端软件的安 装与卸载,掌握客户端服务名的设置,建立客户端与服务器的网络连接,熟悉windows操作系统中Oracle相关服务的操作。理解数据库管理的基本架构。 &#xff08;1&#xff09;熟悉Oracle…

基于SpringBoot+SpringCloud+vue的智慧养老平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

虚拟机上用docker + nginx跑前端并支持https和http

情况是这样&#xff0c;我在虚拟机上&#xff0c;使用docker跑前端&#xff0c;需要这个前端支持https&#xff0c;原http的话自动跳转到https。另外&#xff0c;前端部署使用了负载均衡&#xff0c;即使用了3个docker跑前端&#xff1a;1个入口&#xff0c;另外2个是前端&…

【macOS 系列】mac设置截屏或其他操作的默认保存位置

1、第一步、在用户/图片文件夹下&#xff0c;新建“截图”文件夹 2、第二步、打开终端&#xff0c;输入defaults write com.apple.screencapture location ~/Pictures/截图/后回车 3、第三步、操作完成后&#xff0c;再次输入killall SystemUIServer后回车 如果你在web前端开发…

clickhouse中时间戳转换--网上都没有,自己总结的

第一种&#xff1a; 库里时间戳为13位时&#xff1a; 类似这种13位的时间戳&#xff1a;1476141341051 怎么转换成正常的日期&#xff1a; 如果库里存的string类型&#xff0c;需要toUInt64(date_time) date_time的值为&#xff1a;1476141341051 然后利用toDateTime&…

远古 Windows 98 SE 和 putty 0.63 连接 SSH

远古 Windows 98 SE 和 putty 0.63 连接 SSH 不忘初心一、故障表现二、产生原因三、解决办法四、重启 SSHD 服务生交配置参考 作者&#xff1a;高玉涵 时间&#xff1a;2023.7.1 操作系统&#xff1a; Windows 98 第二版 4.10.2222 A Linux version 5.19.0-32-generic (build…

Redis实战——商户查询(二)

缓存穿透 缓存穿透 &#xff1a;客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这样的请求都会访问到数据库&#xff0c;这样的大量请求同时过来访问这种不存在的数据&#xff0c;这些请求就都会访问到数据库&#xff0c;对数据库造…

基于smardaten无代码开发舆情分析系统

一、前言 在日常生活中&#xff0c;有各种各样的资讯、社交平台。这些平台充斥着大量信息&#xff0c;这些信息中隐含了许多有用数据&#xff0c;但是这些数据无法之间获取&#xff0c;且难以展示&#xff0c;于是就有了舆情分析系统。 舆情分析系统是一个综合的系统&#xf…

基于minsit数据集的图像分类任务|CNN简单应用项目

Github地址 Image-classification-task-based-on-minsit-datasethttps://github.com/Yufccode/CollegeWorks/tree/main/ImageProcessing/Image-classification-task-based-on-minsit-dataset README 摘要 本次实验报告用两种方式完成了基于minst数据集完成了图像的分类任务…

被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了

前言 忙里偷闲学习了点技术写了点demo代码&#xff0c;打算提交到我那 2000Star 的Github仓库上&#xff0c;居然发现有5个Issues&#xff0c;最近的一条日期已经是2022/8/1了&#xff0c;以前我还真没留意过这些&#xff0c;我这人懒得很&#xff0c;本地代码提交成功基本就不…

Python dict keys方法:获取字典中键的序列【将keys转为list】

描述 dict.keys()方法是Python的字典方法&#xff0c;它将字典中的所有键组成一个可迭代序列并返回。 使用示例 >>> list({Chinasoft:China, Microsoft:USA}.keys()) [Chinasoft, Microsoft] >>> test_dict {Chinasoft:China, Microsoft:USA, Sony:Japan,…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

文章目录 一、检测相关(15篇)1.1 Artifacts Mapping: Multi-Modal Semantic Mapping for Object Detection and 3D Localization1.2 Shi-NeSS: Detecting Good and Stable Keypoints with a Neural Stability Score1.3 HODINet: High-Order Discrepant Interaction Network for…