📄 wave_new.c
字号:
# include<at89x51.h>
sbit start= P1^0;
sbit waveform= P1^1;
sbit increase= P1^2;
sbit decrease= P1^3;
sbit dclock=P1^7;
sbit point =P2^4;
sbit led1=P2^5;
sbit led2=P2^6;
bit flag=0,interflag=1;
unsigned char frequence=10,times=0;
float dutycycle=0.5;
void wait(void);
void readkeys(void);
void display(void);
void main(void)
{
TMOD=0x02;
EA=1;
ET0=1;
TH0=0xce;
TL0=0Xce; //*************设置定时器的初值,工作方式2(自动重装),12M晶振,每中断一次为100us。*************//
P2=0;
while(1)
{
readkeys();
}
}
/**************************************************/
/******************读键盘**************************/
void readkeys(void)
{
display();
while(start!=0)
{
wait(); /************去抖动**************/
if(start==0) break;
if(waveform==0)
{
wait();
if(waveform==0)
{
TR0=0; /******进行设置时,中断停止,不输出波*******/
flag=~flag;
display(); /************读取频率&占空比选择键,并进行相应值的显示**************/
}
}
if(increase==0)
{
wait();
if(increase==0)
{
TR0=0; /******进行设置时,中断停止,不输出波*******/
if(flag==0)
{
frequence=+1;
}
else dutycycle=+0.1;
if (dutycycle>=1) dutycycle=0.9; /*****占空比最高可以设为0.9*******/
display(); /*******************读频率值以及占空比值(增加),并显示*********************/
}
}
if(decrease==0)
{
wait();
if(decrease==0)
{
TR0=0; /******进行设置时,中断停止,不输出波*******/
if(flag==0)
{
frequence=-1;
if (frequence<=0) frequence=1;
}
else dutycycle=-0.1;
if (dutycycle<=0) dutycycle=0.1; /*****占空比最低可以设为0.1*******/
display(); /*******************读频率值以及占空比值(减少),并显示*********************/
}
}
}
while(start==0)
{
wait(); /************去抖动**************/
// if(start!=0) break;
while(start==0)
{
TR0=1;
}
}
}
//*********************延时程序********************************//
void wait(void)
{
unsigned char z;
for(z=0;z<256;z++);
}
//********************定时器中断处理*********************************//
timer0()interrupt 1
{
unsigned char highlevel,lowlevel;
highlevel=(10000/frequence)*2*dutycycle;
lowlevel=(10000/frequence)*2*(1-dutycycle);
times=+1;
while(interflag==1) /*********产生方波的高电平部分**************/
{
if(times==highlevel) /****************计算高电平占用一个周期的部分************************/
{
dclock=1;
times=0;
interflag=~interflag;
}
}
while(interflag==0) /*********产生方波的低电平部分**************/
{
if(times==lowlevel) /****************计算低电平占用一个周期的部分************************/
{
dclock=0;
times=0;
interflag=~interflag;
}
}
}
//********************显示程序********************************//
void display(void)
{
unsigned char gewei=0,shiwei=0,x=0;
while(flag==0)//************显示频率数*****//
{
if(frequence<10) //************显示小于10的频率数*****//
{
point=0;
led1=1;
led2=0;
P2=P2+frequence;
//wait();
}
if(frequence>=10) //************显示大于10的频率数*****//
{
shiwei=frequence/10;
gewei=frequence-shiwei*10;
point=0;
for(x=0;x<100;x++)
{
led1=0;led2=1;
P2=P2+shiwei;
wait();
P2=P2-shiwei;
led1=1;led2=0;
P2=P2+gewei;
wait();
P2=P2-gewei;
}
wait();
}
}
while(flag==1) //************显示占空比*****//
{
for(x=0;x<100;x++)
{
P2= 0X50; /********显示"0"和"."************/
wait();
P2=0X30;
P2 =P2+dutycycle*10; /********显示小数位************/
wait();
P2=P2-dutycycle*10;
}
/* while(dutycycle==1)
{
for(x=0;x<100;x++)
{
P0=0X21;
wait();
P0=P0-1;
}
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -