//设计实现PWM功能,通过按键实现占空比10-90%可调,1602液晶屏显示占空比数据。 #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit a=P1^0;
sbit key0=P3^6;
sbit key1=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
uchar code table1[]="duty=50%";
uchar duty,num,b;
uchar number;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void LCD1602init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delayms(5);
}
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void keyscan()
{
if(key0==0)
{
delayms(10);
if(key0==0)
{
number--;
if(number==9)
{
number=90;
}
}
while(!key0);
}
if(key1==0)
{
delayms(10);
if(key1==0)
{
number++;
if(number==91)
{
number=10;
}
}
while(!key1);
}
}
void main()
{
LCD1602init();
TMOD=0x01;
TH0=(65336)/256;
TL0=(65336)%256;
EA=1;
ET0=1;
TR0=1;
number=50;
while(1)
{
keyscan();
write_sfm(5,number);
}
}
void T0_time() interrupt 1
{
TH0=65336/256;
TL0=65336%256;
a=0;
num++;
if(num==100-duty)
a=1;
if(num==100)
{
num=0;
a=0;
}
}
|