找回密码
 立即注册
楼主: romeo

定时器中断 | 集中在这个帖子打卡

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 16:35:47 | 显示全部楼层
完成AI8051U AIcube实验三以及不掉电下载,芯片进步太快了,8051非常强大,好用!
  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-01-14) 创建文件
  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.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  35.         // 在此添加主函数中用户主循环代码  
  36.         //<<AICUBE_USER_MAIN_LOOP_END>>
  37.     }
  38. }
  39. ////////////////////////////////////////
  40. // 系统初始化函数
  41. // 入口参数: 无
  42. // 函数返回: 无
  43. ////////////////////////////////////////
  44. void SYS_Init(void)
  45. {
  46.     EnableAccessXFR();                  //使能访问扩展XFR
  47.     AccessCodeFastest();                //设置最快速度访问程序代码
  48.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  49.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  50.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  51.     // 在此添加用户预初始化代码  
  52.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  53.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  54.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  55.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  56.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  57.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  58.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  59.     PORT4_Init();                       //P4口初始化
  60.     delay_ms(1);
  61.     USBLIB_Init();                      //USB库初始化
  62.     delay_ms(1);
  63.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  64.     // 在此添加用户初始化代码  
  65.     //<<AICUBE_USER_INITIAL_CODE_END>>
  66.     EnableGlobalInt();                  //使能全局中断
  67. }
  68. ////////////////////////////////////////
  69. // 微秒延时函数
  70. // 入口参数: us (设置延时的微秒值)
  71. // 函数返回: 无
  72. ////////////////////////////////////////
  73. void delay_us(uint16_t us)
  74. {
  75.     do
  76.     {
  77.         NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  78.     } while (--us);
  79. }
  80. ////////////////////////////////////////
  81. // 毫秒延时函数
  82. // 入口参数: ms (设置延时的毫秒值)
  83. // 函数返回: 无
  84. ////////////////////////////////////////
  85. void delay_ms(uint16_t ms)
  86. {
  87.     uint16_t i;
  88.     do
  89.     {
  90.         i = MAIN_Fosc / 6000;
  91.         while (--i);
  92.     } while (--ms);
  93. }
  94. ////////////////////////////////////////
  95. // P4口初始化函数
  96. // 入口参数: 无
  97. // 函数返回: 无
  98. ////////////////////////////////////////
  99. void PORT4_Init(void)
  100. {
  101.     SetP4nInitLevelHigh(PIN_ALL);       //设置P4初始化电平
  102.     SetP4nQuasiMode(PIN_7 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //设置P4.7,P4.5,P4.4,P4.3,P4.2,P4.1,P4.0为准双向口模式
  103.     SetP4nPushPullMode(PIN_6);          //设置P4.6为推挽输出模式
  104.     DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
  105.     DisableP4nPullDown(PIN_ALL);        //关闭P4内部下拉电阻
  106.     DisableP4nSchmitt(PIN_ALL);         //使能P4施密特触发
  107.     SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
  108.     SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
  109.     SetP4nDigitalInput(PIN_ALL);        //使能P4数字信号输入功能
  110.     //<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
  111.     // 在此添加用户初始化代码  
  112.     //<<AICUBE_USER_PORT4_INITIAL_END>>
  113. }
  114. ////////////////////////////////////////
  115. // USB库初始化函数
  116. // 入口参数: 无
  117. // 函数返回: 无
  118. ////////////////////////////////////////
  119. void USBLIB_Init(void)
  120. {
  121.     usb_init();                         //初始化USB模块
  122.     USB_SetIntPriority(3);              //设置中断为最高优先级
  123.     set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
  124.     set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
  125.     //<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
  126.     // 在此添加用户初始化代码  
  127.        
  128.     //<<AICUBE_USER_USBLIB_INITIAL_END>>
  129. }
  130. ////////////////////////////////////////
  131. // 等待USB配置完成函数
  132. // 入口参数: 无
  133. // 函数返回: 无
  134. ////////////////////////////////////////
  135. void USBLIB_WaitConfiged(void)
  136. {
  137.     while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
  138.         WDT_Clear();                    //清看门狗定时器 (防止硬件自动使能看门狗)
  139. }
  140. ////////////////////////////////////////
  141. // USB设备接收数据中断回调程序
  142. // 入口参数: 无
  143. // 函数返回: 无
  144. // OutNumber:USB设备接收到的数据长度
  145. // UsbOutBuffer:保存USB设备接收到的数据
  146. ////////////////////////////////////////
  147. void USBLIB_OUT_Callback(void)
  148. {
  149.     //<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
  150.     // 在此添加中断函数用户代码  
  151.    // USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
  152.     // 在此处添加用户处理接收数据的代码
  153.            if (UsbOutBuffer[0] == 6)
  154.         printf_usb("Hello World !\r\n");        //接收到数据6后打印“Hello World !”
  155.     else if (UsbOutBuffer[0] == 7)
  156.         printf_usb("China !\r\n");                //接收到数据7后打印“China !”
  157.     //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
  158. }
  159. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  160. // 在此添加用户函数实现代码  
  161. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
屏幕截图 2026-01-14 163307.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 16:37:17 | 显示全部楼层
补充楼上!
屏幕截图 2026-01-14 162910.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 16:37:18 | 显示全部楼层
补充楼上!
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 21:52:56 | 显示全部楼层
补充学习第一、二集的心得,学习和使用 AI8051U 单片机,让我深刻感受到了它在硬件和工具方面的强大之处。硬件上,1T 内核带来的性能提升和丰富的外设资源,使得 AI8051U 能够胜任各种复杂的应用场景;工具上,Keil C51 和 STC-ISP 等开发工具的便捷性和高效性,极大地提高了开发效率。同时,AI8051U 还具有成本低、功耗低、抗干扰性强等优点,是一款非常适合初学者和项目开发的单片机。通过对 AI8051U 的学习,我不仅掌握了单片机的基本原理和开发方法,还提高了自己的实践能力和解决问题的能力,为今后的学习和工作打下了坚实的基础。
597bdae1a841d71e7743a63cd53c95c0.jpg
51840a39b32cf9de4ae5a4d235faa13e.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 21:58:34 | 显示全部楼层
学习了第四集不掉电下载,USB不停电下载,太方便了今后不用每次都去麻烦的操作,以下是简单的示范
  1. #include <AI8051U.H>
  2. #include "ai_usb.h"
  3. sbit k3 = P3^2;
  4. sbit k4 = P3^3;
  5. sbit led0 = P2^0;
  6. void main()
  7. {
  8.         EAXFR = 1;
  9.         WTST = 0;
  10.         CKCON = 0;
  11.     P0M0 = 0x00; P0M1 = 0x00;
  12.     P1M0 = 0x00; P1M1 = 0x00;
  13.     P2M0 = 0x00; P2M1 = 0x00;
  14.     P3M0 = 0x00; P3M1 = 0x00;
  15.     P4M0 = 0x00; P4M1 = 0x00;
  16.     P5M0 = 0x00; P5M1 = 0x00;
  17.     P6M0 = 0x00; P6M1 = 0x00;
  18.     P7M0 = 0x00; P7M1 = 0x00;
  19.         usb_init();
  20.         EA = 1;
  21.        
  22.        
  23.         while(1)
  24.         {
  25.                 if(k3 == 0)
  26.                 {
  27.                 led0 = 0;
  28.                 }
  29.                 else{
  30.                 led0 = 1;
  31.                 }
  32.         }
  33. }
复制代码
屏幕截图 2026-01-14 215422.png
屏幕截图 2026-01-14 215519.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 22:09:37 | 显示全部楼层
学习了第五集完这门 C 语言基础课程后,我又一次深刻感受到了这门语言的魅力与强大。它不仅是计算机科学的基石,更是通往编程世界的必经之路。虽然已经在学校学过了,但无疑又是一次深刻的理解,又有了新的收获。以下是我对课程内容的学习感悟和具体收获。比如如何根据数据的性质和用途选择合适的数据类型,如 int、float、char 等。理解了不同数据类型在内存中占用的空间大小和取值范围,这对于编写高效的程序至关重要。
  1. #include <stdio.h>
  2. int main() {
  3.     // 定义不同类型的变量
  4.     int age = 25;          // 整型变量,存储年龄
  5.     float height = 1.75f;  // 浮点型变量,存储身高,注意后缀f
  6.     char initial = 'J';    // 字符型变量,存储姓名首字母
  7.     // 使用printf函数输出变量的值
  8.     printf("年龄: %d\n", age);
  9.     printf("身高: %.2f米\n", height); // %.2f表示保留两位小数
  10.     printf("姓名首字母: %c\n", initial);
  11.     return 0;
  12. }
复制代码

又比如C 语言丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。理解了运算符的优先级和结合性,这对于正确构建表达式至关重要。
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10, b = 3;
  4.     // 算术运算
  5.     printf("a + b = %d\n", a + b);
  6.     printf("a - b = %d\n", a - b);
  7.     printf("a * b = %d\n", a * b);
  8.     printf("a / b = %d\n", a / b); // 整数除法,结果为3
  9.     printf("a %% b = %d\n", a % b); // 取余运算,结果为1
  10.     // 关系运算和逻辑运算
  11.     int is_greater = (a > b);
  12.     int is_equal = (a == b);
  13.     int logical_and = (a > 5) && (b < 5); // 逻辑与
  14.     int logical_or = (a > 15) || (b < 5); // 逻辑或
  15.     printf("a > b 吗? %d\n", is_greater); // 1表示真,0表示假
  16.     printf("a == b 吗? %d\n", is_equal);
  17.     printf("(a > 5) && (b < 5) = %d\n", logical_and);
  18.     printf("(a > 15) || (b < 5) = %d\n", logical_or);
  19.     return 0;
  20. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-01-14 15:10:29
已绑定手机

5

主题

13

回帖

59

积分

注册会员

积分
59
发表于 2026-1-14 22:19:54 | 显示全部楼层
学习了第六集I/O口输入输出,AI8051U 单片机 I/O 口输入输出的过程,是我从 “理论认知” 走向 “实践应用” 的关键一步。通过课程学习与项目实践,我不仅掌握了 I/O 口的配置方法、工作模式、时序控制等核心技能,更深入理解了 AI8051U 的硬件特性与嵌入式开发的底层逻辑。从引脚复用、驱动能力、抗干扰设计到与外设的协同工作,每一个知识点都在实践中得到了验证与深化。
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "intrins.h"                        //d调用头文件
  4. #define u8  unsigned char                //8位无符号变量(0-255)
  5. #define u16 unsigned int                //16位无符号变量(0-65535)       
  6.        
  7. u8 state = 0;                                        //初始状态
  8. char *USER_DEVICEDESC = NULL;
  9. char *USER_PRODUCTDESC = NULL;
  10. char *USER_STCISPCMD = "@STCISP#";
  11. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  12. {
  13.         unsigned long edata i;
  14.         _nop_();
  15.         _nop_();
  16.         i = 119998UL;
  17.         while (i) i--;
  18. }
  19. void main(void)
  20. {
  21.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  22.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  23.     CKCON = 0;                                                                                 //提高访问XRAM速度
  24.        
  25.     P0M1 = 0x00;   P0M0 = 0x00;
  26.     P1M1 = 0x00;   P1M0 = 0x00;
  27.     P2M1 = 0x00;   P2M0 = 0x00;
  28.     P3M1 = 0x00;   P3M0 = 0x00;
  29.     P4M1 = 0x00;   P4M0 = 0x00;
  30.     P5M1 = 0x00;   P5M0 = 0x00;
  31.     P6M1 = 0x00;   P6M0 = 0x00;
  32.     P7M1 = 0x00;   P7M0 = 0x00;
  33.        
  34.         usb_init();                                     //USB CDC 接口配置
  35.     IE2 |= 0x80;                                    //使能USB中断
  36.     EA = 1;                                                                                        //IE |= 0X80;
  37.        
  38.         P40 = 0;
  39.        
  40.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  41.        
  42.         while(1)
  43.         {
  44.                
  45.         if (bUsbOutReady)                                                        //如果接收到了数据
  46.         {
  47.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  48.             
  49.             usb_OUT_done();                                                        //
  50.         }
  51.                
  52. //                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
  53. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  54. //                {
  55. //                        P00 = 0;
  56. //                }
  57. //                else
  58. //                {
  59. //                        P00 = 1;
  60. //                }
  61. //               
  62.                
  63.                
  64. //                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
  65. //                if( P32 == 1 )                                                                //判断P32按钮是否按下
  66. //                {
  67. //                        P00 = 0;
  68. //                }
  69. //                else
  70. //                {
  71. //                        P00 = 1;
  72. //                }
  73.                
  74.                 //任务3:按一下灯亮,按一下灯灭
  75.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  76.                 {
  77.                         Delay20ms();                                                        //延时20ms消抖
  78.                         if( P32 == 0 )
  79.                         {
  80.                                 state = !state;                                                //变量取反 0 1 0 1 0 1
  81.                                 P00 = state;
  82.                                 printf("state:%d\r\n",(int)state);
  83.                                
  84.                                 while( P32 == 0 );                                        //等待P32松开
  85.                                
  86.                         }
  87.                 }
  88.        
  89.                
  90.         }
  91. }
复制代码
AI8051U 的 I/O 口就像一把 “钥匙”,为我打开了嵌入式系统与外部世界交互的大门 —— 它让我明白,嵌入式开发不是孤立的代码编写,而是硬件与软件的深度融合。未来在拓展宠物喂食器的蓝牙远程控制、重量检测等功能时,我也将基于本次所学的 I/O 口操作逻辑,结合 AI8051U 的串口、ADC 等外设,继续探索 “硬件配置→软件实现→功能拓展” 的全流程开发,在实践中不断提升自己的嵌入式系统设计能力。
屏幕截图 2026-01-14 221841.png
a18a809f346a41719523ef6d0d406afc.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:02 , Processed in 0.140027 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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