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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機用1kHZPWM無極調(diào)光的問題

[復制鏈接]
ID:69634 發(fā)表于 2015-4-16 09:04 | 顯示全部樓層 |閱讀模式
程序如下,可以變亮變暗調(diào)節(jié),問題是剛開始二極管總有一點光亮,不是全暗。不知是為什么

#include <reg52.h>
#include"intrins.h"
sbit PWMOUT = P0^0;
sbit bianan  = P3^2;
sbit bianliang = P3^3;
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
unsigned int dc=921;        // 計算1ms定時器計數(shù)=11059200 / 12/1000=921         1ms內(nèi)調(diào)節(jié)PWM占空比
void ConfigPWM( );
void ConfigTimer1( );
void zhongjian(unsigned int dc);

void main()
{
        EA = 1;     //開總中斷
           zhongjian( dc);
        ConfigPWM( );  //配置并啟動PWM
        ConfigTimer1( );    //每50ms增加或減少一次
        while (1);
}

  void ConfigTimer1( )
{
    TMOD &= 0x0F;   //清零T1的控制位
    TMOD |= 0x10;   //配置T1為模式1
    TH1 = 0x3c;     //加載T1重載值
    TL1 = 0x11;
    ET1 = 1;        //使能T1中斷
    TR1 = 1;        //啟動T1
}

void ConfigPWM(  )
{
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = HighRH;   //加載T0重載值
    TL0 = HighRL;
    ET0 = 1;        //使能T0中斷
    TR0 = 1;        //啟動T0
    PWMOUT = 1;     //輸出高電平
}

void zhongjian(unsigned int dc)
{
    unsigned int high, low;
    high = dc;                  //計算高電平所需的計數(shù)值
    low  = 922 - high;          //計算低電平所需的計數(shù)值
    high = 65536 - high ;       //計算高電平的定時器重載值并補償中斷延時
    low  = 65536 - low  ;       //計算低電平的定時器重載值并補償中斷延時
    HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分為高低字節(jié)
    LowRL  = (unsigned char)low;
}

void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //當前輸出為高電平時,裝載低電平值并輸出低電平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //當前輸出為低電平時,裝載高電平值并輸出高電平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

void InterruptTimer1() interrupt 3                //每50ms增加或減少一次內(nèi)調(diào)節(jié)PWM占空比
{   
  static unsigned int index = 921;
  TH1 = 0x3c;     //加載T1重載值
  TL1 = 0x11;
  if(bianan == 0)     {index++;  if(index>= 921)   {index = 921;} }
  if(bianliang == 0)  {index--;    if(index<= 2)       {index = 1;}}
  zhongjian(index);
}

回復

使用道具 舉報

ID:77023 發(fā)表于 2015-4-16 10:56 | 顯示全部樓層
沙發(fā)!
回復

使用道具 舉報

ID:76800 發(fā)表于 2015-4-17 07:56 | 顯示全部樓層
高的真夠復雜的,沒細看你的程序。low  = 922 - high;          //計算低電平所需的計數(shù)值,這里不是墊了點底么?

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:69634 發(fā)表于 2015-4-17 20:03 | 顯示全部樓層
8055 發(fā)表于 2015-4-17 07:56
高的真夠復雜的,沒細看你的程序。low  = 922 - high;          //計算低電平所需的計數(shù)值,這里不是墊了點 ...

low=1,是必要的,定時器加載值不能為0啊,low=1,約千分之一,不足以有點點亮,仍為全暗。
回復

使用道具 舉報

ID:69634 發(fā)表于 2015-4-17 20:05 | 顯示全部樓層
8055 發(fā)表于 2015-4-17 07:56
高的真夠復雜的,沒細看你的程序。low  = 922 - high;          //計算低電平所需的計數(shù)值,這里不是墊了點 ...

你有這方面的程序嗎,或者建議
回復

使用道具 舉報

ID:76471 發(fā)表于 2015-4-17 20:14 | 顯示全部樓層
在LED控制端加個103或104電容,我也試過,微亮去不掉

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76800 發(fā)表于 2015-4-17 20:20 | 顯示全部樓層
在輸出最小時關掉端口唄,不過我?guī)啄昵白鲞@個實驗好像沒注意到這個微亮,好像一點點亮星兒都么有,我一開始寫代碼是就在最微弱時關掉了端口,輸出一個固定電平,保證不亮。

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76800 發(fā)表于 2015-4-17 20:21 | 顯示全部樓層
888zhjzhj 發(fā)表于 2015-4-17 20:05
你有這方面的程序嗎,或者建議

有啊,用帶PWM的單片機最簡單了

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:69634 發(fā)表于 2015-4-17 22:12 | 顯示全部樓層
8055 發(fā)表于 2015-4-17 20:20
在輸出最小時關掉端口唄,不過我?guī)啄昵白鲞@個實驗好像沒注意到這個微亮,好像一點點亮星兒都么有,我一開始 ...

這個思路也很好,我試著改一下。帶PWM的單片機就不用了
回復

使用道具 舉報

ID:69634 發(fā)表于 2015-4-18 09:28 | 顯示全部樓層
按8055老師的意思,把程序修改一下,最微弱時關掉定時器,能做到led全暗。會微亮也許跟led特征有關。程序如下,請8055老師斧正。
#include <reg52.h>
#include"intrins.h"
sbit PWMOUT = P0^0;
sbit bianan  = P3^2;
sbit bianliang = P3^3;
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
unsigned int dc=921;        // 計算1ms定時器計數(shù)=11059200 / 12/1000=921         1ms內(nèi)調(diào)節(jié)PWM占空比
void ConfigPWM( );
void ConfigTimer1( );
void zhongjian(unsigned int dc);

void main()
{
    EA = 1;     //開總中斷
           zhongjian( dc);
        ConfigPWM( );  //配置并啟動PWM
        ConfigTimer1( );    //每50ms增加或減少一次
        while (1);
}

  void ConfigTimer1( )
{
    TMOD &= 0x0F;   //清零T1的控制位
    TMOD |= 0x10;   //配置T1為模式1
    TH1 = 0x3c;     //加載T1重載值
    TL1 = 0x11;
    ET1 = 1;        //使能T1中斷
    TR1 = 1;        //啟動T1
}

void ConfigPWM(  )
{
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = HighRH;   //加載T0重載值
    TL0 = HighRL;
    ET0 = 1;        //使能T0中斷
    // TR0 = 1;        //啟動T0
    PWMOUT = 1;     //輸出高電平
}

void zhongjian(unsigned int dc)
{
    unsigned int high, low;
    high = dc;                  //計算高電平所需的計數(shù)值
    low  = 922 - high;          //計算低電平所需的計數(shù)值
    high = 65536 - high ;       //計算高電平的定時器重載值并補償中斷延時
    low  = 65536 - low  ;       //計算低電平的定時器重載值并補償中斷延時
    HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分為高低字節(jié)
    LowRL  = (unsigned char)low;
}

void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //當前輸出為高電平時,裝載低電平值并輸出低電平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //當前輸出為低電平時,裝載高電平值并輸出高電平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

void InterruptTimer1() interrupt 3                //每50ms增加或減少一次內(nèi)調(diào)節(jié)PWM占空比
{   
  static unsigned int index = 921;
  TH1 = 0x3c;     //加載T1重載值
  TL1 = 0x11;
  if(bianan == 0)     {TR0 = 1; index++;  if(index>= 921)   {TR0 = 0; index = 921; } }
  if(bianliang == 0)  {TR0 = 1; index--;    if(index<= 2)       {TR0 = 0; index = 1;    } }
  zhongjian(index);
}
回復

使用道具 舉報

