130
1521
1865
金牌会员
#include <STC8G.H> #include "intrins.h" sbit LED1=P3^3; sbit KEY1=P3^2; #define MAIN_Fosc 11059200UL #define ON 0 #define OFF 1 //#define ld 1 typedef unsigned char u8; typedef unsigned int u16; u8 ld=0; u8 gear = 0; u8 noShiftTime = 0; // 自上次换挡以来的时间 void pwm_init(void); void delayms(u16 ms); void timer0_init() { TMOD &= 0xF0; TMOD |= 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; ET0 = 1; // 开启Timer0中断 EA = 1; // 开启全局中断 TR0 = 1; // 启动Timer0 } void Timer0_ISR() interrupt 1 { TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; noShiftTime++; if (noShiftTime >= 3000 / 1) { noShiftTime = 0; } } void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; while(1) { timer0_init(); pwm_init(); if (KEY1 == 0) { delayms(10); if (KEY1 == 0) { if (noShiftTime >= 3000 / 1) { ld = 0; // 关闭LED } gear = (gear + 1) % 4; // 切换档位,循环回到0 while (!KEY1); // 等待按钮释放 noShiftTime = 0; } } switch (gear) { case 0: ld=0; break; case 1: ld=15; break; case 2: ld=35; break; case 3: ld=95; break; } delayms(10); } } void pwm_init(void) { CCON = 0x00; CMOD = 0x08; CL = 0x00; CH = 0x00; CCAPM1 = 0x42; PCA_PWM1 = 0x00; CCAP1L = ld; CCAP1H = ld; CR=1; // while(1); } void delayms(u16 ms) { u16 i; do{ i = MAIN_Fosc /10000; while(--i); }while(--ms); } 复制代码
使用道具 举报 送花
0
336
1494
xxxe*** 发表于 2024-6-29 12:12 你这个很容易啊,用一个8脚的单片机配合一键开关机电路,一个按键不仅可以开关机,还可以调PWM,eeprom不考 ...
xxxevery 发表于 2024-6-29 12:38 你这样写明显不合理嘛,难道必须开机就调亮度,中途调亮度就不行?你把key1设成长短按不就很好解决了 ...
19
3191
4876
论坛元老
soma 发表于 2024-6-29 15:41 用ai自动生成基础代码在修改
vb2002 发表于 2024-6-29 17:25 比如说?我就懂文言一心
5
296
2068
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-3 08:13 , Processed in 0.153416 second(s), 107 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.