|
基本要求:以51单片机为核心,设计一个方波发生器,方波的占空比在1%~99%三档可调,一档步进10%,二档步进5%,三档步进1%。方波占空比可以直观显示。方波周期可调,调节范围20ms~2s之间,且周期可直观显示。
请问:周期和占空比之间有什么关系?具体怎么用程序来编写?还有下面的这个程序有什么问题?我用仿真软件做仿真,只能显示周期为25ms以下的方波,程序中“temp=30”的周期是显示不出来的。请各位指教!!!
#include <reg51.h>
sbit out=P1^6;
sbit key0=P1^0;//+_-
sbit key1=P1^1;//50ms
sbit led0=P2^0;
sbit led1=P2^1;
sbit key4=P1^3; //50ms
sbit com3=P2^4; //周期个位显示
sbit com4=P2^5; //周期十位显示
sbit com5=P2^6; //周期百位显示
sbit com6=P2^7; //周期千位显示
unsigned int flag,num=10,temp=30; //占空比,周期
unsigned char table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
}; //0~9
void delay();
void keyscan();
void display_zq();
void main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while (1)
{
keyscan();
display_zq();
if (key0==0)
delay();
if (key0==0)
{
flag++;
while (!key0);
if (flag==2)
flag=0;
}
switch (flag)
{
case 0:led0=0;led1=1;break;
case 1:led1=0;led0=1;break;
}
}
}
void int0() interrupt 1
{
unsigned char n;
TH0=(65536-100)/256+TH0;
TL0=(65536-100)%256+TL0;
n++;
if (n==temp*10*num/100)
out=1;
if (n==temp*10)
{
out=0;
n=0;
}
}
void delay()
{
unsigned char i,j,k;
for (i=0;i<100;i++)
for (j=0;j<10;j++)
for (k=0;i<1;k++);
}
void keyscan()
{
if(flag==0)
{
if (key1==0)
delay();
if (key1==0)
{
temp+=50;
if(temp>2000)
temp=2000;
while (!key1);
}
}
else if (flag==1)
{
if (key1==0)
delay();
if(key1==0)
{
temp-=50;
if(temp<20)
temp=20;
while (!key1);
}
}
}
void display_zq()
{
signed char a2,b2,c2,d2;
com3=1; //周期的千位显示
a2=temp/1000;
P3=table[a2];
delay();
com3=0;
com4=1; //周期的百位显示
b2=temp%1000/100;
P3=table[b2];
delay();
com4=0;
com5=1; //周期的十位显示
c2=temp%100/10;
P3=table[c2];
delay();
com5=0;
com6=1; //周期的个位显示
d2=temp%10;
P3=table[d2];
delay();
com6=0;
}
|
|