ID:76158 發(fā)表于 2015-4-26 21:05 | 顯示全部樓層
樓主 這個程序可以做到全滅 100級分級調(diào)光  只是頻率不夠準確  但是LED可以全滅 全亮
調(diào)光不會閃  你參考一下
我也是別人指導我寫的:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint num,a;  //定義num a 為全局變量
sbit pwm=P1^0;        //定義p1 0端口為 PWM輸出口
sbit up=P3^4;          //定義PWM 增加按鍵
sbit dn=P3^5;                //定義PWM 減少按鍵
void delayms(uint);   //延遲子函數(shù)聲明
void keyscan();         //按鍵函數(shù)聲明
void pwm_print();                  //PWM子函數(shù)
void init();                //初始化函數(shù)
void main()   //主函數(shù)入口
{
        init();     //調(diào)用初始化函數(shù)
        while(1)    //循環(huán)
        {
        delayms(5); //延時子函數(shù)
        keyscan();  //調(diào)用按鍵掃描函數(shù)
       
        }
}
void init()     //初始化函數(shù)
{
        TMOD=0X01;  //工作模式選擇
        TH0=(65535-10)/256;   //高位裝載初始值
        TL0=(65535-10)%256;   //低位裝載初始值
        EA=1;                 //開總中斷
        ET0=1;                //開定時器0中斷
        TR0=1;                                 //啟動定時器0
}
//**********************************************************
void  Time0() interrupt 1 //中斷函數(shù)
{
        TH0=(65536-10)/256;   //裝載初值
        TL0=(65536-10)%256;   //裝載初值
        num++;                //10us中斷一次 num 加1
        if(num==100)          //判斷num 值  是否等于100 如果等于100 說明1ms時間到 也就相當于定時為1KHZ頻率
        {
                num=0;            //將num值清零
        }
        pwm_print();           //調(diào)用PWM函數(shù)
}
//**********************************************************
void delayms(uint xms)     //延時函數(shù)
{
        while(xms--);

}
//***********************************************************
void keyscan()            //按鍵子函數(shù)
{
   
        if(up==0)              //判斷按鍵up 是否被按下
        {
                delayms(10);       //軟件消抖
                if(up==0)          //再次判斷按鍵up是否按下 如果被按下 則執(zhí)行{}中語句
                {
                        a++;            //a的值+1
                        if(a>100)       //如果A的值大于100 a=100 定上界  避免A值會一直增加上去  
                    a=100;
                       
                }       
        }

        if(dn==0)              //判斷按鍵dn 是否被按下
        {
                delayms(10);       //軟件消抖
                if(dn==0)          //再次判斷按鍵dn是否按下 如果被按下 則執(zhí)行{}中語句
                {
                }
                if(a<=0)           //判斷a是否小于0
                        {
                                a=0;       //如果A的值小于0 a=0 定下界  避免A值會一直減少,導致a的值 會越下界
                        }       
                else
                {
                        a--;           //如果a≠0 ,則執(zhí)行A--  如果A小于等于0 則A一直=0
                }
        }
       
}
//***********************************************************
void pwm_print()            //PWM發(fā)生函數(shù)
{
        if(num<a)               //判斷A的值是否大于num的值  也是比較兩個數(shù)  ,如果a的值大于num 。   那么num 小于a值那段時間內(nèi) pwm 為導通時間 就是占空比的時間
        {
                pwm=0;         
        }
                else
                {
                        pwm=1;
                }
}       

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76158 發(fā)表于 2015-4-26 21:08 | 顯示全部樓層
這個調(diào)光程序 我編譯通過的。沒有任何問題,只是寫法可能不算嚴謹,但是好在可以用
期望大家多指點改進!

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76158 發(fā)表于 2015-4-26 21:24 | 顯示全部樓層
888zhjzhj 發(fā)表于 2015-4-18 09:28
按8055老師的意思,把程序修改一下,最微弱時關掉定時器,能做到led全暗。會微亮也許跟led特征有關。程序如 ...

我調(diào)了一下你這個調(diào)光 越下界了  就是如果一直按著減少占空比的鍵的時候會回到最大狀態(tài)。就是按著減小按鍵
LED慢慢變小 然后變得最大 這樣子

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线播放 | 最新日韩在线视频 | 亚洲欧美成人在线 | 成人在线免费观看 | 成人午夜视频在线观看 | 久久久久久黄 | 美女露尿口视频 | 99在线资源| 午夜国产一级片 | 久久中文字幕视频 | 国产精品视频播放 | 日韩人体在线 | 日韩毛片在线免费观看 | 久久久久久久一区 | 国产 亚洲 网红 主播 | 久久亚洲一区 | 三级视频在线观看 | 精品国产免费人成在线观看 | 欧美视频区| 成人美女免费网站视频 | 古装人性做爰av网站 | 天堂视频一区 | 日韩精品中文字幕一区二区三区 | 欧美日韩在线视频一区二区 | 久久伦理中文字幕 | 亚洲性视频 | 欧美综合一区二区三区 | 久久久99国产精品免费 | 久久91 | 国产精品69毛片高清亚洲 | 狠狠综合网 | 国产精品欧美一区二区三区不卡 | 免费精品视频 | 在线亚洲一区二区 | 另类a v| 亚洲高清在线 | 亚洲国产视频一区二区 | 国产在线观看 | 日韩三区| www.788.com色淫免费 | 国产精品免费大片 |