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

📄 main.c

📁 单片机`方波发生器,可调频, 0-1000HZ
💻 C
字号:
/**********方波发生器*********/
//作者:翰海光舟
//日期:2005年12月26日

/***********宏定义************/

#include<AT89X52.H>

/*******子函数声明************/
void delay10ms(void);

/****全局变量定义************/

unsigned char i,j;                 //循环变量
unsigned int frequency=0;          //从键盘输入的频率
unsigned long pw;                  //脉冲宽度
unsigned char multiple;            //脉宽比65536的倍数
unsigned int rest;                 //脉宽比65536的余数
unsigned char counter;             //计数变量
unsigned char number=0;            //数组下标
unsigned char buffer=0;            //位选标志
unsigned char disbuf[4];           //缓冲数组
bit flag=0;                        //第一次按下数字键的标志,0=第一次按下
unsigned char code disp[]={0x3f,0x06,0x5b,0x4f,0x66,
                            0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x79};      //0~9、(null)、E
                  
sbit key0=P1^0;           //0~9数字键
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit key8=P3^0;
sbit key9=P3^1;

sbit makesure=P3^2; //确认键
sbit renew=P3^3; //重置键
/**********************************主函数*****************************/

void main(void)
{
 TMOD=0x11;     //中断初始化
 EA=1;
 ET0=1;
 ET1=1;
 TR1=1;
 
 TH1=65036>>8;
 TL1=65036;
 P2_0=0;       //点亮电源指示灯

/**************************按键查询**********************************/
 while(1)
 {
begin:
  if(key0==0)
  {
   delay10ms();                //软件消抖
   if(key0==0)
   {
    switch(number)
    {
	 case 0:
            disbuf[3]=10;      //10=无效零消隐
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=0;       //数码管相应位显示的数字
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=0;
			break;
	 case 2:
            disbuf[3]=10;	 
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=0;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=0;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;


    if(flag==0)
	 flag=1;
    else
	 {
      frequency=(int)(frequency*10);
	  if(frequency>1000)               //输入的频率大于1000
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;               //异常处理       
         }
	   }
    
    while(key0==0);
    }
   }

  if(key1==0)
  {
   delay10ms();
   if(key1==0)
   {
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=1;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=1;
			break;
	 case 2:
            disbuf[3]=10;	 
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=1;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=1;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=1;
	  }
    else
	{
    frequency=(int)(frequency*10+1);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key1==0);
    }
   }

  if(key2==0)
  {
   delay10ms();
   if(key2==0)
   {
    switch(number)
    {
	 case 0:
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=2;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=2;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=2;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=2;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

     if(flag==0)
	 {
	  flag=1;
	  frequency=2;
	  }
    else
	{
    frequency=(int)(frequency*10+2);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key2==0);
    }
   }

  if(key3==0)
  {
   delay10ms();
   if(key3==0)
   {   
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=3;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=3;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=3;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=3;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=3;
	  }
    else
	{
     frequency=(int)(frequency*10+3);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key3==0);
    }
   }

  if(key4==0)
  {
   delay10ms();
   if(key4==0)
   {    
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=4;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=4;
			break;
	 case 2:
            disbuf[3]=10;	 
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=4;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=4;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=4;
	  }
    else
	{
    frequency=(int)(frequency*10+4);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key4==0);
    }
   }

  if(key5==0)
  {
   delay10ms();
   if(key5==0)
   {
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=5;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=5;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=5;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=5;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=5;
	  }
    else
	{
    frequency=(int)(frequency*10+5);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key5==0);
    }
   }

  if(key6==0)
  {
   delay10ms();
   if(key6==0)
   {    
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=6;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=6;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=6;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=6;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=6;
	  }
    else
    {
    frequency=(int)(frequency*10+6);
		  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key6==0);
    }
   }
  if(key7==0)
  {
   delay10ms();
   if(key7==0)
   {   
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=7;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=7;
			break;
	 case 2:	
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=7;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=7;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=7;
	  }
    else
	{
     frequency=(int)(frequency*10+7);
     	  if(frequency>1000)
	    {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
         }
      }
    while(key7==0);
    }
   }

  if(key8==0)
  {
   delay10ms();
   if(key8==0)
   {    
    switch(number)
    {
	 case 0: 
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10; 
	        disbuf[0]=8;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=8;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=8;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=8;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=8;
	  }
    else
	{
    frequency=(int)(frequency*10+8);
	if(frequency>1000)
	  {
	   disbuf[3]=11;
	   disbuf[2]=disbuf[1]=disbuf[0]=10;
	   frequency=0;
       goto exception;
	   }
	 }
    while(key8==0);
    }
   }

  if(key9==0)
  {
   delay10ms();
   if(key9==0)
   {    
    switch(number)
    {
	 case 0:
            disbuf[3]=10;
            disbuf[2]=10;
            disbuf[1]=10;  
	        disbuf[0]=9;
			break;
	 case 1:
            disbuf[3]=10;
            disbuf[2]=10;
	        disbuf[1]=disbuf[0];
	        disbuf[0]=9;
			break;
	 case 2:
            disbuf[3]=10;
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=9;
			break;
     case 3:
	        disbuf[3]=disbuf[2];
	        disbuf[2]=disbuf[1];
	        disbuf[1]=disbuf[0];
	        disbuf[0]=9;
			break;	        
      }
     number++;
	 if(number==4)
	 number=0;

    if(flag==0)
	 {
	  flag=1;
	  frequency=9;
	  }
    else
	{
    frequency=(int)(frequency*10+9);
    if(frequency>1000)
	   {
	     disbuf[3]=11;
		 disbuf[2]=disbuf[1]=disbuf[0]=10;
		 frequency=0;
		 goto exception;
        }
     }
    while(key9==0);
    }
   }
   if(makesure==0)               //确认键
  {
   delay10ms();
   if(makesure==0)
   {
    P2_3=0;                     //开确认指示灯
    pw=500000/frequency;                 //计算脉冲宽度,单位:uS
    multiple=(unsigned char)(pw/65536);  //计算pw比65536的倍数
	counter=multiple;
    rest=(unsigned int)(pw%65536);       //计算pw除以65536所得的余数
	if(rest>184)
	rest-=184;                        //线性修正,修正中断响应及中断受阻的时间影响         
    if(multiple==0)
    {
     TH0=(65536-rest)>>8;
     TL0=65536-rest;
     }
    else
    {
     TH0=0;
     TL0=0;
     }
    TR0=1;
    }
   }
   if(renew==0)
   {
    delay10ms();
    if(renew==0)
    {
     frequency=0;
     disbuf[0]=disbuf[1]=disbuf[2]=disbuf[3]=0;
     P2_3=1;           //关确认指示灯
     }
    } 
  }
exception:
  for(;;)
  {
   P2_2=0;                 //预置数超过1000报警灯
   if(renew==0)            //重置频率键按下
     {
	  delay10ms();
	  if(renew==0)        //重新初始化各变量
        {
         disbuf[0]=disbuf[1]=disbuf[2]=disbuf[3]=0;
         P2_2=1;          //关预置数指示灯
         flag=0;
		 buffer=0;
         goto begin;      //返回按键查询
         }
	  }
   }
 }


/***************延时10毫秒子程序*******************/
void delay10ms(void) 
{
 for(i=20;i>0;i--)
 for(j=248;j>0;j--);
}

void t0(void) interrupt 1    //T0中断入口,中断服务程序用来产生方波
{
 if(counter==0)
 {
  P2_0=~P2_0;             //输出方波                            
  TH0=(65536-rest)>>8;
  TL0=65536-rest;
  counter=multiple;
  }
 else
 {
  TH0=0;
  TL0=0;
  counter--;             //软件定时器
  }
 }

void t1(void) interrupt 3   //T1中断入口,此程序用于扫描数码管
{
 if(buffer==0)
 
 { 
  P0=disp[disbuf[3]];       //段选
  
  P2_6=0;
  P2_7=0;
  }
 if(buffer==1)
 
  {
  P0=disp[disbuf[2]];
  
  P2_6=0;
  P2_7=1;
  }
 if(buffer==2)
 
 {  
  P0=disp[disbuf[1]];
  
  P2_6=1;
  P2_7=0;

  }
 if(buffer==3)
 
 {
  P0=disp[disbuf[0]];
  
  P2_6=1;
  P2_7=1;
  }
 
 buffer++;              //扫描标志
 if(buffer==4)          //完成一个扫描周期
 buffer=0;              //开始新的扫描周期

 TH1=65036>>8;          //定时器重装初值
 TL1=65036;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -