找回密码
 立即注册
查看: 74|回复: 7

--AI8051U(擎天柱)--学习历程

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 11:48:54 | 显示全部楼层 |阅读模式
  • void main(void) {
  •         unsigned char i;
  •     P2M0 = 0;          // 设置 P2 为准双向口
  •     P2M1 = 0;
  •     P2 = 0xFF;         // 初始关闭所有 LED
  •     while (1) {
  •         // 从左到右依次点亮(P2.0 → P2.7)
  •         for ( i = 0; i < 8; i++) {
  •             P2 = ~(0x01 << i);  // 取反,使对应位为 0(点亮)
  •             delay_ms(500);      // 延时 500ms
  •         }
  •     }
  • }



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 11:50:14 | 显示全部楼层
第二集-USB不停电下载:
  1. char *USER_DEVICEDESC = NULL;
  2. char *USER_PRODUCTDESC = NULL;
  3. char *USER_STCISPCMD = "@STCISP#";
  4. void main(void)
  5. {
  6.     P_SW2 |= 0x80;                //B7位写1,使能访问XFR
  7.         
  8.     P0M1 = 0x00;   P0M0 = 0x00;
  9.     P1M1 = 0x00;   P1M0 = 0x00;
  10.     P2M1 = 0x00;   P2M0 = 0x00;
  11.     P3M1 = 0x00;   P3M0 = 0x00;
  12.     P4M1 = 0x00;   P4M0 = 0x00;
  13.     P5M1 = 0x00;   P5M0 = 0x00;
  14.     P6M1 = 0x00;   P6M0 = 0x00;
  15.     P7M1 = 0x00;   P7M0 = 0x00;
  16.         
  17.         usb_init();                                     //USB CDC 接口配置
  18.     IE2 |= 0x80;                                    //使能USB中断
  19.     EA = 1;                                                                                        //IE |= 0X80;
  20.         
  21.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  22.         
  23.         while(1)
  24.         {
  25.                
  26.         if (bUsbOutReady)
  27.         {
  28.             USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  29.             
  30.             usb_OUT_done();
  31.         }
  32.                
  33.                 P20 = 0;                                        //P00端口输出0V
  34.                 P22 = 0;                                        //P02端口输出0V
  35.                 P21 = 0;
  36.         }
  37. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 11:52:45 | 显示全部楼层
第四集-IO输入输出:
  1. #define u8  unsigned char                //8位无符号变量(0-255)
  2. #define u16 unsigned int                //16位无符号变量(0-65535)        
  3.         
  4. u8 state = 0;                                        //初始状态
  5. char *USER_DEVICEDESC = NULL;
  6. char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  9. {
  10.         unsigned long edata i;
  11.         _nop_();
  12.         _nop_();
  13.         i = 119998UL;
  14.         while (i) i--;
  15. }
  16. void main(void)
  17. {
  18.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  19.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  20.     CKCON = 0;                                                                                 //提高访问XRAM速度
  21.         
  22.     P0M1 = 0x00;   P0M0 = 0x00;
  23.     P1M1 = 0x00;   P1M0 = 0x00;
  24.     P2M1 = 0x00;   P2M0 = 0x00;
  25.     P3M1 = 0x00;   P3M0 = 0x00;
  26.     P4M1 = 0x00;   P4M0 = 0x00;
  27.     P5M1 = 0x00;   P5M0 = 0x00;
  28.     P6M1 = 0x00;   P6M0 = 0x00;
  29.     P7M1 = 0x00;   P7M0 = 0x00;
  30.         
  31.         usb_init();                                     //USB CDC 接口配置
  32.     IE2 |= 0x80;                                    //使能USB中断
  33.     EA = 1;                                                                                        //IE |= 0X80;
  34.         
  35.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  36.         
  37.         while(1)
  38.         {
  39.                
  40.         if (bUsbOutReady)                                                        //如果接收到了数据
  41.         {
  42.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  43.             
  44.             usb_OUT_done();                                                        //
  45.         }
  46.                
  47. //                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
  48. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  49. //                {
  50. //                        P20 = 0;
  51. //                }
  52. //                else
  53. //                {
  54. //                        P20 = 1;
  55. //                }
  56. //               
  57.                
  58.                 //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
  59. //                if( P32 == 1 )                                                                //判断P32按钮是否按下
  60. //                {
  61. //                        P20 = 0;
  62. //                }
  63. //                else
  64. //                {
  65. //                        P20 = 1;
  66. //                }
  67.                
  68.                 //任务3:按一下灯亮,按一下灯灭
  69.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  70.                 {
  71.                         Delay20ms();                                                        //延时20ms消抖
  72.                         if( P32 == 0 )
  73.                         {
  74.                                 state = !state;                                                //变量取反 0 1 0 1 0 1
  75.                                 P20 = state;
  76.                                 printf("state:%d\r\n",(int)state);
  77.                                 
  78.                                 while( P32 == 0 );                                        //等待P32松开
  79.                                 
  80.                         }
  81.                 }
  82.         
  83.                
  84.         }
  85. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 11:53:27 | 显示全部楼层
winter-*** 发表于 2025-8-1 11:52
第四集-IO输入输出:

第五集-定时器:
  1. #define u8  unsigned char                //8位无符号变量(0-255)
  2. #define u16 unsigned int                //16位无符号变量(0-65535)        
  3.         
  4. u8 state = 0;                                        //初始状态
  5. u8 Run_State = 0;                                //运行状态
  6. char *USER_DEVICEDESC = NULL;
  7. char *USER_PRODUCTDESC = NULL;
  8. char *USER_STCISPCMD = "@STCISP#";
  9. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  10. {
  11.         unsigned long edata i;
  12.         _nop_();
  13.         _nop_();
  14.         i = 119998UL;
  15.         while (i) i--;
  16. }
  17. void Timer0_Init(void);                //3秒@24.000MHz                //函数声明
  18. void main(void)
  19. {
  20.         int count=1;                                                                        //按键计数变量
  21.         
  22.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  23.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  24.     CKCON = 0;                                                                                 //提高访问XRAM速度
  25.         
  26.     P0M1 = 0x00;   P0M0 = 0x00;
  27.     P1M1 = 0x00;   P1M0 = 0x00;
  28.     P2M1 = 0x00;   P2M0 = 0x00;
  29.     P3M1 = 0x00;   P3M0 = 0x00;
  30.     P4M1 = 0x00;   P4M0 = 0x00;
  31.     P5M1 = 0x00;   P5M0 = 0x00;
  32.     P6M1 = 0x00;   P6M0 = 0x00;
  33.     P7M1 = 0x00;   P7M0 = 0x00;
  34.         
  35.         usb_init();                                     //USB CDC 接口配置
  36.     IE2 |= 0x80;                                    //使能USB中断
  37. //        Timer0_Init();                                                                        //定时器初始化
  38.         
  39.     EA = 1;                                                                                        //IE |= 0X80;
  40.         
  41.         P40 = 0;
  42.         
  43.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  44.         
  45.         while(1)
  46.         {
  47.                
  48.         if (bUsbOutReady)                                                        //如果接收到了数据
  49.         {
  50.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  51.             
  52.             usb_OUT_done();                                                        //
  53.         }
  54.                
  55.                 //任务1:
  56. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  57. //                {
  58. //                        Delay20ms();                                                        //延时20ms消抖
  59. //                        if( P32 == 0 )
  60. //                        {
  61. //                                printf("按键按下次数\xfd:%d 次\r\n",(int)count);
  62. //                                count++;
  63. //                                
  64. //                                while( P32 == 0 );                                        //等待P32松开
  65. //                                
  66. //                        }
  67. //                }
  68.         
  69. //                //任务2:灯按一下点亮三秒后熄灭。
  70. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  71. //                {
  72. //                        Delay20ms();                                                        //延时20ms消抖
  73. //                        if( P32 == 0 )
  74. //                        {
  75. ////                                printf("按键按下次数\xfd:%d 次\r\n",(int)count);
  76. ////                                count++;
  77. //                                P20 = 0;
  78. //                                Timer0_Init();
  79. //                                while( P32 == 0 );                                        //等待P32松开
  80. //                                
  81. //                        }
  82. //                }
  83. //               
  84.                 //任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2              表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
  85.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  86.                 {
  87.                         Delay20ms();                                                        //延时20ms消抖
  88.                         if( P32 == 0 )
  89.                         {
  90.                                 Run_State = !Run_State;                                //运行状态取反
  91.                                 
  92.                                 if( Run_State==1 )                                        //运行
  93.                                 {
  94.                                         Timer0_Init();
  95.                                 }
  96.                                 else
  97.                                 {
  98.                                         TR0 = 0;                                                //关闭定时器
  99.                                         P20 = 1;
  100.                                         P21 = 1;
  101.                                 }
  102.                                 while( P32 == 0 );                                        //等待P32松开
  103.                                 
  104.                         }
  105.                 }
  106.                
  107.         }
  108. }
  109. //void Timer0_Init(void)                //3秒@24.000MHz        函数定义
  110. //{
  111. //        TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  112. //        AUXR &= 0x7F;                        //定时器时钟12T模式
  113. //        TMOD &= 0xF0;                        //设置定时器模式
  114. //        TL0 = 0x3F;                                //设置定时初始值
  115. //        TH0 = 0x01;                                //设置定时初始值
  116. //        TF0 = 0;                                //清除TF0标志
  117. //        TR0 = 1;                                //定时器0开始计时
  118. //        ET0 = 1;                                //使能定时器0中断
  119. //        
  120. //        //TM0PS = 91
  121. //        //12T                 /12
  122. //        // THO-TL0 = 319
  123. //        
  124. //}
  125. void Timer0_Init(void)                //500毫秒@24.000MHz
  126. {
  127.         TM0PS = 0x0F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  128.         AUXR &= 0x7F;                        //定时器时钟12T模式
  129.         TMOD &= 0xF0;                        //设置定时器模式
  130.         TL0 = 0xDC;                                //设置定时初始值
  131.         TH0 = 0x0B;                                //设置定时初始值
  132.         TF0 = 0;                                //清除TF0标志
  133.         TR0 = 1;                                //定时器0开始计时
  134.         ET0 = 1;                                //使能定时器0中断
  135. }
  136. void Timer0_Isr(void) interrupt 1                //3秒执行一次
  137. {
  138.         state = !state;               
  139.         
  140.         P20 = state;
  141.         P21 = !state;
  142. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 11:54:19 | 显示全部楼层
winter-*** 发表于 2025-8-1 11:53
第五集-定时器:

第六集-定时器多任务调度:

  • char *USER_DEVICEDESC = NULL;
  • char *USER_PRODUCTDESC = NULL;
  • char *USER_STCISPCMD = "@STCISP#";
  • void main(void)
  • {
  •         Sys_init();                                                                                //系统初始化
  •         usb_init();                                     //USB CDC 接口配置
  •     IE2 |= 0x80;                                    //使能USB中断
  •         Timer0_Init();                                                                        //定时器初始化
  •     EA = 1;                                                                                        //IE |= 0X80;
  •         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  •         while(1)
  •         {
  •         if (bUsbOutReady)                                                        //如果接收到了数据
  •         {
  •             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  •             usb_OUT_done();                                                        //
  •         }
  •                 Task_Pro_Handler_Callback();                                //执行功能函数
  •         }
  • }
  • void Timer0_Isr(void) interrupt 1                //1MS执行一次
  • {
  •         Task_Marks_Handler_Callback();                                        //系统计时
  • }


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-08-01 08:35:30

24

主题

448

回帖

2882

积分

版主

积分
2882
QQ
发表于 2025-8-1 12:02:21 | 显示全部楼层
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接

QQ:1463035472,微信:19952583954
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-05 19:58:36
已绑定手机

4

主题

10

回帖

72

积分

注册会员

积分
72
发表于 2025-8-1 16:00:05 | 显示全部楼层
winter-*** 发表于 2025-8-1 11:54
第六集-定时器多任务调度:

第七集-学习感悟:
跟着冲哥的视频确实能学到很多知识,以前读芯片手册和数据手册的时候感觉读起来都很乱,对数据手册的认知不够清新,但是在冲哥的视频里确能学到很多数据手册的正确使用方法,非常感谢论坛给我的这次学习机会。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-9 21:39 , Processed in 2.159360 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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