找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機呼吸燈效果不明顯是為什么?

[復(fù)制鏈接]
ID:473410 發(fā)表于 2019-2-14 10:16 | 顯示全部樓層 |閱讀模式
我用DA模數(shù)轉(zhuǎn)換的方法PWM調(diào)了一個呼吸燈,但是感覺呼吸效果不明顯,就是燒上程序之后,燈是一直亮著的,看不出來呼吸效果,我覺得可能是周期或者頻率設(shè)置不太合理,請大佬們幫忙看看。初學51,請多指教!
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;

//--定義使用的IO口--//
sbit PWM=P2^1;
bit DIR;

//--定義一個全局變量--//
u16 count,value,timer1;

/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

        TH1 = 0xFF;
        TL1 = 0xff;   //1us
               
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                        
}


/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        Timer1Init();  //定時器1初始化
        while(1)
        {
                if(count>100)                                                        
                {  
                        count=0;
                        if(DIR==1)                                           //DIR控制增加或減小
                        {
                          value++;
                        }                        
                        if(DIR==0)
                        {
                          value--;
                        }
                                
                }

                if(value==1000)
                {
                  DIR=0;
                }
                if(value==0)
                {
                  DIR=1;
                }        
                                
                if(timer1>1000)  //PWM周期為1000*1us
                {
                        timer1=0;
                }
                if(timer1 <value)        
                {
                        PWM=1;
                }
                else
                {
                        PWM=0;
                }               
        }               
}

/*******************************************************************************
* 函 數(shù) 名       : Time1
* 函數(shù)功能                 : 定時器1的中斷函數(shù)
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/

void Time1(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
{
        TH1 = 0xFF;
        TL1 = 0xff;   //1us
        timer1++;
    count++;
        
}


回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2019-2-14 11:54 | 顯示全部樓層
人眼對緩變或微變不敏感,請考慮:
1、一次亮度改變量加大
2、一種亮度保持時間控制在0.5秒左右。
試試以上。
回復(fù)

使用道具 舉報

ID:164602 發(fā)表于 2019-2-14 14:43 | 顯示全部樓層
第一:程序沒問題,我在我的板子上試驗通過了的。
第二:可以改變主函數(shù)中第一個if的值,我改變?yōu)?0時,呼吸變快
我的板子是HC6800-ES-V2.0,單片機是STC90C516RD+,12M晶振
回復(fù)

使用道具 舉報

ID:449525 發(fā)表于 2019-2-14 15:36 | 顯示全部樓層
你用PWM控制的是亮度,呼吸燈,直接延時01不就行了么?
如果你想控制呼吸燈的亮度,那就住下延時間隔。
回復(fù)

使用道具 舉報

ID:476546 發(fā)表于 2019-2-14 16:30 | 顯示全部樓層
是不是硬件問題啊?供電有沒有問題,也要實際測量一下
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-2-14 16:45 | 顯示全部樓層
定時器設(shè)置不當,中斷函數(shù)執(zhí)行4條代碼的時間遠遠超過1us,CPU哪來時間執(zhí)行主函數(shù)?給你改了一下,你試試。

#include "reg52.h"    //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;

//--定義使用的IO口--//
sbit PWM=P2^1;
bit DIR;

//--定義一個全局變量--//
u16 count,value,timer1;

/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()                //100微秒@12.000MHz
{
        TMOD |= 0x20;                //設(shè)置定時器自動重載模式
        TL1 = 0x9C;                //設(shè)置定時初值
        TH1 = 0x9C;                //設(shè)置定時重載值
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                        
}


/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能       : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        Timer1Init();  //定時器1初始化
        while(1)
        {
                if(count>=200)
                {  
                        count=0;
                        if(DIR==1)//DIR控制增加或減小
                        {
                                value++;
                        }                        
                        if(DIR==0)
                        {
                                value--;
                        }
                }       
                if(value>=100)
                {
                        DIR=0;
                }
                if(value==0)
                {
                        DIR=1;
                }               
                if(timer1>100)
                {
                        timer1=0;
                }
                if(timer1 <value)        
                {
                        PWM=1;
                }
                else
                {
                        PWM=0;
                }               
        }               
}

/*******************************************************************************
* 函 數(shù) 名       : Time1
* 函數(shù)功能       : 定時器1的中斷函數(shù)
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/

void Time1(void) interrupt 3    //3 為定時器1的中斷號
{
        timer1++;
        count++;
}
回復(fù)

使用道具 舉報

ID:473410 發(fā)表于 2019-2-15 10:21 | 顯示全部樓層
wulin 發(fā)表于 2019-2-14 16:45
定時器設(shè)置不當,中斷函數(shù)執(zhí)行4條代碼的時間遠遠超過1us,CPU哪來時間執(zhí)行主函數(shù)?給你改了一下,你試試。
...

好的,謝謝,我試一下
回復(fù)

使用道具 舉報

ID:473410 發(fā)表于 2019-2-15 10:25 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2019-2-14 14:43
第一:程序沒問題,我在我的板子上試驗通過了的。
第二:可以改變主函數(shù)中第一個if的值,我改變?yōu)?0時,呼 ...

好的,我試試
回復(fù)

使用道具 舉報

ID:473410 發(fā)表于 2019-2-15 10:48 | 顯示全部樓層
wulin 發(fā)表于 2019-2-14 16:45
定時器設(shè)置不當,中斷函數(shù)執(zhí)行4條代碼的時間遠遠超過1us,CPU哪來時間執(zhí)行主函數(shù)?給你改了一下,你試試。
...

中斷函數(shù)里面不需要重新把TH1和TL1賦值嗎?而且這個我試了感覺效果也不明顯,看起來還是一直亮
回復(fù)

使用道具 舉報

ID:476644 發(fā)表于 2019-2-15 11:01 | 顯示全部樓層
可能是硬件的問題
回復(fù)

使用道具 舉報

ID:476775 發(fā)表于 2019-2-15 11:51 | 顯示全部樓層
放眼天下 發(fā)表于 2019-2-15 10:48
中斷函數(shù)里面不需要重新把TH1和TL1賦值嗎?而且這個我試了感覺效果也不明顯,看起來還是一直亮

定時時間設(shè)置長些
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-2-15 13:08 | 顯示全部樓層
放眼天下 發(fā)表于 2019-2-15 10:48
中斷函數(shù)里面不需要重新把TH1和TL1賦值嗎?而且這個我試了感覺效果也不明顯,看起來還是一直亮

1.因為使用定時器自動重裝,中斷函數(shù)里面不需要重新把TH1和TL1賦值。
2.這個程序是經(jīng)過實物驗證過的,沒有問題。你如果用仿真軟件調(diào)試當然看不出效果,只能用仿真軟件的示波器看波形來確認。 無標題.jpg

回復(fù)

使用道具 舉報

ID:1064915 發(fā)表于 2023-3-17 17:35 | 顯示全部樓層
初學需要學習仿真軟件嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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