找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4293|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的pwm控制led亮度

[复制链接]
跳转到指定楼层
楼主
ID:193217 发表于 2017-4-24 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
毕业设计的代码,跪求大神解答。

功能:火焰传感器触发,led呼吸灯亮起,触动振动传感器,第一次振动响起SARI音乐,第二次振动shengri音乐,第三次全部led灯和音乐熄灭。比较不懂最下面的利用pwm控制led亮度那一块。感谢大神,感谢论坛!

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "delay.h"
#include "stdio.h"

#define FALSE 0x00
#define TRUE 0x01

sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;          //设置LED灯连接端口

sbit ShengRi=P1^6;
sbit SaSi=P1^7;          //设置音乐片连接端口

sbit HuoYan=P2^1;
sbit ZhenDong=P2^0;      //设置传感器连接端口

unsigned char ZhenFlag=FALSE;
unsigned long time_2ms=0;                        //定时器计数
unsigned char HuXiFlag=FALSE;
unsigned char PWML_LED=2;

void Init_Timer0(void);                                //初始化始终函数

void main (void)
{   
        unsigned char KeyFlag2=0,KeyFlag1=0;
        static unsigned char CounZhen=0;
        Init_Timer0();        //定时器0初始化

        DelayMs(10);
        ShengRi=1;
        SaSi=1;       
        LED1=1;
        LED2=1;
        LED3=1;
        LED4=1;
        LED5=1;
        LED6=1;                //LED灯、音乐片初始状态为关闭。(LED灯以及音乐片采用低电平出发)
                       
        while(1)         //主循环
        {               

                if((ZhenDong==0))                                          //振动传感器被触发
                {
                        if((KeyFlag1==0)&&(ZhenFlag==TRUE))
                        {       
                                if((ZhenDong==0))                           //扫描按键         
                                {
                                        ZhenFlag=FALSE;
                                        KeyFlag1=1;                          //防止重复按下
                                        CounZhen++;
                                        if(CounZhen==1)
                                        {ShengRi=0;SaSi=1;}            //SASI音乐片响起
                                        else if(CounZhen==2)
                                        {ShengRi=1;SaSi=0;}            //ShengRi音乐片响起
                                        else if(CounZhen==3)
                                        {
                                                CounZhen=0;
                                                ShengRi=1;
                                                SaSi=1;
                                                HuXiFlag=FALSE;
                                                LED1=1;
                                                LED2=1;
                                                LED3=1;
                                                LED4=1;
                                                LED5=1;
                                                LED6=1;                       //所有音乐、LED灯关闭
                                        }
                                }
                        }
                }
                else
                {KeyFlag1=0;}


                if((HuoYan==0))                  //扫描按键         
                {
                        if(KeyFlag2==0)
                        {       
                                if((HuoYan==0))                  //扫描按键         
                                {
                                        KeyFlag2=1;                          //防止重复按下
                                        HuXiFlag=TRUE;         //LED呼吸灯工作
                                }
                        }
                }
                else
                {KeyFlag2=0;}       
        }
}

void DelayUs2x(unsigned int t)
{   
while(--t);
}
void DelayMs(unsigned int t)
{
while(t--)             //大致延时1mS
{
     DelayUs2x(245);
         DelayUs2x(245);
}
}

void Init_Timer0(void)
{
        TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
        TH0=(65536-20000)/256;                  //重新赋值 20ms
        TL0=(65536-20000)%256;
        EA=1;            //总中断打开
        ET0=1;           //定时器中断打开
        TR0=1;           //定时器开关打开
}

void Timer0_isr(void) interrupt 1
{
        static unsigned char led1Count=0;
        TH0=(65536-2000)/256;                  //重新赋值 2ms
        TL0=(65536-2000)%256;
       
        time_2ms++;
        if(time_2ms%200==0)
        {
                ZhenFlag=TRUE;
        }
        if(HuXiFlag==TRUE)            //火焰传感器触发,LED闪烁
        {
                led1Count++;
                if(time_2ms%400==0)
                {
                        PWML_LED++;
                        if(PWML_LED>=8)     
                        {
                                PWML_LED=2;     //通过软件模拟PWM,在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。
                        }
                }
                if(led1Count<PWML_LED)               //led1 占空比调节
                {
                        LED1=0;
                        LED2=0;
                        LED3=0;
                        LED4=0;
                        LED5=0;
                        LED6=0;                          //LED灯打开
                }
                else if((led1Count>=PWML_LED)&&(led1Count<=8))        //关闭时间段
                {
                        LED1=1;
                        LED2=1;
                        LED3=1;
                        LED4=1;
                        LED5=1;   
                        LED6=1;                          //LED灯关闭
                }
                else
                {
                        led1Count=0;    //一个周期结束
                }
        }

}








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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