找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10002|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

PWM調(diào)光手電筒程序移植到STC15F104W單片機 求助

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:190152 發(fā)表于 2017-8-4 23:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
20黑幣
新手一枚,想用單片機做一個調(diào)光手電筒。用STC90c516rd+在開發(fā)板上調(diào)光一切正常。想把程序移植到STC15F104W單片機上。PWM輸出端口怎么修改為p3.4
程序如下/*************************************/
  1. #include <reg52.h>
  2. unsigned char pwm_led_val = 0;//LED占空比值 0-50 0最亮,pwm_led_val值越大,調(diào)光的速度越慢
  3. unsigned char pwm_t;//周期
  4. unsigned char num;
  5. bit flag;
  6. sbit key_s2 = P3^0;         //減鍵
  7. sbit key_s3 = P3^1;         //加鍵
  8. sbit key_s4 = P3^2;         //開關(guān)鍵
  9. void delay(unsigned int z)//毫秒級延時
  10. {
  11.         unsigned int x,y;
  12.         for(x = z; x > 0; x--)
  13.                 for(y = 114; y > 0 ; y--);
  14. }        

  15. //定時器0中斷
  16. void timer0() interrupt 1
  17. {
  18.         pwm_t++;
  19.         if(pwm_t == 30)
  20.         {
  21.                 pwm_t = 0; P1 = 0xff;
  22.         }
  23.         if(pwm_led_val == pwm_t)
  24.                 P1 = 0;                                         
  25. }
  26. void main()
  27. {
  28.         TMOD |= 0x02;//8位自動重裝模式
  29.         TH0 = 240;
  30.         TL0 = 240;//11.0592M晶振下占空比最大比值是50,輸出1150HZ
  31.         TR0 = 1;//啟動定時器0
  32.         ET0 = 1;//允許定時器0中斷
  33.         EA        = 1;//總中斷允許
  34.         while(1)
  35.         {
  36.                 if(flag==0)
  37.                 {

  38.                 if(key_s2 == 0)         //S2按下LED變暗
  39.                 {
  40.                         delay(5);
  41.                         if(key_s2 == 0)
  42.                         {
  43.                                 if(pwm_led_val < 100)
  44.                                 {
  45.                                         pwm_led_val++;
  46.                                 }
  47.                         //        while(!key_s2);
  48.                         }
  49.                 }
  50.                 if(key_s3 == 0)        //S3按鍵LED變亮
  51.                 {
  52.                         delay(5);
  53.                         if(key_s3 == 0)
  54.                         {
  55.                                 if(pwm_led_val > 0)
  56.                                 {
  57.                                         pwm_led_val--;
  58.                                 }
  59.                         //        while(!key_s3);
  60.                         }
  61.                   }
  62.                 }

  63.                 else{
  64.                                 P1 = 0xff;
  65.                         }        




  66. /*開關(guān)燈程序,按1次燈亮,再按1次燈滅,如此循環(huán)*/                           
  67.                          if(num==0)                           
  68.               {
  69.                if(key_s4==0)
  70.                {
  71.                  delay(5);
  72.                    if(key_s4==0)
  73.                    {   
  74.                                        num++;
  75.                        flag=~flag;
  76.                        TR0=0;
  77.                        while(!key_s4);
  78.                     }
  79.                 }
  80.                }


  81.               if(num==1)
  82.               {
  83.                if(key_s4==0)
  84.                {
  85.                  delay(5);
  86.                  if(key_s4==0)
  87.                  {  
  88.                                     num=0;
  89.                     flag=~flag;
  90.                     TR0=1;
  91.                     while(!key_s4);
  92.                   }
  93.                 }
  94.                }        

  95.         }
  96. }

復(fù)制代碼

最佳答案

查看完整內(nèi)容

#include /******************************************/ //#define PWM_DUTY 100 //定義PWM的周期,數(shù)值為時鐘周期數(shù),假如使用24.576MHZ的主頻,則PWM頻率為6000HZ。 typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sfr P3M1 = 0xB1; //P3M1.n,P3M0.n =00--->Standard, 01--->push-pull sfr P3M0 = 0xB2; / ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:167440 發(fā)表于 2017-8-4 23:43 | 只看該作者
#include    <reg51.h>


