wb4916 发表于 2023-7-5 21:51:59

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

本帖最后由 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秒钟。











刷机的时候如果使用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;
}




串口打印:
发送→1
接收←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

发送→31
接收←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;
}



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

发送→31
接收←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;
}



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


发送→31
接收←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




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

发送→31
接收←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亮。









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


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



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


页: [1]
查看完整版本: 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑【重制版本】