找回密码
 立即注册
查看: 740|回复: 0

【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑【重制版本】

[复制链接]

6

主题

3

回帖

56

积分

注册会员

积分
56
发表于 2023-7-5 21:51:59 | 显示全部楼层 |阅读模式
本帖最后由 wb4916 于 2023-7-6 10:45 编辑

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


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


delay_ms(3000);
刷机的时候如果使用11.0592M的Fosc,3秒钟的延迟大概7秒钟。
05 24M QQ图片20230705174043.png





02 7s QQ图片20230705174029.jpg




刷机的时候如果使用24M的Fosc,3秒钟的延迟大概3.5秒钟。
05 24M QQ图片20230705174043.png


06 3秒钟 QQ图片20230705174055.jpg


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

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

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


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





例程01:
11.png


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


61 QQ图片20230705214325.jpg

62 亮 QQ图片20230705214336.jpg




例程02:
22.png


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



65 顶灯亮 QQ图片20230705214347.jpg


66 亮双灯 QQ图片20230705214409.jpg



例程03:
33.png

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


61 QQ图片20230705214325.jpg


66 亮双灯 QQ图片20230705214409.jpg



例程11:累加
11 QQ图片20230705205134.png

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


12 QQ图片20230705205147.png

串口打印:
[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:自加
21 QQ图片20230705205211.png


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

22 QQ图片20230705205221.png

串口打印:
[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:自加-自减
31 QQ图片20230705205233.png


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

33 QQ图片20230705205243.png

串口打印:
[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:【简单四则运算的】函数调用
41 QQ图片20230705205302.png


42 QQ图片20230705205332.png

#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

45 QQ图片20230705205312.png


串口打印:
[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,间隔时间大概加倍!^_】


https://baike.baidu.com/item/sos/656?fr=ge_ala
sos
国际摩尔斯电码救难信号

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


81 SOS QQ图片20230705210946.png


82 SOS QQ图片20230705210957.png


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





96 SOS c8ea15ce36d3d5392dec8faa3087e950342ab082.png

95 SOS 024f78f0f736afc3bcb82099ba19ebc4b6451291.jpg




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


【下面的图片怎么干掉呀?】



【下面的图片怎么干掉呀?】


11 单灯 微信图片_20230703205220.png
21 间隔灯 微信图片_20230703205429.png
31 8个灯 微信图片_20230703205503.png
01 11M时钟 QQ图片20230705174014.png
11.png
22.png
33.png
11 QQ图片20230705205134.png
12 QQ图片20230705205147.png
21 QQ图片20230705205211.png
22 QQ图片20230705205221.png
31 QQ图片20230705205233.png
33 QQ图片20230705205243.png
41 QQ图片20230705205302.png
42 QQ图片20230705205332.png
45 QQ图片20230705205312.png
81 SOS QQ图片20230705210946.png
82 SOS QQ图片20230705210957.png
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 01:01 , Processed in 0.117147 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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