/******************************************/

//#define     PWM_DUTY        100            //定義PWM的周期,數(shù)值為時鐘周期數(shù),假如使用24.576MHZ的主頻,則PWM頻率為6000HZ。

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;
                  
sfr P3M1  = 0xB1;   //P3M1.n,P3M0.n     =00--->Standard,    01--->push-pull
sfr P3M0  = 0xB2;   //                  =10--->pure input,  11--->open drain

sfr AUXR  = 0x8E;
sfr INT_CLKO = 0x8F;   //外部中斷允許和時鐘輸出寄存器
               
unsigned char pwm_led_val ;//LED占空比值 0-100 0最亮,pwm_led_val值越大,調(diào)光的速度越慢

unsigned char num=1;
sbit  P_PWM = P3^5;       //定義PWM輸出引腳。STC15w104S sbit  key1 = P3^2;
bit flag=1;
sbit key_s2 = P3^0;         //減鍵
sbit key_s3 = P3^1;         //加鍵
sbit key_s4 = P3^2;         //開關(guān)鍵

u8     pwm;                //定義PWM輸出高電平的時間的變量。用戶操作PWM的變量。

u8     PWM_high,PWM_low;   //中間變量,用戶請勿修改。

void    delay_ms(unsigned char ms);
void    LoadPWM(u16 i);

void Init_ALL(void)
{
    P_PWM = 0;
   
    P3M1 &= ~(1 << 5);  //P3.5 設(shè)置為推挽輸出
    P3M0 &=  (1 << 5);
      
    TR0 = 0;            //停止計數(shù)
    ET0 = 1;            //允許中斷
    PT0 = 1;            //高優(yōu)先級中斷
   
    TMOD &= 0xF0;                //設(shè)置定時器模式 8位
        TMOD |= 0x02;                //設(shè)置定時器模式
   
    AUXR &= 0x00;      //12T

    INT_CLKO |=  0x01;  //輸出時鐘         0x01:允許將P3.5/T1腳配置為定時器0的時鐘輸出T0CLKO

    TH0 = 0;
    TL0 = 0;
//   TR0 = 1;            //定時器0運行控制位

        EA = 1;                                 //中斷總控制位
}

void delay(unsigned int z)//毫秒級延時
{
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 1104; y > 0 ; y--);
}  


/******************** 主函數(shù)**************************/
void main(void)
{
    Init_ALL();
    pwm = 0;    //給PWM一個初值,   
    LoadPWM(pwm);           //計算PWM重裝值
    P_PWM=1;
    while (1)
    {  
   
          if(flag==0)
          {
                if(key_s2 == 0)         //S2按下LED變暗
                {
                        delay(5);
                        if(key_s2 == 0)
                        {
                                if(pwm_led_val < 100)
                                {
                                        pwm_led_val++;
                                   //     delay_ms(10);
                                        LoadPWM(pwm_led_val);           //計算PWM重裝
                                }
                        }
                }
                if(key_s3 == 0)        //S3按鍵LED變亮
                {
                        delay(5);
                        if(key_s3 == 0)
                        {
                                if(pwm_led_val > 0)
                                {
                                        pwm_led_val--;
                                  //  delay_ms(100);
                                        LoadPWM(pwm_led_val);           //計算PWM重裝值
                                }
                        }
                  }
          }

                          
            if(num==0)                           
            {
               if(key_s4==0)
               {
                 delay(5);
                   if(key_s4==0)
                   {   
                      INT_CLKO &=  ~0x01;
                       num=1;
                       flag=1;
                       TR0=0;
                       P_PWM=1;
                       while(!key_s4);
                       P_PWM=1;
                    }
                }
           }
           if(num==1)
           {
               if(key_s4==0)
               {
                 delay(5);
                 if(key_s4==0)
                 {  
                      INT_CLKO |=  0x01;
                    num=0;
                    flag=0;
                    pwm_led_val=0;
                    TR0=1;
                    LoadPWM(pwm_led_val);
                    while(!key_s4);
                  }
                }
           }        

        }      

      
      
    }
