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

实在是没办法了,弄了一晚上了还是弄不好 AI 帮人写的代码

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-6-30 23:43:42 | 显示全部楼层
晓*** 发表于 2024-6-30 22:47
目前AI对问题的理解能力还是差了点,我按你的要求手搓了一点代码,可以实现5档PWM调节,实测可以的,你参考 ...

我靠,,真大神....
我看视频就是这个,.
我稍稍修改一下.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-7-2 09:09:29 | 显示全部楼层
晓*** 发表于 2024-6-30 22:47
目前AI对问题的理解能力还是差了点,我按你的要求手搓了一点代码,可以实现5档PWM调节,实测可以的,你参考 ...

根据您的代码我改好了,花了2天时间
超级好用,但是现在有个问题.
就是我不能定义自己的数值,因为手电亮度比较大.
占空比数据  不知道从哪里改了.
这是我改的代码,把Time4改成Time0了
然后把PWM引脚等数据稍微改了一下.

  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. #define         MAIN_Fosc        11059200L
  4. #define NUM_PWM_LEVELS 5 // 自定义占空比等级的数量
  5. unsigned char pwm_levels[NUM_PWM_LEVELS] = {5, 200, 500, 5000, 12000}; // 占空比等级列表,可以根据需要调整
  6. unsigned char PWM_SAVE;
  7. sbit key = P3^2;
  8. bit key_flag;
  9. unsigned char PWM_MODE;
  10. unsigned char time_out;
  11. void PWM_init(void)
  12. {
  13.     PWMA_CCER2 = 0x00;                          //写CCMRx前必须先清零CCERx关闭通道
  14.     PWMA_CCMR4 = 0x60;                          //设置CC1为PWMA输出模式
  15.     PWMA_PS        = 0xc0;
  16.     PWMA_CCER2 = 0x50;                          //使能CC4通道双极
  17.    PWMA_CCR4 = 0;
  18.     PWMA_ARR = 12000;             //设置周期时间        1~65535
  19.         PWMA_ENO = 0xC0;                            //使能PWM4P+N端口输出
  20.         PWMA_PSCR = 0;                                                                //PWM时钟预分频寄存器 0~65535        
  21.     PWMA_BKR = 0x80;                            //使能主输出
  22.     PWMA_CR1 = 0x01;                            //开始计时               
  23. }
  24. void PWM_updata(unsigned char duty)    //duty取值0~100,duty = 0时,关闭输出,PWM端口释放为普通IO
  25. {
  26.     if(duty > 0)   //
  27.     {
  28.         PWMA_CCR4 = duty * 120;
  29.         PWMA_ENO = 0xC0;
  30.         PWMA_BKR = 0x80;                            //使能主输出
  31.         PWMA_CR1 = 0x01;                            //开始计时
  32.     }
  33.     else
  34.     {
  35.         PWMA_BKR = 0x00;                            //关主输出
  36.         PWMA_CR1 = 0x00;                            //停止计时
  37.         PWMA_ENO &= ~0xC0;    //关闭PWM端口
  38.         P33 = 1;P34 = 1;
  39.     }
  40. }
  41. void Timer0_Isr(void) interrupt 1
  42. {
  43.         static unsigned char key_sta;
  44.         
  45.         switch(key_sta)                //按键检测状态机
  46.         {
  47.                 case 0:
  48.                         if (key == 0) key_sta++;  //如果有按键 跳下一个模式
  49.                 break;
  50.                 case 1:
  51.                         if (key == 0) key_sta++;  //如果持续按键 跳下一个模式
  52.                         else key_sta = 0;
  53.                 break;
  54.                 case 2:
  55.                         if (key == 1) key_sta++;  //如果按键释放 跳下一个模式
  56.                 break;               
  57.                 case 3:
  58.                         key_flag = 1;
  59.                         key_sta = 0;
  60.                 break;        
  61.                 default:
  62.                         key_sta = 0;
  63.                 break;
  64.         }
  65.         if (time_out < 20)        time_out++;   //50ms x 60 = 3000ms = 3秒,这里是超时计数器
  66. }
  67. void Timer0_Init(void)                //50毫秒@11.0592MHz
  68. {
  69.         AUXR &= 0x7F;                        //定时器时钟12T模式
  70.         TMOD &= 0xF0;                        //设置定时器模式
  71.         TL0 = 0x00;                                //设置定时初始值
  72.         TH0 = 0x4C;                                //设置定时初始值
  73.         TF0 = 0;                                //清除TF0标志
  74.         TR0 = 1;                                //定时器0开始计时
  75.         IE = 0x02;                                //定时器0开启中断
  76. }
  77. void main()
  78. {
  79.             int current_level = 0; // 当前选中的占空比等级
  80.         EAXSFR();   //
  81.     P0M0 = 0x00; P0M1 = 0x00;
  82.     P1M0 = 0x00; P1M1 = 0x00;
  83.     P2M0 = 0x00; P2M1 = 0x00;
  84.     P3M0 = 0x00; P3M1 = 0x00;
  85.     P4M0 = 0x00; P4M1 = 0x00;
  86.     P5M0 = 0x00; P5M1 = 0x00;
  87.     P6M0 = 0x00; P6M1 = 0x00;
  88.     P7M0 = 0x00; P7M1 = 0x00;
  89.         PWM_init();
  90.         Timer0_Init();
  91.         EA = 1;
  92.     while(1)
  93.         {
  94.                 if(key_flag)   //如果有按键事件
  95.                 {
  96.                         key_flag = 0;  //清按键标记
  97.                         if (time_out < 20)  //按键还没超时
  98.        
  99.                         {
  100.                                 PWM_MODE++;
  101.                                 if(PWM_MODE > 5) PWM_MODE = 1;
  102.                                 PWM_updata(PWM_MODE*20);
  103.                                 time_out = 0;
  104.                         }
  105.                         else            //按键超时了
  106.                         {
  107.                                 if(PWM_MODE)        //有输出状态时关闭输出
  108.                                 {
  109.                                         PWM_SAVE = PWM_MODE;  //保存当前状态 //可以移植代码保存到EEPROM
  110.                                         PWM_MODE = 0;
  111.                                         PWM_updata(0);
  112.                                 }
  113.                                 else                        //关闭状态时恢复之前的PWM
  114.                                 {
  115.                                         if(PWM_SAVE == 0) PWM_SAVE = 1;  //首次按键启动最低亮度
  116.                                         PWM_MODE = PWM_SAVE;       //恢复之前的PWM //可以移植代码从EEPROM读取
  117.                                         time_out = 0;
  118.                                         PWM_updata(PWM_MODE*20);
  119.                                 }
  120.                         }
  121.                 }
  122.         }
  123. }
