151
1842
2172
金牌会员
使用道具 举报 送花
8
318
1837
9
396
2869
Lkck*** 发表于 2024-7-2 15:51 上示波器看看IN1波形
wnag*** 发表于 2024-7-2 15:55 如果LED正极接电源,负极接NMOS,那么输出1LED灭,输出0LED亮
网*** 发表于 2024-7-2 16:10 都是小问题,学好基础再做应用.搞技术忌浮躁
vb2*** 发表于 2024-7-2 16:15 没有人指点,学起来真真有点难 C语言,单片机.手册和视频加百度
网*** 发表于 2024-7-2 16:23 你测试LED灯时候,有没有接NMOS? 加了NMOS电路后,相当于多加了个反相器, 如果是这个原因,只能说明你对基础 ...
wnag*** 发表于 2024-7-2 16:22 IO输出的是高低电平,NMOS栅极输入高电平,CS两端电阻接近0,NMOS栅极输入低电平,CS两端电阻接近无穷大, ...
#include <STC8G.H> #include "intrins.h" #define MAIN_Fosc 11059200UL typedef unsigned char u8; typedef unsigned int u16; unsigned char PWM_SAVE; sbit KEY1 = P3^2; bit key_flag; unsigned char PWM_MODE; unsigned char time_out; unsigned char ld=0; unsigned char gear = 0; unsigned char noShiftTime = 0; // 自上次换挡以来的时间 void pwm_init(void); void delayms(u16 ms); 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 Timer0_ISR() interrupt 1 { if (noShiftTime < 3000 ) noShiftTime++; } void timer0_init() { TMOD &= 0xF0; TMOD |= 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; ET0 = 1; // 开启Timer0中断 EA = 1; // 开启全局中断 TR0 = 1; // 启动Timer0 } void delayms(u16 ms) { u16 i; do{ i = MAIN_Fosc /10000; while(--i); }while(--ms); } void main() { P3M0 = 0x00; P3M1 = 0x00; timer0_init(); while(1) { pwm_init(); if (KEY1 == 0) { delayms(10); if (KEY1 == 0) { if (noShiftTime >= 3000 ) { ld = 0; // 关闭LED } gear = (gear + 1) % 5; // 切换档位,循环回到0 while (!KEY1); // 等待按钮释放 noShiftTime = 0; } } // 检查是否长时间未换挡 if (noShiftTime >= 3000) { // 如果3秒(或3000毫秒)未换挡 gear = 0; // 可以选择将档位重置为0或其他默认档位 ld = 0; // 关闭LED noShiftTime = 0; // 重置计时器 } switch (gear) { case 0: ld=0; break; case 1: ld=2; break; case 2: ld=15; break; case 3: ld=30; break; case 4: ld=255; break; } delayms(10); } } 复制代码
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-8-25 08:07 , Processed in 0.120447 second(s), 97 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.