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

📄 wave.c

📁 文件内容是:基于单片机AT89S52的函数信号发生器的源代码
💻 C
字号:
#include"at89x52.h"
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
   
/**************************
     定义各个功能端
**************************/
uchar code  LED_dig[]={0xef,0xdf,0xbf,0x7f};//位选地址码
uchar code 	Dis[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管码表,定赗位?
uchar data  led[4];				//显示缓冲区
uchar KEY;						//键值
uint  DelayKey;					//键盘延时变量
bit Still;

  uchar ScanIndex;
  unsigned char freq=1;      //控制频率量
  unsigned char bo=0;        //波形选择变量
  unsigned char freqsect=0;   //时间变量
						//定时器周期计算联合变量,记录2次外部中断间的时间			
/************************
   正弦码表
 ************************/
 unsigned char code DisCode[]= {
       0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,
       0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
       0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
       0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
       0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
       0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,

       0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,
       0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
       0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
       0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
       0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
       0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
       0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,

       0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,
       0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
       0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3B,
       0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
       0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
       0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
       0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
       0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,

       0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
       0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
       0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,											
       0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
       0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
       0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
       0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
       0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80,
      };
void display();    
void Disposekey();								
/**********************************************
按键检测函数
***********************************************/
//*************************扫描按键程序******************
void Scankey(void)            		   
{
	uchar x;
	x=P3&0x1c;
	if(x!=0x1c)DelayKey=100;			//设置延迟时间削颤
	if(x&0x08)Still=0;					//功能切换键松键
}
void DisposeKEY(void)
{
	switch(KEY)
	{
	case 0x18:                // k1
		if(freq<99)freq++;
		DelayKey=2000; 		//按住键不动可连续改变设置
		break;
    case 0x14:                //k2
		if(Still==0)
		{
			bo++;
			bo&=3;
			Still=1;
		}
		break;
	case 0x0c:                 // k3
		if(freq)freq--;
		DelayKey=2000;		  //按住键不动可连续改变设置
		break; 
    default:break;
	}
    display();
	KEY=0x1c;
}
/****************************************
正弦波
*****************************************/
void sine(void)
{
	P1=DisCode[freqsect];
}
/****************************************
 锯齿波函数
*****************************************/
void saw(void)
{
	P1=freqsect;
}
/******************************************
 方波
*******************************************/
void square(void)
{
	if(freqsect<128) P1=255;
	else P1=0;
}
/*******************************************
三角波
*******************************************/
void tria(void)
{    
	if(freqsect<128) P1=freqsect<<1;
	else
	{
		if(freqsect==128)P1=255;
		else P1=(256-freqsect)<<1;
	}
}

/***************************
中断函数
****************************/
void T0_SR() interrupt 1
{           
	if(freq!=0)
	 { freq=22118400/12/freq/32;          //频率值转换成定时器的定时数
	   TH0=(-freq)>>8;
	   TL0=(-freq);
     }
	else P1=0x00;
	if(bo==0)sine();                         //输出波形
	if(bo==1)square();
	if(bo==2)saw();
	if(bo==3)tria();
	freqsect++;
}
//******************多任务时序控制时钟中断*************************
void  T1_SR() interrupt 3       	//定时器1中断,完成1秒定时和LED延时
{  
	P0=0;
	P2=LED_dig[ScanIndex];
	P0=led[ScanIndex];		   
	ScanIndex++;
	ScanIndex &= 3;

	if(DelayKey==0)Scankey();   	//若没按键则扫描按键
	else		   					//有按键利用DelayKey按键消颤
	{
		DelayKey--;
		if(DelayKey==0)				//处理按键
		{
			KEY=P3&0x1c;			//取键值P32、P33、P34
		}
	}
}
/****************************************
显示函数
*****************************************/
void display(void)
 {    		

 	led[0]=Dis[freq%10];
	led[1]=Dis[freq/10];
	led[2]=0x40;
	led[3]=Dis[bo];
 }
/*****************************************
主函数
*****************************************/
void main(void)
{  
    TMOD=0x21;          //T1 T0都工作在定时方式,T1方式2,T0方式1
	TR0=1;         //T0定时器开始计数
	ET0=1;          //开T0的中断
	
	TH1=-200;         // 8位自动重装定时器约每100uS中断1次,9216次为1秒 
	TL1=-200;
	TR1=1;           //T1定时器开始计数
	ET1=1;          //允许T1溢出中断
//	IP=0x02;        //规定T0为高级中断
	EA=1;  
    DelayKey=0;
	display();       // 显示初始界面 
	while(1)
	{
	  if(KEY!=0x1c)	
      Disposekey();
	}
}



⌨️ 快捷键说明

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