亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3214|回復(fù): 5
收起左側(cè)

使用STC15W204S單片機的2W調(diào)光燈程序 電路原理圖

  [復(fù)制鏈接]
ID:673920 發(fā)表于 2024-3-11 21:46 | 顯示全部樓層 |閱讀模式
學習、模仿、試驗、改進!
使用開發(fā)板的程序,做了一個調(diào)光燈,用一塊3.7V1500mAH的鋰電池做電源,用了幾次還行!
實測整機靜態(tài)電流20mA左右,不開燈放幾天就沒電了,就增加了開關(guān)機程序和電路,現(xiàn)在放一個月都沒問題!
現(xiàn)在還發(fā)現(xiàn)當電池電壓下降到2.7V以下時,燈會不受控的閃爍!我想可能是電池保護板的問題?以后再弄...

單片機源程序如下:
/********************************************************************************
*  標題: 開關(guān)機        以手提燈104為原型修改,實現(xiàn)待機電流為0,修改已通過!                                 *
*  按鍵控制    由 低光--中光--強光--中光--關(guān)閉 循環(huán),亮度由PMW控制。                         *
* 長按3秒進入1.5HZ閃光,按鍵退出,                                                                                                 *
*使用STC15F104        設(shè)置晶振頻率24M,(工作電壓2.8--5.5伏)(工作電流20mA)                         *
*關(guān)閉后,待機電流為0毫安。                                                                                                            *
*1腳 p3.4 開關(guān)機輸出; 2腳 +5V 輸入;   3腳 p3.5      空;    4腳 GND;          *
*5腳 p3.0 RXD;        6腳 p3.1  TXD;  7腳 p3.2   輸出 ;    8腳 p3.3  調(diào)光按鍵 *
*實際使用STC15W204S        設(shè)置晶振頻率24M,(工作電壓2.8--5.5伏)(工作電流20mA)                 *
*關(guān)閉后,待機電流為0毫安!!                                                                                                            *
*1腳 p5.4 開關(guān)機輸出; 2腳 +5V 輸入;   3腳 p5.5      空;    4腳 GND;          *
*5腳 p3.0 RXD;        6腳 p3.1  TXD;  7腳 p3.2   輸出 ;    8腳 p3.3  調(diào)光按鍵 *
*使用P5先設(shè)置寄存器 sfr P5=0xC8;就可以使用,否則報錯                                             *  **********************************************************************************/
#include <reg52.h>
#define uint unsigned int
sfr P5=0xC8;
uint a,b,c,d,e,f,L4,t,t1,t2,t3,t4,t5,t6;

