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

📄 波形发生器.c

📁 基于89S51单片机
💻 C
字号:
/*********************************************************/
/**                数字时钟                              **/
/**                作者:曹锐于关老师基础上							**/
/**                时间:2007/10/18级                   **/
/**        National University of Defence Technology    **/
/**                   指示3548635994                    **/
/*********************************************************/

#include <absacc.h>
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint8 unsigned char
#define uint16 unsigned int

sbit LED1=P1^1;   //数码管
sbit LED2=P1^2; 
sbit LED3=P1^3; 
sbit LED4=P1^4; 

sbit key1=P1^5;//键盘
sbit key2=P1^6;
sbit key3=P1^7;

uint8 step=1;//步进,随频率变化
uint16 temp=0;//相位
uchar aaa=0;//波的种类
uint16 fre;//波的频率

#define sendwave P2//波形送出口
#define display P0//显示内容输出端口
#define sltld P1//选通LED所用变量

uchar code sin[]={127,126,124,123,121,119,118,116,115,113,111,110,108,
        107,105,104,102,100,99,97,96,	94,	93,91,	90,	88,	87,	85,
		83,	82,	80,	79,	78,	76,	75,	73,	72,	70,	69,	67,	66,	65,	63,
		62,	60,	59,	58,	56,	55,	54,	52,	51,	50,	49,	47,	46,	45,	44,
		42,	41,	40,	39,	38,	37,	36,	34,	33,	32,	31,	30,	29,	28,	27,
		26,	25,	24,	23,	22,	21,	21,	20,	19,	18,	17,	16,	16,	15,	14,
		13,	13,	12,	11,	11,	10,	9,	9,	8,	8,	7,	7,	6,	6,	5,
		5,	4,	4,	4,	3,	3,	2,	2,	2,	2,	1,	1,	1,	1,	1,
		0,	0,	0,	0,	0,	0,	0,	0,	0,	0,	0,	0,	0,	0,	1,
		1,	1,	1,	1,	2,	2,	2,	2,	3,	3,	3,	4,	4,	5,	5,
		5,	6,	6,	7,	7,	8,	9,	9,	10,	10,	11,	12,	12,	13,	14,
		15,	15,	16,	17,	18,	18,	19,	20,	21,	22,	23,	24,	25,	26,	27,
		28,	29,	30,	31,	32,	33,	34,	35,	36,	37,	38,	39,	41,	42,	43,	
		44,	45,	47,	48,	49,	50,	52,	53,	54,	56,	57,	58,	60,	61,	62,
		64,	65,	67, 68,	70,	71,	72,	74,	75,	77,	78,	80,	81,	83,	84,	
		86,	87,	89,	90,	92,	93,	95,	97,	98,	100,101,103,104,106,108	,
		109	,111,112,114,115,117,119,121,122,123,125,127,128,130,132	,
		133,135,136,138,140,141,143,144,146,147,149,151,152,154,155,
		157,158,160,162,163,165,166,168,169,171,172,174,175,177,178,
		180,181,183,184,185,187,188,190,191,193,194,195,197,198,199,
		201,202,203,205,206,207,208,210,211,212,213,214,216,217,218,
		219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
		234,235,236,237,237,238,239,240,240,241,242,243,243,244,245,
		245,246,246,247,248,248,249,249,250,250,250,251,251,252,252,
		252,253,253,253,253,254,254,254,254,254,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,254,254,254,254,254,253,
		253,253,253,252,252,251,251,251,250,250,249,249,248,248,247,
		247,246,246,245,244,244,243,242,242,241,240,239,239,238,237,
		236,235,234,234,233,232,231,230,229,228,227,226,225,224,223,
		222,221,219,218,217,216,215,214,213,211,210,209,208,206,205,
		204,203,201,200,199,197,196,195,193,192,190,189,188,186,185,
		183,182,180,179,177,176,175,173,172,170,168,167,165,164,162,
		161,159,158,156,155,153,151,150,148,147,145,144,142,140,139,
		137,136,134,132,131,129,128};

