找回密码
 立即注册
查看: 184|回复: 8

学习点亮第一颗灯心得

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-19 21:11:30 | 显示全部楼层 |阅读模式
跟着老师的操作一步一步自己实践,点亮了第一颗灯, 很神奇。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-19 21:20:13 | 显示全部楼层

学习心得

#include <AI8051U.H>
#include <ai_usb.h>

#define MAIN_Fose 40000000ul

unsigned char ucLed = 0x01;
unsigned char n;

void delay(unsigned int xms)
{
    unsigned int i;
    do{
        i=MAIN_Fose / 6000;
        while(i--);
    }while(xms--);
}

void main()
{    EAXFR = 1;
    WTST = 0;
    CKCON = 0;
   
    P2M1 = 0;
    P2M0 = 0;
   
    usb_init();
    EA = 1;
   
    P2 = 0x01;    //1111 0000
    while(1)
    {
        if(bUsbOutReady)
            {
                usb_OUT_done();
            }
        for(n = 0;n < 8;n++)
        {
            ucLed = 1 << n;
            P2 = ~ucLed;
            delay(500);
        }
    }
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

836

主题

1万

回帖

2万

积分

管理员

积分
22182
发表于 2025-12-19 22:22:50 | 显示全部楼层
发在 同一个贴
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2026-02-10 13:19:40

22

主题

89

回帖

913

积分

版主

积分
913
发表于 2025-12-20 08:31:14 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96L 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf

推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-28 13:43:04 | 显示全部楼层

学习心得

usb不下电[img][/img]
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. char *USER_DEVICEDESC = NULL;
  4. char *USER_PRODUCTDESC = NULL;
  5. char *USER_STCISPCMD = "@STCISP#";
  6. void main(void)
  7. {
  8.     P_SW2 |= 0x80;                //B7位写1,使能访问XFR
  9.        
  10.     P0M1 = 0x00;   P0M0 = 0x00;
  11.     P1M1 = 0x00;   P1M0 = 0x00;
  12.     P2M1 = 0x00;   P2M0 = 0x00;
  13.     P3M1 = 0x00;   P3M0 = 0x00;
  14.     P4M1 = 0x00;   P4M0 = 0x00;
  15.     P5M1 = 0x00;   P5M0 = 0x00;
  16.     P6M1 = 0x00;   P6M0 = 0x00;
  17.     P7M1 = 0x00;   P7M0 = 0x00;
  18.        
  19.         usb_init();                                     //USB CDC 接口配置
  20.     IE2 |= 0x80;                                    //使能USB中断
  21.     EA = 1;                                                                                        //IE |= 0X80;
  22.        
  23.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  24.        
  25.         while(1)
  26.         {
  27.                
  28.         if (bUsbOutReady)
  29.         {
  30.             USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  31.             
  32.             usb_OUT_done();
  33.         }
  34.                
  35.                 P40 = 0;        //P40端口输出0V
  36.                 P00 = 0;        //P00端口输出0V
  37.                 P02 = 0;        //P02端口输出0V
  38.         }
  39. }[b][/b]
复制代码
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-28 14:44:53 | 显示全部楼层

学习心得

使用用Aicube学习Usb不下电下载  处理数据方式查询方式,和中断方式

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2025-12-28) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  17. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  18. ////////////////////////////////////////
  19. // 项目主函数
  20. // 入口参数: 无
  21. // 函数返回: 无
  22. ////////////////////////////////////////
  23. void main(void)
  24. {
  25.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  26.     // 在此添加用户主函数初始化代码  
  27.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  28.     SYS_Init();
  29.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  30.     // 在此添加主函数中运行一次的用户代码  
  31.     //<<AICUBE_USER_MAIN_CODE_END>>
  32.     while (1)
  33.     {
  34.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  35.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  36.         // 在此添加主函数中用户主循环代码  
  37.         //<<AICUBE_USER_MAIN_LOOP_END>>
  38.     }
  39. }
  40. ////////////////////////////////////////
  41. // 系统初始化函数
  42. // 入口参数: 无
  43. // 函数返回: 无
  44. ////////////////////////////////////////
  45. void SYS_Init(void)
  46. {
  47.     EnableAccessXFR();                  //使能访问扩展XFR
  48.     AccessCodeFastest();                //设置最快速度访问程序代码
  49.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  50.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  51.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  52.     // 在此添加用户预初始化代码  
  53.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  54.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  55.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  56.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  57.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  58.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  59.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  60.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
  61.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式
  62.     delay_ms(1);
  63.     USBLIB_Init();                      //USB库初始化
  64.     delay_ms(1);
  65.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  66.     // 在此添加用户初始化代码  
  67.     //<<AICUBE_USER_INITIAL_CODE_END>>
  68.     EnableGlobalInt();                  //使能全局中断
  69. }
  70. ////////////////////////////////////////
  71. // 微秒延时函数
  72. // 入口参数: us (设置延时的微秒值)
  73. // 函数返回: 无
  74. ////////////////////////////////////////
  75. void delay_us(uint16_t us)
  76. {
  77.     do
  78.     {
  79.         NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  80.     } while (--us);
  81. }
  82. ////////////////////////////////////////
  83. // 毫秒延时函数
  84. // 入口参数: ms (设置延时的毫秒值)
  85. // 函数返回: 无
  86. ////////////////////////////////////////
  87. void delay_ms(uint16_t ms)
  88. {
  89.     uint16_t i;
  90.     do
  91.     {
  92.         i = MAIN_Fosc / 6000;
  93.         while (--i);
  94.     } while (--ms);
  95. }
  96. ////////////////////////////////////////
  97. // USB库初始化函数
  98. // 入口参数: 无
  99. // 函数返回: 无
  100. ////////////////////////////////////////
  101. void USBLIB_Init(void)
  102. {
  103.     usb_init();                         //初始化USB模块
  104.     USB_SetIntPriority(0);              //设置中断为最低优先级
  105.     set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
  106.     //<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
  107.     // 在此添加用户初始化代码  
  108.     //<<AICUBE_USER_USBLIB_INITIAL_END>>
  109. }
  110. ////////////////////////////////////////
  111. // 等待USB配置完成函数
  112. // 入口参数: 无
  113. // 函数返回: 无
  114. ////////////////////////////////////////
  115. void USBLIB_WaitConfiged(void)
  116. {
  117.     while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
  118.         WDT_Clear();                    //清看门狗定时器 (防止硬件自动使能看门狗)
  119. }
  120. ////////////////////////////////////////
  121. // USB设备接收数据处理程序
  122. // 入口参数: 无
  123. // 函数返回: 无
  124. // bUsbOutReady:USB设备接收数据标志位
  125. // OutNumber:USB设备接收到的数据长度
  126. // UsbOutBuffer:保存USB设备接收到的数据
  127. ////////////////////////////////////////
  128. void USBLIB_OUT_Done(void)
  129. {
  130.     if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
  131.     {
  132.         //<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
  133.         // 在此添加中断函数用户代码  
  134.         //USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
  135.         // 在此处添加用户处理接收数据的代码
  136.                 if (UsbOutBuffer[0] == 6)
  137.                         printf_usb("Hello World !\r\n");
  138.                 else if (UsbOutBuffer[0] == 7)
  139.                         printf_usb("China !\r\n");
  140.         //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
  141.         usb_OUT_done();                 //当前包的数据处理完成,通知USB主机可以发送下一包数据
  142.     }
  143. }
  144. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  145. // 在此添加用户函数实现代码  
  146. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码