复制代码

点评

PWM的占空比 duty = PWMA_CCR4 / PWMA_ARR,我代码中,PWMA_ARR设置为12000,那么PWMA_CCR4 的取值范围就是0~12000,所以PWM_updata函数中的duty要乘以120给PWMA_CCR4 赋值。通过修改PWMA_CCR4 的值就可以改变PW  详情 回复 发表于 2024-7-2 11:02
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-7-2 11:02:58 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-7-2 11:12 编辑
vb2*** 发表于 2024-7-2 09:09
根据您的代码我改好了,花了2天时间
超级好用,但是现在有个问题.
就是我不能定义自己的数值,因为手电亮度 ...

PWM的占空比 duty = PWMA_CCR4 /  PWMA_ARR,我代码中,PWM_updata函数中的duty取值范围是0~100,你可以修改duty的变量类型为unsigned int,赋值给PWMA_CCR4不必再乘120,
然后通过PWM_updata(pwm_levels[PWM_MODE - 1])调用PWM更新

  1. void PWM_updata(unsigned int duty)    //duty取值0~100,duty = 0时,关闭输出,PWM端口释放为普通IO
  2. {
  3.     if(duty > 0)   //
  4.     {
  5.         PWMA_CCR4 = duty;
  6.         PWMA_ENO = 0xC0;
  7.         PWMA_BKR = 0x80;                            //使能主输出
  8.         PWMA_CR1 = 0x01;                            //开始计时
  9.     }
  10.     else
  11.     {
  12.         PWMA_BKR = 0x00;                            //关主输出
  13.         PWMA_CR1 = 0x00;                            //停止计时
  14.         PWMA_ENO &= ~0xC0;    //关闭PWM端口
  15.         P33 = 1;P34 = 1;
  16.     }
  17. }
复制代码



睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-7-2 15:36:00 | 显示全部楼层
晓*** 发表于 2024-7-2 11:02
PWM的占空比 duty = PWMA_CCR4 /  PWMA_ARR,我代码中,PWM_updata函数中的duty取值范围是0~100,你可以修 ...

好的,收到.大佬威武!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-7-2 19:03:50 | 显示全部楼层
晓*** 发表于 2024-7-2 11:02
PWM的占空比 duty = PWMA_CCR4 /  PWMA_ARR,我代码中,PWM_updata函数中的duty取值范围是0~100,你可以修 ...

搞定了.超级好用.真心感谢飞哥
现在的逻辑是 我想设置什么档位就设置什么档位
并且还有保存当前档位亮度的用途.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:372
  • 最近打卡:2025-05-01 10:53:48

12

主题

125

回帖

1685

积分

金牌会员

积分
1685
发表于 2024-7-2 22:33:46 | 显示全部楼层
vb2*** 发表于 2024-7-2 19:03
搞定了.超级好用.真心感谢飞哥
现在的逻辑是 我想设置什么档位就设置什么档位
并且还有保存当前档位亮度 ...

看数据手册吧,这个涉及操作EEPROM,会操作就会保存了,学习单片机不能急,所有外设会用才学了个基础,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-8-4 12:33:45 | 显示全部楼层
晓*** 发表于 2024-7-2 11:02
PWM的占空比 duty = PWMA_CCR4 /  PWMA_ARR,我代码中,PWM_updata函数中的duty取值范围是0~100,你可以修 ...

飞哥,这个是机械开关的换挡,并且可以均衡磨损eeprom

但是在switch那里有点乱.
我加了个定时器,(想弄成开机后成3秒内关了再开,换挡,.... 开机3秒后,,关机再开,就回到关机之前的档位).

可以帮帮我吗?
EEPROM.c (1.78 KB, 下载次数: 63) EEPROM.h (1.07 KB, 下载次数: 63) main.c (4.27 KB, 下载次数: 66) 1.35 eeprom 均衡timer0.zip (82.86 KB, 下载次数: 81)




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:200
  • 最近打卡:2025-05-03 00:16:59
已绑定手机

24

主题

345

回帖

1637

积分

金牌会员

积分
1637
发表于 2024-11-1 09:11:49 | 显示全部楼层
板子还挺好看的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 00:27:19
已绑定手机

130

主题

1521

回帖

1865

积分

金牌会员

积分
1865
发表于 2024-11-1 09:18:52 来自手机 | 显示全部楼层
angalp 发表于 2024-11-1 09:11
板子还挺好看的

哪个板子?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:16 , Processed in 0.147795 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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