89c51,矩阵键盘控制PWM波
时间:10-02
整理:3721RD
点击:
大神好,请帮我看下程序,没有错误,一直能输出方波,可是用键盘却调不了大小
#include < reg51.h >
void delay(unsigned char t);
unsigned char key;
sbit KEY=P1^0; //PWM输出
unsigned char PWM=0xce ; //赋初值脉宽50%
/*********************************************************/
void main()
{
TMOD=0x22; //T0、T1方式 2
TH0=0x9c ; //产生频率10kHZ 即周期100us
TL0=0x9c ; //频率调节
TH1=PWM; //脉宽调节
TL1=PWM;
EA=1; //开定时器中断T0、T1
ET0=1;
ET1=1; //开定时器T0关定时器T1
TR0=1;
TR1=0;
{
unsigned char temp;
P2=0xff;
while(1)
{
do {temp=P2;}
while(temp==0xff);
delay(10);
do{temp=P2;}
while(temp==0xff);
switch(temp)
{ case 0xfe:key=1;break;
case 0xfd:key=2;break;
case 0xfb:key=3;break;
case 0xf7:key=4;break;
case 0xef:key=5;break;
case 0xdf:key=6;break;
case 0xbf:key=7;break;
case 0x7f:key=8;break;
default: break;
}
while(temp!=0xff)//等待键释放
{temp=P2;}
}
}
while(1)
{
if(key==1) //增加脉宽
{
if(PWM!=0xfa)
{
delay(10);
if(key==1)
{
PWM++;
while(key==1);
}
}
}
if(key==2) //减少脉宽
{
if(PWM!=0x0A)
{
delay(10);
if(key==2)
{
PWM--;
while(key==2);
}
}
}
if(key==3) //脉宽复位
{
delay(10);
if(key==3)
{
PWM=0xce;
while(key==3);
}
}
}
}
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{
TR0=0 ;
TH1=PWM; //赋脉宽值
TL1=PWM;
TR1=1;
TR0=1;
KEY=0; //输出高脉宽
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
KEY=1 ; //输出低脉宽
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--);
}
#include < reg51.h >
void delay(unsigned char t);
unsigned char key;
sbit KEY=P1^0; //PWM输出
unsigned char PWM=0xce ; //赋初值脉宽50%
/*********************************************************/
void main()
{
TMOD=0x22; //T0、T1方式 2
TH0=0x9c ; //产生频率10kHZ 即周期100us
TL0=0x9c ; //频率调节
TH1=PWM; //脉宽调节
TL1=PWM;
EA=1; //开定时器中断T0、T1
ET0=1;
ET1=1; //开定时器T0关定时器T1
TR0=1;
TR1=0;
{
unsigned char temp;
P2=0xff;
while(1)
{
do {temp=P2;}
while(temp==0xff);
delay(10);
do{temp=P2;}
while(temp==0xff);
switch(temp)
{ case 0xfe:key=1;break;
case 0xfd:key=2;break;
case 0xfb:key=3;break;
case 0xf7:key=4;break;
case 0xef:key=5;break;
case 0xdf:key=6;break;
case 0xbf:key=7;break;
case 0x7f:key=8;break;
default: break;
}
while(temp!=0xff)//等待键释放
{temp=P2;}
}
}
while(1)
{
if(key==1) //增加脉宽
{
if(PWM!=0xfa)
{
delay(10);
if(key==1)
{
PWM++;
while(key==1);
}
}
}
if(key==2) //减少脉宽
{
if(PWM!=0x0A)
{
delay(10);
if(key==2)
{
PWM--;
while(key==2);
}
}
}
if(key==3) //脉宽复位
{
delay(10);
if(key==3)
{
PWM=0xce;
while(key==3);
}
}
}
}
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{
TR0=0 ;
TH1=PWM; //赋脉宽值
TL1=PWM;
TR1=1;
TR0=1;
KEY=0; //输出高脉宽
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
KEY=1 ; //输出低脉宽
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--);
}