⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wave_new.c

📁 可以设置输出方波的占空比
💻 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 + -