/**************** 計算PWM重裝值函數(shù) *******************/
void    LoadPWM(u16 i)
{
    u8 j;
    if(i<1) i=1;
    if(i>100) i=100;
    i =  i; //計算PWM低電平時間
    j = 255UL - i;            //計算PWM高電平時間
   
    EA = 0;
    PWM_high = i;   //裝載PWM高電平時間
    PWM_low  = j;   //裝載PWM低電平時間
    EA = 1;
}

/********************* Timer0中斷函數(shù)************************/
void timer0_int (void) interrupt 1
{
    if(P_PWM)  //如果是輸出高電平,則裝載低電平時間。
    {
       TH0 = (u8)(PWM_low );   
        TL0 = (u8)PWM_low;
    }
   
    else         //如果是輸出低電平,則裝載高電平時間。
    {
        TH0 = (u8)(PWM_high);  
        TL0 = (u8)PWM_high;
    }
}
回復(fù)

使用道具 舉報

板凳
ID:167440 發(fā)表于 2017-8-5 09:03 | 只看該作者
STC15F104W的T0定時器時鐘輸出引腳是P3^5引腳,P3.4不是T0定時器時鐘輸出
sfr INT_CLKO = 0x8F;   //外部中斷允許和時鐘輸出寄存器
INT_CLKO |=  0x01;  //輸出時鐘         0x01:允許將P3.5/T1腳配置為定時器0的時鐘輸出T0CLKO
回復(fù)

使用道具 舉報

地板
ID:123289 發(fā)表于 2017-8-5 22:12 | 只看該作者
看來原來的程序也是“拿來”的。教了意義不大。
回復(fù)

使用道具 舉報

5#
ID:190152 發(fā)表于 2017-8-5 23:31 | 只看該作者
謝謝各位大神,手電筒已經(jīng)順利完工。本人愛好電子制作。自從認識單片機我就愛上了這家伙。我相信單片機一定能讓我們的生活變得更加智能。

評分

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

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:140489 發(fā)表于 2017-8-10 15:59 | 只看該作者
哈哈,樓主的程序是我以前寫的
回復(fù)

使用道具 舉報

7#
ID:140489 發(fā)表于 2017-8-10 16:03 | 只看該作者
樓主可以看看我這個帖子的程序,只要一個按鍵就可以實現(xiàn)開關(guān)燈和調(diào)光,http://www.torrancerestoration.com/bbs/dpj-82226-1.html
回復(fù)

使用道具 舉報

8#
ID:66862 發(fā)表于 2017-11-10 01:11 | 只看該作者
浮云騎士 發(fā)表于 2017-8-5 09:03
STC15F104W的T0定時器時鐘輸出引腳是P3^5引腳,P3.4不是T0定時器時鐘輸出
sfr INT_CLKO = 0x8F;   //外部 ...

師傅你好!怎樣讓P3.5端口,上電后為低電平,
你的代碼上電之后,是高電平,我想初始化為低電平,初始化不了
回復(fù)

使用道具 舉報

9#
ID:190152 發(fā)表于 2018-1-13 12:34 | 只看該作者
lids 發(fā)表于 2017-8-10 16:03
樓主可以看看我這個帖子的程序,只要一個按鍵就可以實現(xiàn)開關(guān)燈和調(diào)光,http://www.torrancerestoration.com/bbs/dpj-82226 ...

謝謝,智能手電筒第二代正在制作
回復(fù)

使用道具 舉報

10#
ID:272534 發(fā)表于 2018-10-23 22:54 | 只看該作者
標(biāo)記下
回復(fù)

使用道具 舉報

11#
ID:403593 發(fā)表于 2018-10-26 08:54 | 只看該作者
看你的程序,整個P1口都是輸出口,并沒有確定到某一個口
回復(fù)

使用道具 舉報

12#
ID:448822 發(fā)表于 2019-1-17 15:52 | 只看該作者
標(biāo)記下
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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