sbit shuchu=P5^5; //  開關(guān)機輸出        控制  P2^2;
sbit PWM=P5^4; //  輸出P2^6;        
sbit key= P3^3; //  調(diào)光按鍵
void delay(uint z)
   {
   uint x,y;
   for(x=z;x>0;x--)
           for(y=2480;y>0;y--);                 //10ms
   }
   void main()
{
/*-------------------定時器初始化-----------------------------*/

TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
TH0=(65536-100)/256; //給定初值    100us
TL0=(65536-100)%256;
// TH0=0xff;//70us以下輸出的方波不穩(wěn)定
// TL0=0x9c;
EA=1;            //總中斷打開
ET0=1;           //定時器中斷打開
TR0=1;           //定時器開關(guān)打開
a=b=c=d=e=t3=0;
L4=1;
shuchu=1;

        while(1)
        {

        if(key==1)
        {t5=0;t6=0;e=0;}
        if((key==0)&(e==0))
        {t5++;  
        if(t5>=5000)               
        {t6++;t5=0;        
                if(t6>=50){t6=0;L4=~L4;e++;}} //閃爍頻率
        }
        if(L4>=10){a=0;c=0;if(t2>=40000){t2=0;}  
        if(t2<20000)  
{if(t>=20) {t=0;} //由10個t組成一個波,由N個(10個t)連續(xù)組成一串波,

    if(t<1) {PWM=0;}         //        由10個t組成的一個波中,t3個t使PWM=0;另外9-t3個t使PWM=1;
    else {PWM=1;}
  }else {PWM=1;}
}        
/**********************************/
        if(L4==1)        // PMW控制
        {if(key==1){t4=0;t1=0;b=0;} //4,        K1彈起或未按下時,延時10ms,t2停止計時,計數(shù)器b為零,等待K1按下!

        if((key==0)&(b==0))         //大燈按鍵按下,
                {if(t1==2000) //t2開始計時,防抖延時100MS
                        { a++;b++;}           //a++去控制占空比,
                                        }
           if(a==0){t3=2;} //  
           if(a==1){t3=4;}
           if(a==2){t3=9;}
           if(a==3){t3=6;}
           if(a>3){shuchu=0;} //關(guān)機         delay(500)延時5秒 t3=0; delay(500);shuchu=1;a=0;

if(t>=20) {t=0;}

    if(t<t3) {PWM=0;}         
    else {PWM=1;}

        }

}

}
/*------------------------------------------------
                 定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-100)/256;//重新賦值 100us
TL0=(65536-100)%256;
// TH0=0xff;//70us以下輸出的方波不穩(wěn)定
// TL0=0x9c;         //9c,100us;
  t++;
  t1++;
  t2++;
  t4++;
  t5++;
  }

燈控制電路圖.doc

100.5 KB, 下載次數(shù): 10, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:1073939 發(fā)表于 2026-4-29 10:43 | 顯示全部樓層
以下是AI對樓主的建議,我覺得不錯。
基于這份代碼的分析,代碼編寫者需要在以下幾個方面進行提高:

## 一、編程基礎(chǔ)與規(guī)范

### 1. **變量使用混亂**
```c
// 問題:定義了11個全局變量,大多數(shù)意義不明
uint a, b, c, d, e, f, L4, t, t1, t2, t3, t4, t5, t6;

// 改進:使用有意義的變量名,限制作用域
uchar light_level;      // 燈光檔位
uchar pwm_duty;         // PWM占空比
uchar press_count;      // 按鍵計數(shù)
bit flash_mode;         // 閃光模式標志
```

### 2. **數(shù)據(jù)類型濫用**
```c
// 問題:所有變量都用uint,浪費內(nèi)存
uint t5;  // 只需uchar即可

// 改進:根據(jù)實際需求選擇數(shù)據(jù)類型
uchar key_count;        // 0-255足夠
uint long_press_time;   // 需要較大范圍
bit status_flag;        // 只需0/1
```

### 3. **邏輯運算符錯誤**
```c
// 錯誤:使用位與運算符 &
if ((key == 0) & (e == 0))

// 正確:使用邏輯與運算符 &&
if ((key == 0) && (e == 0))
```

## 二、代碼結(jié)構(gòu)與設(shè)計

### 1. **缺少模塊化設(shè)計**
```c
// 問題:所有代碼都在main函數(shù)中,混亂難讀
void main() {
    // 初始化
    // 按鍵檢測
    // PWM控制
    // 閃光邏輯
    // 所有功能混在一起
}

// 改進:功能模塊化
void system_init(void);
uchar key_scan(void);
void pwm_control(uchar duty);
void strobe_mode(void);
void power_off(void);
```

### 2. **魔法數(shù)字泛濫**
```c
// 問題:數(shù)字含義不明確
if (t5 >= 5000)  // 5000代表什么?
if (t6 >= 50)    // 50代表什么?
if (t2 < 20000)  // 20000??
TH0 = (65536 - 100) / 256;  // 100是什么?

// 改進:使用宏定義
#define KEY_DEBOUNCE_TIME    10    // 按鍵消抖10ms
#define LONG_PRESS_TIME      3000  // 長按3秒
#define PWM_CYCLE            10    // PWM周期10個中斷
#define TIMER0_100US        (65536 - 100)
```

### 3. **缺少狀態(tài)機設(shè)計**
```c
// 當前:混亂的標志位控制
if(L4 == 1) {
    if(key == 0 && b == 0) {
        // 復(fù)雜邏輯
    }
}

// 改進:使用狀態(tài)機
enum SYSTEM_STATE {
    STATE_OFF,
    STATE_LOW,
    STATE_MID,
    STATE_HIGH,
    STATE_STROBE
};

enum SYSTEM_STATE current_state = STATE_OFF;
```

## 三、嵌入式系統(tǒng)知識

### 1. **不理解硬件時序**
- PWM周期不穩(wěn)定(中斷中頻繁改變周期)
- 沒有考慮按鍵消抖(只有簡單的t1計數(shù))
- 頻率計算錯誤(1.5Hz閃光,實際時間不準確)

### 2. **中斷使用不當**
```c
// 問題:中斷中處理過多邏輯
void Timer0_isr(void) interrupt 1 {
    TH0 = ...;
    TL0 = ...;
    t++; t1++; t2++; t4++; t5++;  // 大量變量在中斷中累加
    if (t < t3) {...}  // 在中斷中做PWM判斷
}

// 改進:中斷只做必要工作
void Timer0_isr(void) interrupt 1 {
    static uchar pwm_counter = 0;
    TH0 = TIMER0_HIGH;
    TL0 = TIMER0_LOW;

    pwm_counter++;
    if(pwm_counter >= 10) pwm_counter = 0;
    PWM_out = (pwm_counter < pwm_duty) ? 0 : 1;
}
```

### 3. **不理解低功耗設(shè)計**
- 待機時while(1)空轉(zhuǎn),不是真正的零電流
- 沒有使用MCU的掉電模式

## 四、調(diào)試與測試能力

### 1. **注釋與實際不符**
```c
sbit shuchu = P5^5;  // 注釋說控制P2^2,實際是P5.5
// STC15W204S的P5.4和P5.5實際不存在此型號
```

### 2. **缺少邊界檢查**
```c
if (a > 3) {
    shuchu = 0;
}  // 但a繼續(xù)增加,沒有復(fù)位

// 應(yīng)該:
if (a > 3) {
    shuchu = 0;
    a = 0;  // 復(fù)位
    while(1);  // 停止運行
}
```

## 五、需要學習的知識點

### 立即需要學習:
1. **C語言基礎(chǔ)**
   - 變量作用域和生命周期
   - 邏輯運算符與位運算符的區(qū)別
   - const、static關(guān)鍵字使用

2. **單片機基礎(chǔ)**
   - 定時器工作原理
   - 中斷優(yōu)先級和響應(yīng)時間
   - I/O口工作模式

3. **編程規(guī)范**
   - 代碼縮進和注釋規(guī)范
   - 命名規(guī)范(匈牙利命名法)
   - 函數(shù)單一職責原則

### 進階學習:
1. **數(shù)據(jù)結(jié)構(gòu)**
   - 狀態(tài)機設(shè)計模式
   - 環(huán)形緩沖區(qū)
   - 事件驅(qū)動編程

2. **軟件工程**
   - 模塊化設(shè)計
   - 版本控制(Git)
   - 代碼審查

3. **硬件知識**
   - 閱讀數(shù)據(jù)手冊
   - 示波器使用(查看PWM波形)
   - 低功耗設(shè)計方法

## 六、具體改進建議

### 1. **重寫代碼結(jié)構(gòu)**
```c
// 使用頭文件聲明
// main.h
#ifndef __MAIN_H__
#define __MAIN_H__

typedef enum {
    OFF = 0,
    LOW,
    MID,
    HIGH,
    STROBE
} LightMode_t;

#endif
```

### 2. **添加錯誤處理**
```c
if (pwm_duty > MAX_DUTY) {
    pwm_duty = MAX_DUTY;  // 鉗位處理
}
```

### 3. **使用配置文件**
```c
// config.h
#define FOSC 24000000UL  // 24MHz
#define TIMER0_RELOAD (65536 - FOSC/12/10000)  // 100us
```

## 總結(jié)

代碼編寫者需要:
1. **打好基礎(chǔ)**:C語言和單片機原理
2. **規(guī)范編碼**:命名、注釋、格式
3. **模塊化思維**:函數(shù)的單一職責
4. **硬件意識**:理解時序和資源限制
5. **測試習慣**:邊界條件和異常處理
6. **學習能力**:閱讀芯片手冊和優(yōu)秀代碼

建議從簡單的LED閃爍實驗開始,逐步增加功能,每增加一個功能就確保其穩(wěn)定可靠,而不是一次性寫幾百行難以調(diào)試的代碼。
回復(fù)

使用道具 舉報

ID:1073939 發(fā)表于 2026-4-29 10:25 | 顯示全部樓層
樓主現(xiàn)在的嵌入式能力還達不到初學者水平。建議樓主多請教AI,這樣做應(yīng)該提高些能力。
樓主現(xiàn)在使用軟pwm調(diào)光不好,建議使用stc官方的范例程序。
要減少待機電流可以不用增加電路,使mcu進入掉電模式(PCON |= 0x02;),并開啟key引腳中斷喚醒功能。
要盡量以函數(shù),臨時變量組織代碼,采用模塊化設(shè)計?梢栽诰W(wǎng)上尋找、學習、儲備各種代碼模塊。
回復(fù)

使用道具 舉報

ID:229935 發(fā)表于 2026-4-28 07:45 | 顯示全部樓層
加1級三極管或者場效應(yīng)管驅(qū)動12V 的LED燈組,下一步我試一下
回復(fù)

使用道具 舉報

ID:1169774 發(fā)表于 2026-4-18 21:42 | 顯示全部樓層
謝謝了!是直接控制燈光嗎?
回復(fù)

使用道具 舉報

ID:6467 發(fā)表于 2024-12-25 22:47 | 顯示全部樓層
這個牛皮;可以學習下!感謝!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表