畢業(yè)設(shè)計的代碼,跪求大神解答。
功能:火焰?zhèn)鞲衅饔|發(fā),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; //設(shè)置LED燈連接端口
sbit ShengRi=P1^6;
sbit SaSi=P1^7; //設(shè)置音樂片連接端口
sbit HuoYan=P2^1;
sbit ZhenDong=P2^0; //設(shè)置傳感器連接端口
unsigned char ZhenFlag=FALSE;
unsigned long time_2ms=0; //定時器計數(shù)
unsigned char HuXiFlag=FALSE;
unsigned char PWML_LED=2;
void Init_Timer0(void); //初始化始終函數(shù)
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燈、音樂片初始狀態(tài)為關(guān)閉。(LED燈以及音樂片采用低電平出發(fā))
while(1) //主循環(huán)
{
if((ZhenDong==0)) //振動傳感器被觸發(fā)
{
if((KeyFlag1==0)&&(ZhenFlag==TRUE))
{
if((ZhenDong==0)) //掃描按鍵
{
ZhenFlag=FALSE;
KeyFlag1=1; //防止重復(fù)按下
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燈關(guān)閉
}
}
}
}
else
{KeyFlag1=0;}
if((HuoYan==0)) //掃描按鍵
{
if(KeyFlag2==0)
{
if((HuoYan==0)) //掃描按鍵
{
KeyFlag2=1; //防止重復(fù)按下
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; //定時器開關(guān)打開
}
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) //火焰?zhèn)鞲衅饔|發(fā),LED閃爍
{
led1Count++;
if(time_2ms%400==0)
{
PWML_LED++;
if(PWML_LED>=8)
{
PWML_LED=2; //通過軟件模擬PWM,在一定的頻率的方波中,調(diào)整高電平和低電平的占空比,即可實現(xiàn)LED燈亮度控制。
}
}
if(led1Count<PWML_LED) //led1 占空比調(diào)節(jié)
{
LED1=0;
LED2=0;
LED3=0;
LED4=0;
LED5=0;
LED6=0; //LED燈打開
}
else if((led1Count>=PWML_LED)&&(led1Count<=8)) //關(guān)閉時間段
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1; //LED燈關(guān)閉
}
else
{
led1Count=0; //一個周期結(jié)束
}
}
}
|