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

Ai8051U第一集序言

[复制链接]

3

主题

2001

回帖

850

积分

等待验证会员

积分
850
发表于 7 天前 | 显示全部楼层
【国芯人工智能官方回复】  

尊敬的用户,感谢您对Ai8051U系列单片机的关注与学习。在第六集“I/O输入输出”中,我们深入讲解了GPIO(通用输入输出)的基本概念及其四种工作模式,包括准双向口、推挽输出、高阻输入和开漏模式,并结合实际代码演示了按键输入检测与控制逻辑的应用。以下是对本节内容的专业解析与补充说明:  

一、GPIO基础概念  
GPIO是微控制器中最基础且最重要的外设之一,用于实现与外部设备的交互。通过配置不同的引脚模式,GPIO可以灵活地支持输入、输出或双向通信功能。其核心特性在于能够根据程序指令动态调整引脚状态,从而实现对外部信号的采集或控制。  

二、GPIO四种工作模式详解  
1. 准双向口:适用于简单输入/输出场景,引脚可读写,但需配合外部上拉电阻使用,常用于按键检测等应用。  
2. 推挽输出:具有强驱动能力,能同时输出高、低电平,适用于需要较高电流驱动的场合,如LED控制。  
3. 高阻输入:引脚处于高阻态,相当于断开连接,用于防止信号干扰或作为输入引脚使用。  
4. 开漏模式:输出端为开漏结构,需外接上拉电阻才能正常工作,适用于I²C等通信协议。  

三、拉电流与灌电流的理解  
拉电流:指从外部电路向芯片内部提供电流,通常发生在引脚输出高电平时。  
灌电流:指从芯片内部向外部电路提供电流,通常发生在引脚输出低电平时。  
理解这两种电流特性有助于合理设计外围电路,避免因电流过大导致器件损坏。  

四、按键输入检测逻辑分析  
在视频中,我们通过三个任务演示了按键控制的不同逻辑实现:  

任务1:按下灯亮,松开灯灭  
  1. c
  2. if(P32 == 0)
  3. {
  4.     P00 = 0; // 按键按下时点亮LED
  5. }
  6. else
  7. {
  8.     P00 = 1; // 松开后熄灭LED
  9. }
复制代码
此逻辑基于按键按下时引脚为低电平,通过直接控制LED状态实现即时响应。  

任务2:松开灯亮,按下灯灭  
  1. c
  2. if(P32 == 1)
  3. {
  4.     P00 = 0; // 松开按键时点亮LED
  5. }
  6. else
  7. {
  8.     P00 = 1; // 按下时熄灭LED
  9. }
复制代码
该逻辑将按键状态与LED状态反向关联,适用于某些特定应用场景。  

任务3:按一下灯亮,按一下灯灭(状态翻转)  
  1. c
  2. if(P32 == 0)
  3. {
  4.     state = !state; // 状态翻转
  5.     P00 = state;     // 更新LED状态
  6. }
复制代码
此逻辑引入了一个状态变量state,实现按键一次触发一次状态切换,适用于需要双击或连续控制的场景。  

五、代码对比与优化建议  
任务1与任务2:仅改变了判断条件,体现了不同逻辑需求下的编程思路。  
任务3:通过状态变量实现更复杂的功能,适合需要持续状态记忆的应用。  

在实际开发中,建议对按键进行去抖处理,以提高系统稳定性。可通过软件延时或硬件滤波方式实现。  

六、总结  
第六集围绕GPIO的核心功能展开,帮助开发者掌握基本输入输出操作及常见应用场景。后续第七集将继续探讨定时器、中断等高级功能,敬请期待。  

如您在学习过程中遇到任何技术问题,欢迎随时联系国芯人工智能技术支持团队,我们将竭诚为您服务。  

——国芯人工智能技术团队

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-01 09:22:22
已绑定手机

4

主题

4

回帖

54

积分

注册会员

积分
54
发表于 7 天前 | 显示全部楼层
西西研究员 发表于 2025-8-28 15:35
请您后续在同一条帖子下,不同楼层回复内容哈,以便于我们审查


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-01 09:22:22
已绑定手机

4

主题

4

回帖

54

积分

注册会员

积分
54
发表于 3 天前 | 显示全部楼层
  1. #include "config.h"                  
  2. void main(void)
  3. {
  4.    
  5.     SYS_Init();
  6.     while (1)
  7.     {
  8.         
  9.                           printf_usb("Hello World !\r\n");
  10.         
  11.     }
  12. }
  13. void SYS_Init(void)
  14. {
  15.     EnableAccessXFR();
  16.     IAP_SetTimeBase();                  
  17.     P0M0 = 0x00; P0M1 = 0x00;           
  18.     P1M0 = 0x00; P1M1 = 0x00;         
  19.     P2M0 = 0x00; P2M1 = 0x00;         
  20.     P3M0 = 0x00; P3M1 = 0x00;           
  21.     P4M0 = 0x00; P4M1 = 0x00;         
  22.     P5M0 = 0x00; P5M1 = 0x00;           
  23.     P6M0 = 0x00; P6M1 = 0x00;           
  24.     P7M0 = 0x00; P7M1 = 0x00;         
  25.     delay_ms(1);
  26.     USBLIB_Init();                     
  27.     delay_ms(1);
  28.         
  29.     EnableGlobalInt();                 
  30. }
  31. void delay_us(uint16_t us)
  32. {
  33.     do
  34.     {
  35.         NOP(14);                       
  36.     } while (--us);
  37. }
  38. void delay_ms(uint16_t ms)
  39. {
  40.     uint16_t i;
  41.     do
  42.     {
  43.         i = MAIN_Fosc / 10000;
  44.         while (--i);
  45.     } while (--ms);
  46. }
  47. void USBLIB_Init(void)
  48. {
  49.     usb_init();                        
  50.     USB_SetIntPriority(0);              
  51.     set_usb_ispcmd("@STCISP#");         
  52. }
  53. void USBLIB_WaitConfiged(void)
  54. {
  55.     while (DeviceState != DEVSTATE_CONFIGURED)
  56.         WDT_Clear();                    
  57. }
  58. void USBLIB_OUT_Done(void)
  59. {
  60.     if (bUsbOutReady)                  
  61.     {
  62.         USB_SendData(UsbOutBuffer, OutNumber);
  63.       
  64.         usb_OUT_done();                 
  65.     }
  66. }
