毕业设计的代码,跪求大神解答。
功能:火焰传感器触发,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; //一个周期结束
}
}
}
|