数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 396|回复: 7

[C51] 试做AI编程_STC8H红外接收

[复制链接]
发表于 2025-5-19 20:13:17 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 devcang 于 2025-5-19 21:00 编辑


  1. #include <STC8H2K12U.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. // 引脚定义
  6. sbit IR_IN    = P3^4;  // 红外接收引脚(中断方式)
  7. sbit BTN      = P3^2;  // 按钮引脚(中断方式)
  8. sbit IR_OUT   = P3^3;  // 红外发送引脚
  9. sbit RED_LED  = P3^5;  // 状态指示LED(红光)

  10. // 系统状态定义
  11. typedef enum {
  12.     STATE_IDLE,       // 空闲状态
  13.     STATE_LEARNING,   // 学习模式
  14.     STATE_SENDING,    // 发送状态
  15.     STATE_SLEEPING    // 休眠状态
  16. } SystemState;

  17. // 红外接收状态
  18. typedef enum {
  19.     IR_STATE_IDLE,    // 空闲状态
  20.     IR_STATE_HEADER,  // 接收引导码
  21.     IR_STATE_DATA,    // 接收数据
  22.     IR_STATE_DONE     // 接收完成
  23. } IRState;

  24. // NEC协议参数(时间根据22.184MHz晶振调整)
  25. #define NEC_HEADER_HIGH_TIME    9000    // 引导码高电平时间(us)
  26. #define NEC_HEADER_LOW_TIME     4500    // 引导码低电平时间(us)
  27. #define NEC_BIT_1_HIGH_TIME     560     // 数据位1高电平时间(us)
  28. #define NEC_BIT_1_LOW_TIME      1690    // 数据位1低电平时间(us)
  29. #define NEC_BIT_0_HIGH_TIME     560     // 数据位0高电平时间(us)
  30. #define NEC_BIT_0_LOW_TIME      560     // 数据位0低电平时间(us)
  31. #define NEC_REPEAT_HIGH_TIME    9000    // 重复码高电平时间(us)
  32. #define NEC_REPEAT_LOW_TIME     2250    // 重复码低电平时间(us)
  33. #define NEC_REPEAT_PULSE_TIME   560     // 重复码脉冲时间(us)
  34. #define NEC_FRAME_INTERVAL      100000  // 帧间隔时间(us)

  35. // 内部EEPROM参数
  36. #define EEPROM_START_ADDR   0x2000  // EEPROM起始地址
  37. #define IR_DATA_ADDR        0x2000  // 红外数据存储地址

  38. // 按钮参数
  39. #define BTN_DEBOUNCE_TIME   20      // 消抖时间(ms)
  40. #define BTN_LONG_PRESS_TIME 2000    // 长按时间(ms)

  41. // 全局变量
  42. SystemState g_SystemState = STATE_IDLE;  // 系统当前状态
  43. uint g_TimerCount = 0;                   // 定时器计数
  44. uint g_BtnPressTime = 0;                 // 按钮按下时间
  45. uint g_IRData[4] = {0};                  // 存储红外编码数据
  46. uchar g_IRDataReady = 0;                 // 红外数据就绪标志
  47. uchar g_HourCounter = 0;                 // 小时计数器
  48. uchar g_BtnDebounce = 0;                 // 按键消抖标志
  49. uchar g_BtnPressed = 0;                  // 按键按下标志

  50. // 红外接收相关变量
  51. IRState g_IRState = IR_STATE_IDLE;       // 红外接收状态
  52. uint g_IRHighTime = 0;                   // 高电平时间
  53. uint g_IRLowTime = 0;                    // 低电平时间
  54. uint g_IRDataBuffer = 0;                 // 红外数据缓冲区
  55. uchar g_IRBitCount = 0;                  // 红外位计数器
  56. uchar g_IRByteIndex = 0;                 // 红外字节索引

  57. // 函数声明
  58. void System_Init(void);
  59. void Timer0_Init(void);
  60. void Ext0_Init(void);
  61. void Ext1_Init(void);
  62. void Disable_Ext0(void);
  63. void Enable_Ext0(void);
  64. void Disable_Ext1(void);
  65. void Enable_Ext1(void);
  66. void EEPROM_Init(void);
  67. uchar EEPROM_ReadByte(uint addr);
  68. void EEPROM_WriteByte(uint addr, uchar dat);
  69. void EEPROM_EraseSector(uint addr);
  70. void EEPROM_WriteIRData(uint *data);
  71. void EEPROM_ReadIRData(uint *data);
  72. void Handle_Button(void);
  73. void Enter_Sleep_Mode(void);
  74. void Exit_Sleep_Mode(void);
  75. void Update_LED(void);
  76. void Delay_us(uint us);
  77. void Delay_ms(uint ms);
  78. void Send_NEC_Frame(uint *data);
  79. void Generate_38KHz_Pulse(uint time_us);
  80. void Process_IR_Data(void);

  81. // 系统初始化
  82. void System_Init(void) {
  83.     P3M0 = 0x20;  // P3.5(LED)设置为推挽输出
  84.     P3M1 = 0x00;
  85.    
  86.     Timer0_Init();
  87.     Ext0_Init();      // 初始化外部中断0(按钮)
  88.     Ext1_Init();      // 初始化外部中断1(红外)
  89.     EEPROM_Init();
  90.     RED_LED = 0;      // 初始LED熄灭
  91. }

  92. // 定时器0初始化(100us)
  93. void Timer0_Init(void) {
  94.     TMOD &= 0xF0;     // 清除定时器0模式位
  95.     TMOD |= 0x01;     // 设置定时器0为模式1(16位自动重装载)
  96.     TH0 = 0xFD;       // 定时初值高8位(22.184MHz晶振)
  97.     TL0 = 0x40;       // 定时初值低8位(100us@22.184MHz)
  98.     ET0 = 1;          // 使能定时器0中断
  99.     TR0 = 1;          // 启动定时器0
  100.     EA = 1;           // 开总中断
  101. }

  102. // 外部中断0初始化(按钮,下降沿触发)
  103. void Ext0_Init(void) {
  104.     IT0 = 1;          // 设置INT0为边沿触发
  105.     EX0 = 1;          // 使能外部中断0
  106. }

  107. // 外部中断1初始化(红外,下降沿触发)
  108. void Ext1_Init(void) {
  109.     IT1 = 1;          // 设置INT1为边沿触发
  110.     EX1 = 1;          // 使能外部中断1
  111. }

  112. // 禁用外部中断0
  113. void Disable_Ext0(void) {
  114.     EX0 = 0;          // 禁用外部中断0
  115. }

  116. // 启用外部中断0
  117. void Enable_Ext0(void) {
  118.     EX0 = 1;          // 启用外部中断0
  119. }

  120. // 禁用外部中断1
  121. void Disable_Ext1(void) {
  122.     EX1 = 0;          // 禁用外部中断1
  123. }

  124. // 启用外部中断1
  125. void Enable_Ext1(void) {
  126.     EX1 = 1;          // 启用外部中断1
  127. }

  128. // EEPROM初始化(STC8H系列)
  129. void EEPROM_Init(void) {
  130.     IAP_CONTR = 0x80;  // 使能IAP功能,Fosc≤24MHz
  131. }

  132. // 从EEPROM读取一个字节
  133. uchar EEPROM_ReadByte(uint addr) {
  134.     uchar dat;
  135.     EA = 0;           // 关中断
  136.    
  137.     IAP_CONTR = 0x81; // 使能IAP功能,Fosc≤24MHz
  138.     IAP_CMD = 1;      // 读命令
  139.     IAP_ADDRH = (uchar)(addr >> 8);  // 设置地址高字节
  140.     IAP_ADDRL = (uchar)(addr);       // 设置地址低字节
  141.     IAP_TRIG = 0x46;  // 触发命令
  142.     IAP_TRIG = 0xB9;  // 触发命令
  143.    
  144.     dat = IAP_DATA;   // 读取数据
  145.    
  146.     IAP_CONTR = 0;    // 关闭IAP功能
  147.     EA = 1;           // 开中断
  148.    
  149.     return dat;
  150. }

  151. // 向EEPROM写入一个字节
  152. void EEPROM_WriteByte(uint addr, uchar dat) {
  153.     EA = 0;           // 关中断
  154.    
  155.     IAP_CONTR = 0x81; // 使能IAP功能,Fosc≤24MHz
  156.     IAP_CMD = 2;      // 写命令
  157.     IAP_ADDRH = (uchar)(addr >> 8);  // 设置地址高字节
  158.     IAP_ADDRL = (uchar)(addr);       // 设置地址低字节
  159.     IAP_DATA = dat;   // 设置要写入的数据
  160.     IAP_TRIG = 0x46;  // 触发命令
  161.     IAP_TRIG = 0xB9;  // 触发命令
  162.    
  163.     IAP_CONTR = 0;    // 关闭IAP功能
  164.     EA = 1;           // 开中断
  165.    
  166.     Delay_ms(5);      // 等待写入完成
  167. }

  168. // 擦除EEPROM扇区(512字节)
  169. void EEPROM_EraseSector(uint addr) {
  170.     EA = 0;           // 关中断
  171.    
  172.     IAP_CONTR = 0x81; // 使能IAP功能,Fosc≤24MHz
  173.     IAP_CMD = 3;      // 擦除命令
  174.     IAP_ADDRH = (uchar)(addr >> 8);  // 设置地址高字节
  175.     IAP_ADDRL = (uchar)(addr);       // 设置地址低字节
  176.     IAP_TRIG = 0x46;  // 触发命令
  177.     IAP_TRIG = 0xB9;  // 触发命令
  178.    
  179.     IAP_CONTR = 0;    // 关闭IAP功能
  180.     EA = 1;           // 开中断
  181.    
  182.     Delay_ms(5);      // 等待擦除完成
  183. }

  184. // 保存红外数据到EEPROM
  185. void EEPROM_WriteIRData(uint *data) {
  186.     uchar i;
  187.     uchar *p = (uchar *)data;
  188.    
  189.     // 擦除扇区
  190.     EEPROM_EraseSector(IR_DATA_ADDR);
  191.    
  192.     // 写入8个字节的红外数据
  193.     for(i = 0; i < 8; i++) {
  194.         EEPROM_WriteByte(IR_DATA_ADDR + i, p[i]);
  195.     }
  196.    
  197.     // 写入校验字节
  198.     uchar checksum = 0;
  199.     for(i = 0; i < 8; i++) {
  200.         checksum ^= p[i];
  201.     }
  202.     EEPROM_WriteByte(IR_DATA_ADDR + 8, checksum);
  203. }

  204. // 从EEPROM读取红外数据
  205. void EEPROM_ReadIRData(uint *data) {
  206.     uchar i;
  207.     uchar *p = (uchar *)data;
  208.     uchar checksum = 0;
  209.    
  210.     // 读取8个字节的红外数据
  211.     for(i = 0; i < 8; i++) {
  212.         p[i] = EEPROM_ReadByte(IR_DATA_ADDR + i);
  213.         checksum ^= p[i];
  214.     }
  215.    
  216.     // 读取校验字节
  217.     uchar stored_checksum = EEPROM_ReadByte(IR_DATA_ADDR + 8);
  218.    
  219.     // 验证校验和
  220.     if(checksum == stored_checksum) {
  221.         g_IRDataReady = 1;
  222.     } else {
  223.         g_IRDataReady = 0;
  224.     }
  225. }

  226. // 处理按键事件
  227. void Handle_Button(void) {
  228.     if(g_BtnPressed) {
  229.         uint press_time = g_TimerCount - g_BtnPressTime;
  230.         
  231.         // 长按进入/退出休眠模式
  232.         if(press_time > (BTN_LONG_PRESS_TIME * 10)) {
  233.             if(g_SystemState == STATE_SLEEPING) {
  234.                 Exit_Sleep_Mode();
  235.             } else {
  236.                 Enter_Sleep_Mode();
  237.             }
  238.             g_BtnPressed = 0;
  239.         }
  240.     }
  241. }

  242. // 进入休眠模式
  243. void Enter_Sleep_Mode(void) {
  244.     g_SystemState = STATE_SLEEPING;
  245.     Disable_Ext0();        // 禁用外部中断0(按钮)
  246.     Disable_Ext1();        // 禁用外部中断1(红外)
  247.     TR0 = 0;               // 停止定时器0
  248.     RED_LED = 0;           // 熄灭LED
  249.    
  250.     // 配置唤醒方式(低电平触发按钮)
  251.     IT0 = 0;               // 设置INT0为电平触发
  252.     Enable_Ext0();         // 启用外部中断0(按钮)
  253.    
  254.     PCON |= 0x02;          // 进入掉电模式
  255.     _nop_();               // 确保指令执行
  256. }

  257. // 退出休眠模式
  258. void Exit_Sleep_Mode(void) {
  259.     Disable_Ext0();        // 禁用外部中断0
  260.    
  261.     // 恢复系统状态
  262.     g_SystemState = STATE_IDLE;
  263.     Ext0_Init();           // 重新初始化外部中断0(按钮,下降沿触发)
  264.     Ext1_Init();           // 重新初始化外部中断1(红外,下降沿触发)
  265.     Timer0_Init();         // 重新初始化定时器0
  266. }

  267. // 更新LED状态
  268. void Update_LED(void) {
  269.     switch(g_SystemState) {
  270.         case STATE_IDLE:
  271.             RED_LED = 0;  // 熄灭
  272.             break;
  273.         case STATE_LEARNING:
  274.             // 慢速闪烁(0.5Hz)
  275.             if((g_TimerCount / 20000) % 2 == 0) {
  276.                 RED_LED = 1;
  277.             } else {
  278.                 RED_LED = 0;
  279.             }
  280.             break;
  281.         case STATE_SENDING:
  282.             RED_LED = 1;  // 点亮
  283.             break;
  284.         case STATE_SLEEPING:
  285.             RED_LED = 0;  // 熄灭
  286.             break;
  287.     }
  288. }

  289. // 微秒延时函数(针对22.184MHz晶振调整)
  290. void Delay_us(uint us) {
  291.     while(us--) {
  292.         _nop_();
  293.         _nop_();
  294.         _nop_();
  295.         _nop_();
  296.         _nop_();
  297.         _nop_();
  298.     }
  299. }

  300. // 毫秒延时函数
  301. void Delay_ms(uint ms) {
  302.     while(ms--) {
  303.         Delay_us(1000);
  304.     }
  305. }

  306. // 生成38KHz载波
  307. void Generate_38KHz_Pulse(uint time_us) {
  308.     uint i;
  309.     uint cycles = time_us / 26;  // 38KHz周期约26us
  310.    
  311.     for(i = 0; i < cycles; i++) {
  312.         IR_OUT = 1;
  313.         Delay_us(13);
  314.         IR_OUT = 0;
  315.         Delay_us(13);
  316.     }
  317. }

  318. // 发送NEC格式帧
  319. void Send_NEC_Frame(uint *data) {
  320.     uchar i, j;
  321.     uint temp;
  322.    
  323.     // 发送引导码
  324.     Generate_38KHz_Pulse(NEC_HEADER_HIGH_TIME);
  325.     Delay_us(NEC_HEADER_LOW_TIME);
  326.    
  327.     // 发送用户码(16位)
  328.     for(i = 0; i < 2; i++) {
  329.         temp = data[i];
  330.         for(j = 0; j < 8; j++) {
  331.             // 发送数据位
  332.             Generate_38KHz_Pulse(NEC_BIT_1_HIGH_TIME);
  333.             if(temp & 0x01) {
  334.                 Delay_us(NEC_BIT_1_LOW_TIME);
  335.             } else {
  336.                 Delay_us(NEC_BIT_0_LOW_TIME);
  337.             }
  338.             temp >>= 1;
  339.         }
  340.     }
  341.    
  342.     // 发送键数据码和键数据反码(16位)
  343.     for(i = 2; i < 4; i++) {
  344.         temp = data[i];
  345.         for(j = 0; j < 8; j++) {
  346.             // 发送数据位
  347.             Generate_38KHz_Pulse(NEC_BIT_1_HIGH_TIME);
  348.             if(temp & 0x01) {
  349.                 Delay_us(NEC_BIT_1_LOW_TIME);
  350.             } else {
  351.                 Delay_us(NEC_BIT_0_LOW_TIME);
  352.             }
  353.             temp >>= 1;
  354.         }
  355.     }
  356.    
  357.     // 发送结束脉冲
  358.     Generate_38KHz_Pulse(NEC_BIT_1_HIGH_TIME);
  359. }

  360. // 处理接收到的红外数据
  361. void Process_IR_Data(void) {
  362.     // 验证数据(用户码取反和键码取反)
  363.     if((g_IRData[0] != (~g_IRData[1] & 0xFFFF)) ||
  364.        (g_IRData[2] != (~g_IRData[3] & 0xFFFF))) {
  365.         return;  // 数据校验失败
  366.     }
  367.    
  368.     // 保存接收到的数据
  369.     EEPROM_WriteIRData(g_IRData);
  370.     g_IRDataReady = 1;
  371.    
  372.     // 学习完成,返回空闲状态
  373.     g_SystemState = STATE_IDLE;
  374. }

  375. // 定时器0中断服务函数(100us)
  376. void Timer0_ISR(void) interrupt 1 {
  377.     TH0 = 0xFD;               // 重新加载初值(22.184MHz)
  378.     TL0 = 0x40;
  379.    
  380.     g_TimerCount++;
  381.    
  382.     // 每小时发送一次红外编码
  383.     if(g_SystemState != STATE_SLEEPING && g_SystemState != STATE_LEARNING) {
  384.         if(g_TimerCount >= 36000000) {  // 1小时 = 3600秒 = 36000000 * 100us
  385.             g_TimerCount = 0;
  386.             g_HourCounter++;
  387.             
  388.             if(g_IRDataReady) {
  389.                 g_SystemState = STATE_SENDING;
  390.                 Send_NEC_Frame(g_IRData);
  391.                 Delay_ms(100);  // 确保发送完成
  392.                 g_SystemState = STATE_IDLE;
  393.             }
  394.         }
  395.     }
  396.    
  397.     // 按键消抖计数
  398.     if(g_BtnDebounce > 0) {
  399.         g_BtnDebounce--;
  400.     }
  401. }

  402. // 外部中断0服务函数(按钮)
  403. void Ext0_ISR(void) interrupt 0 {
  404.     static uchar last_state = 1;  // 上次引脚状态
  405.     uchar current_state = BTN;    // 当前引脚状态
  406.    
  407.     // 状态变化检测
  408.     if(current_state != last_state) {
  409.         // 记录状态变化时间
  410.         uint change_time = g_TimerCount;
  411.         
  412.         // 消抖处理
  413.         if(g_BtnDebounce == 0) {
  414.             if(current_state == 0) {  // 按键按下
  415.                 g_BtnPressTime = change_time;
  416.                 g_BtnPressed = 1;
  417.                 g_BtnDebounce = BTN_DEBOUNCE_TIME;
  418.             } else {  // 按键释放
  419.                 // 短按切换学习模式
  420.                 if(g_BtnPressed && (change_time - g_BtnPressTime) < (BTN_LONG_PRESS_TIME * 10)) {
  421.                     if(g_SystemState == STATE_IDLE) {
  422.                         g_SystemState = STATE_LEARNING;
  423.                         // 初始化红外接收状态
  424.                         g_IRState = IR_STATE_IDLE;
  425.                         g_IRBitCount = 0;
  426.                         g_IRByteIndex = 0;
  427.                         g_IRDataBuffer = 0;
  428.                     } else if(g_SystemState == STATE_LEARNING) {
  429.                         g_SystemState = STATE_IDLE;
  430.                     }
  431.                 }
  432.                 g_BtnPressed = 0;
  433.                 g_BtnDebounce = BTN_DEBOUNCE_TIME;
  434.             }
  435.         }
  436.     }
  437.    
  438.     last_state = current_state;
  439.    
  440.     // 如果是从休眠中唤醒
  441.     if(g_SystemState == STATE_SLEEPING) {
  442.         Exit_Sleep_Mode();
  443.     }
  444. }

  445. // 外部中断1服务函数(红外接收)
  446. void Ext1_ISR(void) interrupt 2 {
  447.     static uchar last_state = 1;  // 上次引脚状态
  448.     uchar current_state = IR_IN;  // 当前引脚状态
  449.    
  450.     // 状态变化检测
  451.     if(current_state != last_state) {
  452.         // 记录状态变化时间
  453.         uint change_time = g_TimerCount;
  454.         
  455.         // 红外接收处理(仅在学习模式下)
  456.         if(g_SystemState == STATE_LEARNING) {
  457.             if(current_state == 1) {  // 上升沿
  458.                 // 记录高电平时间
  459.                 g_IRHighTime = change_time;
  460.             } else {  // 下降沿
  461.                 // 计算高电平持续时间
  462.                 uint high_duration = change_time - g_IRHighTime;
  463.                
  464.                 switch(g_IRState) {
  465.                     case IR_STATE_IDLE:
  466.                         // 等待引导码高电平
  467.                         if(high_duration > ((NEC_HEADER_HIGH_TIME - 1000) / 100) &&
  468.                            high_duration < ((NEC_HEADER_HIGH_TIME + 1000) / 100)) {
  469.                             g_IRState = IR_STATE_HEADER;
  470.                             g_IRLowTime = change_time;
  471.                         }
  472.                         break;
  473.                         
  474.                     case IR_STATE_HEADER:
  475.                         // 检测引导码低电平
  476.                         if(high_duration > ((NEC_HEADER_LOW_TIME - 1000) / 100) &&
  477.                            high_duration < ((NEC_HEADER_LOW_TIME + 1000) / 100)) {
  478.                             g_IRState = IR_STATE_DATA;
  479.                             g_IRBitCount = 0;
  480.                             g_IRByteIndex = 0;
  481.                             g_IRDataBuffer = 0;
  482.                         } else {
  483.                             g_IRState = IR_STATE_IDLE;  // 错误,重新开始
  484.                         }
  485.                         break;
  486.                         
  487.                     case IR_STATE_DATA:
  488.                         // 接收数据位
  489.                         if(g_IRBitCount < 8) {
  490.                             // 存储数据位
  491.                             if(high_duration > ((NEC_BIT_1_LOW_TIME - 300) / 100)) {
  492.                                 g_IRDataBuffer |= (1 << g_IRBitCount);  // 位1
  493.                             }
  494.                            
  495.                             g_IRBitCount++;
  496.                            
  497.                             // 一个字节接收完成
  498.                             if(g_IRBitCount >= 8) {
  499.                                 g_IRData[g_IRByteIndex] = g_IRDataBuffer;
  500.                                 g_IRByteIndex++;
  501.                                 g_IRBitCount = 0;
  502.                                 g_IRDataBuffer = 0;
  503.                                 
  504.                                 // 32位数据全部接收完成
  505.                                 if(g_IRByteIndex >= 4) {
  506.                                     g_IRState = IR_STATE_DONE;
  507.                                     Process_IR_Data();
  508.                                 }
  509.                             }
  510.                         }
  511.                         break;
  512.                         
  513.                     default:
  514.                         g_IRState = IR_STATE_IDLE;
  515.                         break;
  516.                 }
  517.             }
  518.         }
  519.     }
  520.    
  521.     last_state = current_state;
  522. }

  523. // 主函数
  524. void main(void) {
  525.     // 系统初始化
  526.     System_Init();
  527.    
  528.     // 从EEPROM读取保存的红外数据
  529.     EEPROM_ReadIRData(g_IRData);
  530.    
  531.     // 如果没有有效数据,进入学习模式
  532.     if(!g_IRDataReady) {
  533.         g_SystemState = STATE_LEARNING;
  534.     }
  535.    
  536.     while(1) {
  537.         // 只有在非休眠模式下才检测按钮
  538.         if(g_SystemState != STATE_SLEEPING) {
  539.             Handle_Button();
  540.             Update_LED();
  541.         }
  542.         
  543.         // 其他低优先级任务
  544.         // ...
  545.     }
  546. }

复制代码


STC8H2K12U
外围很少的
22.1184MHZ
P3^2 连接按钮
P3^4红外接收

上边代码是AI自动生成的,raw-copy、没修改过,大家说,可以用么






 楼主| 发表于 2025-5-20 08:58:05 | 显示全部楼层
发现ai也会“整”人的,故意用关键字用变量名。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-20 18:43:49 | 显示全部楼层
chanwah2009 发表于 2025-5-20 09:53
stc例程里有,比这简单多了


用ai是好玩
很多方面的程序都能ai一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-21 07:21:01 | 显示全部楼层


不是那么好玩,给ai指定了单片机型号,结果昨晚测试串口是不能用的 ,别的还没试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-21 15:59:03 | 显示全部楼层
kindzhon 发表于 2025-5-21 13:08
如果不是nec编码的,就学习不了吧?很多机顶盒就不是标准的nec


要是ai写出来 的能行,可以让ai重写一个   

     
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-3 03:08 , Processed in 0.109200 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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