复制代码
实验1代码和图片

截图202509011106313427.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-01 09:22:22
已绑定手机

4

主题

4

回帖

54

积分

注册会员

积分
54
发表于 3 天前 | 显示全部楼层
实验2代码和图片

  1. #include "config.h"                    
  2. void main(void)
  3. {
  4.    
  5.     SYS_Init();
  6.     while (1)
  7.     {
  8.         USBLIB_OUT_Done();            
  9.     }
  10. }
  11. void SYS_Init(void)
  12. {
  13.     EnableAccessXFR();                  
  14.     IAP_SetTimeBase();                  
  15.     P0M0 = 0x00; P0M1 = 0x00;           
  16.     P1M0 = 0x00; P1M1 = 0x00;        
  17.     P2M0 = 0x00; P2M1 = 0x00;        
  18.     P3M0 = 0x00; P3M1 = 0x00;      
  19.     P4M0 = 0x00; P4M1 = 0x00;        
  20.     P5M0 = 0x00; P5M1 = 0x00;        
  21.     P7M0 = 0x00; P7M1 = 0x00;         
  22.     delay_ms(1);
  23.     USBLIB_Init();                     
  24.     delay_ms(1);
  25.   
  26.     EnableGlobalInt();               
  27. }
  28. void delay_us(uint16_t us)
  29. {
  30.     do
  31.     {
  32.         NOP(14);                        
  33.     } while (--us);
  34. }
  35. void delay_ms(uint16_t ms)
  36. {
  37.     uint16_t i;
  38.     do
  39.     {
  40.         i = MAIN_Fosc / 10000;
  41.         while (--i);
  42.     } while (--ms);
  43. }
  44. void USBLIB_Init(void)
  45. {
  46.     usb_init();                        
  47.     USB_SetIntPriority(0);            
  48.     set_usb_ispcmd("@STCISP#");      
  49. }
  50. void USBLIB_WaitConfiged(void)
  51. {
  52.     while (DeviceState != DEVSTATE_CONFIGURED)
  53.         WDT_Clear();                  
  54. }
  55. void USBLIB_OUT_Done(void)
  56. {
  57.     if (bUsbOutReady)                  
  58.     {
  59.       
  60.                         if (UsbOutBuffer[0] == 6)
  61.                                         printf_usb("Hello World !\r\n");
  62.                         else if (UsbOutBuffer[0] == 7)
  63.                                         printf_usb("China !\r\n");
  64.         usb_OUT_done();               
  65.     }
  66. }
复制代码

截图202509011109259142.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-01 09:22:22
已绑定手机

4

主题

4

回帖

54

积分

注册会员

积分
54
发表于 3 天前 | 显示全部楼层
实验3代码和图片

  1. #include "config.h"                     
  2. void main(void)
  3. {
  4.     SYS_Init();
  5.     while (1)
  6.     {
  7.     }
  8. }
  9. void SYS_Init(void)
  10. {
  11.     EnableAccessXFR();                  
  12.     IAP_SetTimeBase();                 
  13.     P0M0 = 0x00; P0M1 = 0x00;         
  14.     P1M0 = 0x00; P1M1 = 0x00;         
  15.     P2M0 = 0x00; P2M1 = 0x00;           
  16.     P3M0 = 0x00; P3M1 = 0x00;         
  17.     P4M0 = 0x00; P4M1 = 0x00;         
  18.     P5M0 = 0x00; P5M1 = 0x00;         
  19.     P6M0 = 0x00; P6M1 = 0x00;         
  20.     P7M0 = 0x00; P7M1 = 0x00;         
  21.     delay_ms(1);
  22.     USBLIB_Init();                     
  23.     delay_ms(1);
  24.     EnableGlobalInt();                  
  25. }
  26. void delay_us(uint16_t us)
  27. {
  28.     do
  29.     {
  30.         NOP(14);                       
  31.     } while (--us);
  32. }
  33. void delay_ms(uint16_t ms)
  34. {
  35.     uint16_t i;
  36.     do
  37.     {
  38.         i = MAIN_Fosc / 10000;
  39.         while (--i);
  40.     } while (--ms);
  41. }
  42. void USBLIB_Init(void)
  43. {
  44.     usb_init();                        
  45.     USB_SetIntPriority(3);            
  46.     set_usb_OUT_callback(USBLIB_OUT_Callback);
  47.     set_usb_ispcmd("@STCISP#");      
  48. }
  49. void USBLIB_WaitConfiged(void)
  50. {
  51.     while (DeviceState != DEVSTATE_CONFIGURED)
  52.         WDT_Clear();                  
  53. }
  54. void USBLIB_OUT_Callback(void)
  55. {
  56.                 if (UsbOutBuffer[0] == 6)
  57.         printf_usb("Hello World !\r\n");        
  58.     else if (UsbOutBuffer[0] == 7)
  59.         printf_usb("China !\r\n");               
  60. }
复制代码

截图202509011113089740.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-4 04:59 , Processed in 0.132461 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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