本帖最后由 房一鹏 于 2022-1-16 18:20 编辑
在写呼吸灯程序之前,我们要了解我们板子的机器周期为12/32768000,而65536*(12/32768000)=0.024也就是说,我们板子最多24毫秒一定要进入一次中断,而在金沙滩上的程序中是50毫秒进入一次中断。注意!!!
如果照抄金沙滩的程序(50毫秒进入一次中断),是做不出呼吸的效果的,并且程序也不会报错。(我找了好久才发现这一点)
呼吸灯1
#include<reg52.h>
sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;bit P22=P2^2;
sbit led=P0^0;
unsigned char highRH=0;
unsigned char highRL=0;
unsigned char lowRH=0;
unsigned char lowRL=0;
void ConfigPWM(unsigned char fr,unsigned char dc);
void ClosePWM();
void main ()
{
unsigned int i=0;
unsigned char a;
ENLED=0;
P20=0;
P21=1;
P22=1;
EA=1;
// led=0;
while(1)
{
for(a=1;a<=10;a++)
{
ConfigPWM(100,a*10);
for(i=0;i<60000;i++);
ClosePWM();
}
}
}
void ConfigPWM(unsigned char fr,unsigned char dc)
{
unsigned long tmp;
unsigned int high,low;
tmp=32768000/12/fr;
high=(tmp*dc)/100;
low=tmp-high;
high=65536-high+12;
low=65536-low+12;
highRH=(unsigned char)(high>>8);
highRL=(unsigned char)high;
lowRH=(unsigned char)(low>>8);
lowRL=(unsigned char)low;
// TMOD&=0xF7;
// TMOD|=0x01;
TMOD=0x01;
TH0=highRH;
TL0=highRL;
TR0=1;
ET0=1;
led=1;
}
void ClosePWM()
{
TR0=0;
ET0=0;
led=1;
}
void interruptTime0() interrupt 1
{
if(led==1)
{
TH0=lowRH;
TL0=lowRL;
led=0;
}
else
// if(led==0)
{
TH0=highRH;
TL0=highRL;
led=1;
}
}
呼吸灯2#include<reg52.h>
sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit led=P0^0;
unsigned char highRH=0;
unsigned char highRL=0;
unsigned char lowRH=0;
unsigned char lowRL=0;
unsigned char T1RH=0;
unsigned char T1RL=0;
unsigned long periodcnt=0;
void ConfigPWM(unsigned char fr,unsigned char dc);
void configtimer1(unsigned int ms);
void main ()
{
ENLED=0;
P20=0;
P21=1;
P22=1;
EA=1;
ConfigPWM(100,10);
configtimer1(20); //注意此处的20,20毫秒进入一次定时器1的中断
while(1);
}
void configtimer1(unsigned int ms)
{
unsigned long tmp;
tmp=32768000/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp+12;
T1RH=(unsigned char)(tmp>>8);
T1RL=(unsigned char)tmp;
TMOD&=0x0F;
TMOD|=0x10;
TH1=T1RH;
TL1=T1RL;
TR1=1;
ET1=1;
led=1;
}
void ConfigPWM(unsigned char fr,unsigned char dc)
{
unsigned int high,low;
periodcnt=(32768000/12)/fr;
high=(periodcnt*dc)/100;
low=periodcnt-high;
high=65536-high+12;
low=65536-low+12;
highRH=(unsigned char)(high>>8);
highRL=(unsigned char)high;
lowRH=(unsigned char)(low>>8);
lowRL=(unsigned char)low;
TMOD&=0xF0;
TMOD|=0x01;
// TMOD=0x01;
TH0=highRH;
TL0=highRL;
TR0=1;
ET0=1;
led=1;
}
void AdjustDutyCycle(unsigned char dc)
{
unsigned int high,low;
high=(periodcnt*dc)/100;
low=periodcnt-high;
high=65536-high+12;
low=65536-low+12;
highRH=(unsigned char)(high>>8);
highRL=(unsigned char)high;
lowRH=(unsigned char)(low>>8);
lowRL=(unsigned char)low;
}
void interruptTime0() interrupt 1
{
if(led==1)
{
TH0=lowRH;
TL0=lowRL;
led=0;
}
else
{
TH0=highRH;
TL0=highRL;
led=1;
}
}
void interruptTime1() interrupt 3
{
unsigned char a[19]={
5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95
};
static bit dir=0;
static unsigned char index=0;
TH1=T1RH;
TL1=T1RL;
AdjustDutyCycle(a[index]);
if(dir==0)
{
index++;
if(index>=18)
{
dir=1;
}
}
else
{
index--;
if(index<=0)
{
dir=0;
}
}
}
|