找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8028|回复: 11
收起左侧

PWM调光手电筒程序移植到STC15F104W单片机 求助

  [复制链接]
ID:190152 发表于 2017-8-4 23:43 | 显示全部楼层 |阅读模式
20黑币
新手一枚,想用单片机做一个调光手电筒。用STC90c516rd+在开发板上调光一切正常。想把程序移植到STC15F104W单片机上。PWM输出端口怎么修改为p3.4
程序如下/*************************************/
  1. #include <reg52.h>
  2. unsigned char pwm_led_val = 0;//LED占空比值 0-50 0最亮,pwm_led_val值越大,调光的速度越慢
  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;         //开关键
  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. /*开关灯程序,按1次灯亮,再按1次灯灭,如此循环*/                           
  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. }

复制代码

最佳答案

查看完整内容

#include /******************************************/ //#define PWM_DUTY 100 //定义PWM的周期,数值为时钟周期数,假如使用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; / ...
回复

使用道具 举报

ID:167440 发表于 2017-8-4 23:43 | 显示全部楼层
#include    <reg51.h>


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

//#define     PWM_DUTY        100            //定义PWM的周期,数值为时钟周期数,假如使用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值越大,调光的速度越慢

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;         //开关键

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 设置为推挽输出
    P3M0 &=  (1 << 5);
      
    TR0 = 0;            //停止计数
    ET0 = 1;            //允许中断
    PT0 = 1;            //高优先级中断
   
    TMOD &= 0xF0;                //设置定时器模式 8位
        TMOD |= 0x02;                //设置定时器模式
   
    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--);
}  


/******************** 主函数**************************/
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重装值函数 *******************/
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中断函数************************/
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;
    }
}
回复

使用道具 举报

ID:167440 发表于 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
回复

使用道具 举报

ID:123289 发表于 2017-8-5 22:12 | 显示全部楼层
看来原来的程序也是“拿来”的。教了意义不大。
回复

使用道具 举报

ID:190152 发表于 2017-8-5 23:31 | 显示全部楼层
谢谢各位大神,手电筒已经顺利完工。本人爱好电子制作。自从认识单片机我就爱上了这家伙。我相信单片机一定能让我们的生活变得更加智能。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:140489 发表于 2017-8-10 15:59 | 显示全部楼层
哈哈,楼主的程序是我以前写的
回复

使用道具 举报

ID:140489 发表于 2017-8-10 16:03 | 显示全部楼层
楼主可以看看我这个帖子的程序,只要一个按键就可以实现开关灯和调光,http://www.51hei.com/bbs/dpj-82226-1.html
回复

使用道具 举报

ID:66862 发表于 2017-11-10 01:11 | 显示全部楼层
浮云骑士 发表于 2017-8-5 09:03
STC15F104W的T0定时器时钟输出引脚是P3^5引脚,P3.4不是T0定时器时钟输出
sfr INT_CLKO = 0x8F;   //外部 ...

师傅你好!怎样让P3.5端口,上电后为低电平,
你的代码上电之后,是高电平,我想初始化为低电平,初始化不了
回复

使用道具 举报

ID:190152 发表于 2018-1-13 12:34 | 显示全部楼层
lids 发表于 2017-8-10 16:03
楼主可以看看我这个帖子的程序,只要一个按键就可以实现开关灯和调光,http://www.51hei.com/bbs/dpj-82226 ...

谢谢,智能手电筒第二代正在制作
回复

使用道具 举报

ID:272534 发表于 2018-10-23 22:54 | 显示全部楼层
标记下
回复

使用道具 举报

ID:403593 发表于 2018-10-26 08:54 | 显示全部楼层
看你的程序,整个P1口都是输出口,并没有确定到某一个口
回复

使用道具 举报

ID:448822 发表于 2019-1-17 15:52 | 显示全部楼层
标记下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表