uchar code tri[]={250,249,248,247,246,245,244,243,242,241,240,239,
238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,
	222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,
	207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,
	192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,
	177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,
	162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,
	147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,
	132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,
	117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,
	102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,
	87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,
	72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,
	57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,
	42,41,40,39,38,37,36,35,34,33,32,31,30,29,28 ,
	27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,
	12,11,10,9,8,7,6,5,4,3,2,1,0, 1, 2,
	3,4,5,6,7,8,9,10,11,12,13,14,15,16,
	17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
	32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,
	47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
	62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,
	77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,
	92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,
	107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
	122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,
	137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
	152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,
	167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,
	182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,
	197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,
	212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,
	227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,
	242,243,244,245,246,247,248,249	};

/*扫描键盘使用的变量 */


uint16 counter=1;
uint16 counter1=1; //读键盘计数器,每16ms刷新读一次
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0;  //防止按键冲突标志位
uchar keynum =0;  //获得的有效按键值寄存器 
uchar key;



/*数码管显示使用的变量和常量*/
uchar lednum = 3;  //数码管显示位控制寄存器
uchar led[4] = {0,0,0,0};  //数码管显示内容寄存器
uchar code segtab[18] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x00}; //七段码段码表
                      // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black" 
                 




void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void init_condition(void);//初始化函数





void intT0() interrupt 1 //T0 定时中断处理函数
{
	TH0 = 0xff;  //定时器中断时间间隔 0.1ms
 	TL0 = 0x38;
	counter1=counter1+1;
    counter=counter+1;
	temp=temp+step;
	if(temp>=500)
		temp=temp-500;
	switch(aaa)
	{
	    case 0:
		sendwave=sin[temp];
		break;
		case 1:
        sendwave=tri[temp];
		break;
        case 2:
			if(temp>=250)
				sendwave=0xff;
			else
				sendwave=0x00;
		break;
	}
	if(counter==81)
		counter=1;
	if(counter==40||counter==80)
	{   
		fre=20*step;
		led[0]=aaa;
		led[1]=fre/100;
		led[2]=(fre%100)/10;
		led[3]=fre%10;

		leddisp();
	}
     if(counter1==1001)
     counter1=1;
	if(counter1==1000)
		readkey();
    
	//counter=counter+1;
      }


void main(void)
{

	TMOD = 0x01;    //
 	TH0 = 0xff;  //定时器中断时间间隔 0.1ms
 	TL0 = 0x38;
	TCON = 0x10;
 	ET0 = 1;
 	EA = 1;

	

	while(1)
	{
       if(getkey==1)
	   {
		   getkey=0;
		   switch(keynum)
		  
		  { case 0:
			   init_condition();
			   break;
		   case 1:
			   { 
			   aaa=aaa+1;
			   if(aaa==3)
			   aaa=0;
			   }
			   break;
		   case 2:
			   {
			   step=step+1;
			   if(step==51)
				   step=1;
			   }
			   break;
			   }
	   }
                                
 	}
}

/***************************************************
			键盘扫描函数
原型:   void readkey(void);
功能:  当获得有效按键时,令getkey=1,keynum为按键值

****************************************************/
void readkey(void)
{
	if(!(key1==1&&key2==1&&key3==1))
	{
		
		if(key1==0)
        keynum=0;
         else if(key2==0)
          keynum=1;
         else
         keynum=2;
         getkey=1;
	}
	

	
}

/***************************************************
			数码管显示函数
原型:   void leddisp(void);
功能:  每次调用轮流显示一位数码管

****************************************************/
void leddisp(void)
{
	switch(lednum)  //选择需要显示的数码位
 {	
	case 0:
	sltld=0xfd; //11111101b
		display=segtab[led[0]]+128;
		
		break;
	    case 1:
	sltld=0xfb;   //11111011b
		display=segtab[led[1]];
		break;
		case 2:
	sltld=0xf7;//11110111b
		display=segtab[led[2]];
		break;
		case 3:
	sltld=0xef;	//11101111b
		display=segtab[led[3]] ;
		
			break;
  	}

	if(lednum == 0) //更新需要现实的数码位
 	{
		lednum = 3;
 	}
 	else
 	{
		lednum = lednum-1;
	}
}  
void init_condition(void)
{
  aaa=0;
  step=1;
  temp=0;
}
  

  



⌨️ 快捷键说明

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