回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-28 16:17:08 | 显示全部楼层

学习第五集心得

%s,输出字符串
%d,十进制整数输出
%ld,十进制长整数输出
\t,回车
ASCII码
进制转化
1        2        3        4        5        6        7        8        9       10       11      12      13      14       15         //十进制
1        2        3        4        5        6        7        8        9        A        B        C        D        E        F        //十六进制
64位变量  需声明 #pragma float64
char (0~255)
int (0~65535)
#define u8 unsigned char
u8 x;                //等于unsigned char x;

常用运算符
&
^
|
~
>>
<<

  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #define u8 unsigned char                //8位无符号变量(0-255)
  4. #define u16 unsigned int                //16位无符号变量(0-65535)
  5. u8 X = 20;
  6. u8 Y = 11;
  7. char *USER_DEVICEDESC = NULL;
  8. char *USER_PRODUCTDESC = NULL;
  9. char *USER_STCISPCMD = "@STCISP#";
  10. void main(void)
  11. {
  12.     P_SW2 |= 0x80;                //B7位写1,使能访问XFR
  13.        
  14.     P0M1 = 0x00;   P0M0 = 0x00;
  15.     P1M1 = 0x00;   P1M0 = 0x00;
  16.     P2M1 = 0x00;   P2M0 = 0x00;
  17.     P3M1 = 0x00;   P3M0 = 0x00;
  18.     P4M1 = 0x00;   P4M0 = 0x00;
  19.     P5M1 = 0x00;   P5M0 = 0x00;
  20.     P6M1 = 0x00;   P6M0 = 0x00;
  21.     P7M1 = 0x00;   P7M0 = 0x00;
  22.        
  23.         usb_init();                                     //USB CDC 接口配置
  24.     IE2 |= 0x80;                                    //使能USB中断
  25.     EA = 1;                                                                                        //IE |= 0X80;
  26.        
  27.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  28.        
  29.         while(1)
  30.         {
  31.                
  32.         if (bUsbOutReady)                                                        //如果接受到了数据
  33.         {
  34.                         //USB_SendData(UsbOutBuffer,OutNumber);        //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  35.                         if(X && Y)                                                                        //如果条件为真,就输出什么       
  36.                         {       
  37.                                 printf("条件为真\r\n");
  38.                         }
  39.                         else
  40.                         {
  41.                                 printf("条件为假\r\n");
  42.                         }
  43. //                        printf("X / Y = %u \r\n",(u16)(X/Y));        //取整
  44. //                        printf("X %% Y = %u \r\n",(u16)(X%Y));        //取余数
  45.                        
  46.             usb_OUT_done();
  47.         }
  48.                
  49.                 //P40 = 0;        //P40端口输出0V
  50.                 //P02 = 0;        //P02端口输出0V
  51.                 //P01 = 0;        //P01端口输出0V
  52.                 //
  53.         }
  54. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2025-12-31 19:14:53 | 显示全部楼层

使用AiCube做RTC实验

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2025-12-31) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明
  17. //定义中断标志位(闹钟中断、天中断、小时中断、分钟中断、秒钟中断);
  18. bit fAlarm = 0; //RTC 闹钟查询标志,在中断程序中设置,主循环中查询并清除
  19. bit fDay = 0; //RTC 天查询标志,在中断程序中设置,主循环中查询并清除
  20. bit fHour = 0; //RTC 小时查询标志,在中断程序中设置,主循环中查询并清除
  21. bit fMinute = 0; //RTC 分钟查询标志,在中断程序中设置,主循环中查询并清除
  22. bit fSecond = 0; //RTC 秒钟查询标志,在中断程序中设置,主循环中查询并清除
  23. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  24. ////////////////////////////////////////
  25. // 项目主函数
  26. // 入口参数: 无
  27. // 函数返回: 无
  28. ////////////////////////////////////////
  29. void main(void)
  30. {
  31.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  32.     // 在此添加用户主函数初始化代码  
  33.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  34.     SYS_Init();
  35.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  36.     // 在此添加主函数中运行一次的用户代码  
  37.     //<<AICUBE_USER_MAIN_CODE_END>>
  38.     while (1)
  39.     {
  40.         //USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  41.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  42.         // 在此添加主函数中用户主循环代码
  43.                 if (fAlarm) //判断闹钟查询标志
  44.                 {
  45.                         fAlarm = 0; //清除闹钟查询标志
  46.                         printf_usb("闹钟中断\r\n");
  47.                 }
  48.                 if (fDay) //判断天查询标志
  49.                 {
  50.                         fDay = 0; //清除天查询标志
  51.                         printf_usb("RTC 天中断\r\n");
  52.                 }
  53.                 if (fHour) //判断小时查询标志
  54.                 {
  55.                         fHour = 0; //清除小时查询标志
  56.                         printf_usb("RTC 小时中断\r\n");
  57.                 }
  58.                 if (fMinute) //设置分钟查询标志
  59.                 {
  60.                         fMinute = 0; //清除分钟查询标志
  61.                         printf_usb("RTC 分钟中断\r\n");
  62.                 }
  63.                 if (fSecond) //设置秒查询标志
  64.                 {       
  65.                 fSecond = 0; //清除秒查询标志
  66.                 printf_usb("RTC 秒中断\r\n");
  67.                 printf_usb("20%d-%d-%d %d:%d:%d\r\n",RTC_ReadYear(),
  68.                                                                                         RTC_ReadMonth(),
  69.                                                                                         RTC_ReadDay(),
  70.                                                                                         RTC_ReadHour(),
  71.                                                                                         RTC_ReadMinute(),
  72.                                                                                         RTC_ReadSecond());
  73. }
  74.         //<<AICUBE_USER_MAIN_LOOP_END>>
  75.     }
  76. }
  77. ////////////////////////////////////////
  78. // 系统初始化函数
  79. // 入口参数: 无
  80. // 函数返回: 无
  81. ////////////////////////////////////////
  82. void SYS_Init(void)
  83. {
  84.     EnableAccessXFR();                  //使能访问扩展XFR
  85.     AccessCodeFastest();                //设置最快速度访问程序代码
  86.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  87.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  88.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  89.     // 在此添加用户预初始化代码  
  90.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  91.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  92.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  93.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  94.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  95.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  96.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  97.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
  98.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式
  99.     RTC_Init();                         //RTC初始化
  100.     delay_ms(1);
  101.     USBLIB_Init();                      //USB库初始化
  102.     delay_ms(1);
  103.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  104.     // 在此添加用户初始化代码  
  105.     //<<AICUBE_USER_INITIAL_CODE_END>>
  106.     EnableGlobalInt();                  //使能全局中断
  107. }
  108. ////////////////////////////////////////
  109. // 微秒延时函数
  110. // 入口参数: us (设置延时的微秒值)
  111. // 函数返回: 无
  112. ////////////////////////////////////////
  113. void delay_us(uint16_t us)
  114. {
  115.     do
  116.     {
  117.         NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  118.     } while (--us);
  119. }
  120. ////////////////////////////////////////
  121. // 毫秒延时函数
  122. // 入口参数: ms (设置延时的毫秒值)
  123. // 函数返回: 无
  124. ////////////////////////////////////////
  125. void delay_ms(uint16_t ms)
  126. {
  127.     uint16_t i;
  128.     do
  129.     {
  130.         i = MAIN_Fosc / 6000;
  131.         while (--i);
  132.     } while (--ms);
  133. }
  134. ////////////////////////////////////////
  135. // RTC初始化函数
  136. // 入口参数: 无
  137. // 函数返回: 无
  138. ////////////////////////////////////////
  139. void RTC_Init(void)
  140. {
  141.     CLK_X32K_Enable();                  //启动外部32768晶振
  142.     CLK_X32K_FullGain();                //振荡器高增益
  143.     CLK_X32K_WaitStable();              //等待振荡器稳定
  144.     RTC_CLK_X32K();                     //RTC使用外部32768当作时钟源
  145.     RTC_SetAlarmHour(7);                //设置RTC闹钟的小时
  146.     RTC_SetAlarmMinute(0);              //设置RTC闹钟的分钟
  147.     RTC_SetAlarmSecond(0);              //设置RTC闹钟的秒
  148.     RTC_SetAlarmSSecond(0);             //初始化RTC闹钟的次秒
  149.     RTC_SetYear(25);                    //设置RTC的年
  150.     RTC_SetMonth(12);                   //设置RTC的月
  151.     RTC_SetDay(31);                     //设置RTC的日
  152.     RTC_SetHour(18);                    //设置RTC的小时
  153.     RTC_SetMinute(41);                  //设置RTC的分钟
  154.     RTC_SetSecond(32);                  //设置RTC的秒
  155.     RTC_SetSSecond(0);                  //初始化RTC的次秒
  156.     RTC_Run();                          //启动RTC
  157.     RTC_SyncInitial();                  //同步RTC的初始值
  158.     while (RTC_IsSyncing());            //等待同步完成
  159.     RTC_SetIntPriority(0);              //设置中断为最低优先级
  160.     RTC_EnableAlarmInt();               //使能RTC闹钟中断
  161.     RTC_EnableDayInt();                 //使能RTC天中断
  162.     RTC_EnableHourInt();                //使能RTC小时中断
  163.     RTC_EnableMinuteInt();              //使能RTC分钟中断
  164.     RTC_EnableSecondInt();              //使能RTC秒中断
  165.     //<<AICUBE_USER_RTC_INITIAL_BEGIN>>
  166.     // 在此添加用户初始化代码  
  167.     //<<AICUBE_USER_RTC_INITIAL_END>>
  168. }
  169. ////////////////////////////////////////
  170. // USB库初始化函数
  171. // 入口参数: 无
  172. // 函数返回: 无
  173. ////////////////////////////////////////
  174. void USBLIB_Init(void)
  175. {
  176.     usb_init();                         //初始化USB模块
  177.     USB_SetIntPriority(0);              //设置中断为最低优先级
  178.     set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
  179.     //<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
  180.     // 在此添加用户初始化代码  
  181.     //<<AICUBE_USER_USBLIB_INITIAL_END>>
  182. }
  183. ////////////////////////////////////////
  184. // 等待USB配置完成函数
  185. // 入口参数: 无
  186. // 函数返回: 无
  187. ////////////////////////////////////////
  188. void USBLIB_WaitConfiged(void)
  189. {
  190.     while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
  191.         WDT_Clear();                    //清看门狗定时器 (防止硬件自动使能看门狗)
  192. }
  193. ////////////////////////////////////////
  194. // USB设备接收数据处理程序
  195. // 入口参数: 无
  196. // 函数返回: 无
  197. // bUsbOutReady:USB设备接收数据标志位
  198. // OutNumber:USB设备接收到的数据长度
  199. // UsbOutBuffer:保存USB设备接收到的数据
  200. ////////////////////////////////////////
  201. void USBLIB_OUT_Done(void)
  202. {
  203.     if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
  204.     {
  205.         //<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
  206.         // 在此添加中断函数用户代码  
  207.         USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
  208.         // 在此处添加用户处理接收数据的代码
  209.         //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
  210.         usb_OUT_done();                 //当前包的数据处理完成,通知USB主机可以发送下一包数据
  211.     }
  212. }
  213. ////////////////////////////////////////
  214. // RTC中断服务程序
  215. // 入口参数: 无
  216. // 函数返回: 无
  217. ////////////////////////////////////////
  218. void RTC_ISR(void) interrupt RTC_VECTOR
  219. {
  220.     //<<AICUBE_USER_RTC_ISR_CODE1_BEGIN>>
  221.     // 在此添加中断函数用户代码  
  222.     if (RTC_CheckAlarmFlag())           //判断是否是RTC闹钟中断
  223.     {
  224.         RTC_ClearAlarmFlag();           //清除中断请求标志位
  225.                 fAlarm = 1;                                         //设置闹钟查询标志
  226.     }
  227.     if (RTC_CheckDayFlag())             //判断是否是RTC天中断       
  228.     {
  229.         RTC_ClearDayFlag();             //清除中断请求标志位
  230.                 fDay = 1;                                                 //设置天查询标志
  231.     }
  232.     if (RTC_CheckHourFlag())            //判断是否是RTC小时中断
  233.     {
  234.         RTC_ClearHourFlag();            //清除中断请求标志位
  235.                 fHour = 1;                                                 //设置小时查询标志
  236.     }
  237.     if (RTC_CheckMinuteFlag())          //判断是否是RTC分钟中断
  238.     {
  239.         RTC_ClearMinuteFlag();          //清除中断请求标志位
  240.                 fMinute = 1; //设置分钟查询标志
  241.     }
  242.     if (RTC_CheckSecondFlag())          //判断是否是RTC秒中断
  243.     {
  244.         RTC_ClearSecondFlag();          //清除中断请求标志位
  245.                 fSecond = 1;                                         //设置秒查询标志
  246.     }
  247.     //<<AICUBE_USER_RTC_ISR_CODE1_END>>
  248. }
  249. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  250. // 在此添加用户函数实现代码  
  251. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-31 15:57:30
