畢業設計的代碼,跪求大神解答。
功能:火焰傳感器觸發,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; //一個周期結束
}
}
}
|