久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4466|回復: 12
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
我用DA模數轉換的方法PWM調了一個呼吸燈,但是感覺呼吸效果不明顯,就是燒上程序之后,燈是一直亮著的,看不出來呼吸效果,我覺得可能是周期或者頻率設置不太合理,請大佬們幫忙看看。初學51,請多指教!
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

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

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

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

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


/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
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;
                }               
        }               
}

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

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:123289 發表于 2019-2-14 11:54 | 只看該作者
人眼對緩變或微變不敏感,請考慮:
1、一次亮度改變量加大
2、一種亮度保持時間控制在0.5秒左右。
試試以上。
回復

使用道具 舉報

板凳
ID:164602 發表于 2019-2-14 14:43 | 只看該作者
第一:程序沒問題,我在我的板子上試驗通過了的。
第二:可以改變主函數中第一個if的值,我改變為50時,呼吸變快
我的板子是HC6800-ES-V2.0,單片機是STC90C516RD+,12M晶振
回復

使用道具 舉報

地板
ID:449525 發表于 2019-2-14 15:36 | 只看該作者
你用PWM控制的是亮度,呼吸燈,直接延時01不就行了么?
如果你想控制呼吸燈的亮度,那就住下延時間隔。
回復

使用道具 舉報

5#
ID:476546 發表于 2019-2-14 16:30 | 只看該作者
是不是硬件問題啊?供電有沒有問題,也要實際測量一下
回復

使用道具 舉報

6#
ID:213173 發表于 2019-2-14 16:45 | 只看該作者
定時器設置不當,中斷函數執行4條代碼的時間遠遠超過1us,CPU哪來時間執行主函數?給你改了一下,你試試。

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

typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;

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

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

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


/*******************************************************************************
* 函 數 名       : main
* 函數功能       : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
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;
                }               
        }               
}

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

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

使用道具 舉報

7#
ID:473410 發表于 2019-2-15 10:21 | 只看該作者
wulin 發表于 2019-2-14 16:45
定時器設置不當,中斷函數執行4條代碼的時間遠遠超過1us,CPU哪來時間執行主函數?給你改了一下,你試試。
...

好的,謝謝,我試一下
回復

使用道具 舉報

8#
ID:473410 發表于 2019-2-15 10:25 | 只看該作者
HC6800-ES-V2.0 發表于 2019-2-14 14:43
第一:程序沒問題,我在我的板子上試驗通過了的。
第二:可以改變主函數中第一個if的值,我改變為50時,呼 ...

好的,我試試
回復

使用道具 舉報

9#
ID:473410 發表于 2019-2-15 10:48 | 只看該作者
wulin 發表于 2019-2-14 16:45
定時器設置不當,中斷函數執行4條代碼的時間遠遠超過1us,CPU哪來時間執行主函數?給你改了一下,你試試。
...

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

使用道具 舉報

10#
ID:476644 發表于 2019-2-15 11:01 | 只看該作者
可能是硬件的問題
回復

使用道具 舉報

11#
ID:476775 發表于 2019-2-15 11:51 | 只看該作者
放眼天下 發表于 2019-2-15 10:48
中斷函數里面不需要重新把TH1和TL1賦值嗎?而且這個我試了感覺效果也不明顯,看起來還是一直亮

定時時間設置長些
回復

使用道具 舉報

12#
ID:213173 發表于 2019-2-15 13:08 | 只看該作者
放眼天下 發表于 2019-2-15 10:48
中斷函數里面不需要重新把TH1和TL1賦值嗎?而且這個我試了感覺效果也不明顯,看起來還是一直亮

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

回復

使用道具 舉報

13#
ID:1064915 發表于 2023-3-17 17:35 | 只看該作者
初學需要學習仿真軟件嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩福利在线 | 美国黄色毛片 | av看片网站 | 综合一区二区三区 | 亚洲精品成人在线 | 福利精品 | 日本免费一区二区三区四区 | 99精品国产成人一区二区 | 精品国产综合 | caoporn视频 | 精品久久久久一区 | 国产精品美女久久久 | 欧美日韩一区二区三区四区 | av三级在线观看 | 亚洲成人av一区二区 | 龙珠z在线观看 | 黄视频网址 | 美女黄色在线观看 | 一二区电影 | 国产欧美精品一区二区三区 | 午夜精品久久久久久久久久久久 | 日韩a | 国产精品久久久久久久岛一牛影视 | www.日韩 | 91国产精品在线 | 欧美一区二区三区四区五区无卡码 | 成人免费在线视频 | h在线| 久久亚洲一区 | 欧日韩不卡在线视频 | 午夜视频导航 | 久久精品男人的天堂 | 99re6在线视频精品免费 | 日韩精品一区二区在线 | 国产精品国产三级国产aⅴ入口 | 日本小电影网站 | 欧美一区二区三区久久精品 | 国产伦精品一区二区三区高清 | 福利网址| 在线观看三级av | 二区av|