已绑定手机

2

主题

6

回帖

34

积分

新手上路

积分
34
发表于 2026-1-31 17:25:13 | 显示全部楼层

第十七集,串口的简单使用

串口可双向发送消息
  1. #include "usart.h"
  2. #include "io.h"
  3. u8 Rec_Dat[50];                //接收缓冲区
  4. u8 Rec_Num = 0;                //接收计数
  5. bit B_TX2_Busy=0;
  6. void Uart2_Isr(void) interrupt 8
  7. {
  8.         if (S2CON & 0x02)        //检测串口2发送中断
  9.         {
  10.                 S2CON &= ~0x02;        //清除串口2发送中断请求位
  11.                 B_TX2_Busy = 0;
  12.         }
  13.         if (S2CON & 0x01)        //检测串口2接收中断
  14.         {
  15.                 S2CON &= ~0x01;        //清除串口2接收中断请求位
  16.                
  17.                 //S2BUF
  18.                 Rec_Dat[Rec_Num++] = S2BUF;
  19.         }
  20. }
  21. void Uart2_Init(void)        //9600bps@24.000MHz
  22. {
  23.        
  24.         P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2
  25.        
  26.         S2CON = 0x50;                //8位数据,可变波特率
  27.         AUXR |= 0x04;                //定时器时钟1T模式
  28.         T2L = 0x8F;                        //设置定时初始值
  29.         T2H = 0xFD;                        //设置定时初始值
  30.         AUXR |= 0x10;                //定时器2开始计时
  31.         IE2 |= 0x01;                //使能串口2中断
  32.        
  33.         Rec_Num = 0;
  34.         B_TX2_Busy = 0;
  35. }
  36. void Uart2_SendStr( u8 *puts )                //串口数据发送函数
  37. {
  38.     for (; *puts != 0;  puts++)     //遇到停止符0结束
  39.     {
  40.         S2BUF = *puts;
  41.         B_TX2_Busy = 1;
  42.         while(B_TX2_Busy);
  43.     }       
  44. }
  45. void Usart2_RunTask(void)
  46. {
  47.         if( Rec_Num >= 6 )                //是否接收到了6位以上的数据
  48.         {
  49.                 if(( Rec_Dat[Rec_Num-1] == '\n' ) && ( Rec_Dat[Rec_Num-2] == '\r' ) )        //末尾判断
  50.                 {
  51.                         if( ( Rec_Dat[Rec_Num-6] == 'O' ) && ( Rec_Dat[Rec_Num-5] == 'P' ) && ( Rec_Dat[Rec_Num-4] == 'E' ) && ( Rec_Dat[Rec_Num-3] == 'N' )  )
  52.                         {
  53.                                 passward[0] = 16;
  54.                                 passward[1] = 16;
  55.                                 passward[2] = 16;
  56.                                 passward[3] = 16;
  57.                                 Uart2_SendStr( "打开成功!\r\n" );
  58.                         }
  59.                         else if( ( Rec_Dat[Rec_Num-7] == 'C' ) && ( Rec_Dat[Rec_Num-6] == 'L' ) && ( Rec_Dat[Rec_Num-5] == 'O' ) && ( Rec_Dat[Rec_Num-4] == 'S' ) && ( Rec_Dat[Rec_Num-3] == 'E' )  )
  60.                         {
  61.                                 passward[0] = 17;
  62.                                 passward[1] = 17;
  63.                                 passward[2] = 17;
  64.                                 passward[3] = 17;
  65.                                 Uart2_SendStr( "关闭成功!\r\n" );
  66.                         }
  67.                         Rec_Num = 0;
  68.                 }
  69.         }
  70. }
  71. [code]#ifndef __USART_H
  72. #define __USART_H
  73. #include "config.h"                        //调用头文件
  74.        
  75. void Uart2_Init(void);        //9600bps@24.000MHz
  76. void Usart2_RunTask(void);
  77. #endif
复制代码
[/code]
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-13 03:43 , Processed in 0.116393 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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