本人做了个光源,遇到疑问请各位高手不吝赐教。此光源采用PWM调光,采用STC12CLE5A48S2单片机,LCD显示LED光源的亮度,定时器1作为串口波特率发生器,定时器0用来产生PWM方波。程序在不加EEPROM读写子程序,光源能正常通过按键进行调光,但是在加了EEPROM读写子程序,在有调光按键按下时,光源都会产生闪烁。听别人说,是EEPROM子程序和其他程序在占用硬件上有冲突,但是还是不懂,不知道哪边有冲突。麻烦高手指点一下,谢谢喽。如果需要程序我可以把程序附上,如果我有什么说不清楚的地方,请指出了,我可以详细再说下。再谢。
此帖出自
小平头技术问答
//************I/O初始化*****************************************
void InitialIO()
{
P1M0 = 0x08; //P1.3推挽输出 ,P1.5,P1.6紧为输入
P1M1 = 0x60;
DIM = 0;
}
//************ 定时器0初始化 ***************************************
void Initial_timer0(void)
{
AUXR = 0x80; //T0为1T模式
TMOD = 0x01; // T0为模式1
TH0 = (65536 - 26) / 256;; //1KHzPWM波
TL0 = (65536 - 26) % 256;;
EA = 1;
ET0 = 1;
TR0 = 1;
}
//************ 串口初始化 ***************************************
void Initial_Serial()
{
AUXR|=0x40; //Time1 1T
SCON=0x50; //串口模式设置
TMOD=0x21; //设置定时器1为8位自动重装计数器
TH1=0xFD; //波特率:115200
TL1=0xFD;
TR1=1; //开定时器1
ES=1;
EA=1;
}
//************ PWM输出 ***************************************
uchar PWM_P13(duty)
{
CMOD = 0x04; //T0溢出作为PCA时钟输入源
CL = 0x00;
CH = 0x00;
CCAP0H = duty;
CCAP0L = duty;
CCAPM0 = 0x42; //8位PWM
CR = 1;
}
//************ 定时0中断 ***************************************
void timer0_int (void) interrupt 1 using 1
{
TH0 = (65536 - 26) / 256;
TL0 = (65536 - 26) % 256;
}
//************ 串口接收中断 ***************************************
void Serial_isr() interrupt 4
{
uint temp;
if(RI)
{
RI=0;
temp = SBUF;
SBUF = key1;
while(!TI);
TI = 0;
RI = 0;
temp = SBUF;
SBUF = count_up;
while(!TI);
TI = 0;
RI = 0;
temp = SBUF;
SBUF = count_down;
while(!TI);
TI = 0;
}
else
{
RI=0;
}
}
//************ 上按键判断 ***************************************
void Key1_scan()
{
if(key1 == 0)
{
Delay(6); //20ms
if(key1 == 0)
{
flag1 = 1;
// count_up ++;
Delay(300);
PCA_PWM0=0x00;
}
}
else
{
flag1 = 0;
}
}
//************ 下按键判断 ***************************************
void Key2_scan()
{
if(key2 == 0)
{
Delay(6); //20ms
if(key2 == 0)
{
flag2 = 1;
// count_down ++;
Delay(300);
}
}
else
{
flag2 = 0;
}
}
//************ 上按键处理 ***************************************
void Upkey()
{
if(flag1 == 1)
{
if(y!=0)
{
count_up ++;
y=256-(count_up-count_down)*256/100;
//y= (int)(t+5/10);
PWM_P13(y);
}
EEPROM_program() ;
}
}
//************ 下按键处理 ***************************************
void Downkey()
{
if(flag2 == 1)
{
count_down ++;
y=256-(count_up-count_down)*256/100;
//y= (int)(t+5/10);
if(y==256)
{
PCA_PWM0=0x03;
}
if(y>256)
{
//if(y>257)
//{
count_down --;
//}
PCA_PWM0=0x03;
}
PWM_P13(y);
EEPROM_program();
}
}
//************ 延时 ***************************************
void Delay(uint time)
{
uchar i;
while(time--)
{
for(i = 0; i < 80; i ++)
{;}
}
}
一周热门 更多>