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

📄 httt.c

📁 本系统采用51单片机和DAC0832
💻 C
字号:
#include<REG51.h>

#define uchar unsigned char
#define uint unsigned int
#define led P0                       //P0口控制数码管
#define DAC0832 P1 					//P1口控制0832的输入
#define ledxuan P2					//P2口位选

uchar code leddig[]={	0xef,0xdf,0xbf,0x7f};            //位选码

uchar code ledcode[]={0x3f,0x06,0x5b,0x4f,			  	// 断码
	   			  		0x66,0x6d,0x7d,0x07,
				  		0x7f,0x6f,0x79,0x40}; 

uchar code sin[256]={ 	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, 
						0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD, 
						0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
						0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD, 
						0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6, 
						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,0x3A, 
						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 };
sbit keymode=P2^3;                //按键四个,分别是 模式建,调节控制建,位选移动键,数值加1键
sbit keyset=P2^0;                  //四建分别在 P2^0--P2^3口
sbit keymove=P2^1;
sbit keyup=P2^2;

bit setflag=0;                         //调节标志

uchar mode=0,movenum=1,led4[4],wei,N=0,M=0;
uint  freq;

void key()                         //按键函数
{
	uchar keynum;
	keynum=keymode&keyset&keymove&keyup;       //有无按键按下 判定位,按下为0,没有为1
	if(keynum==0)                              
	{ 
		if(keymode==0) { while(keymode==0);   //等待按键弹起,消颤
						 if(mode<=3) mode++;   //模式的循环选择(1,2,3,4种)
							else mode=1;
							led4[0]=mode;
							N=0;
					   }
		else if(keyset==0) { while(keyset==0);    //等待按键弹起,消颤
							 setflag=~setflag;    //判断可否调节的位
						   }
		else if(keymove==0) { while(keymove==0);    //等待按键弹起,消颤
							  if(setflag) 
								if(movenum<=2) movenum++;   //要调节的位的循环选择 (1,2,3位)
								else movenum=1;	
							}
		else if(keyup==0) { while(keyup==0);     //等待按键弹起,消颤
							  if(setflag)                
								if(led4[movenum]<=8) led4[movenum]++;     //调节的位的加1
								else led4[movenum]=0;	
							}
	}

}

void display()               //显示函数
{
	uchar n;
	ledxuan=leddig[wei];    //位选
	n=led4[wei];            //键值
	if(wei==movenum&setflag==1) led=ledcode[n]|0x80;   //该位被选中,则可以调节,该位小数点亮
	  else led=ledcode[n];          //该位没被选中 ,不亮小数点            
	if(wei<=2) wei++;            //位选循环,准备显示下一位
	  else wei=0;
}

void output()           //波形输出函数
{
	switch(mode)        //根据模式唻输出
	{ 
	  case 1:                              //方波
	    { if(N<=128) DAC0832=0x00; 
		   else DAC0832=0xff;
		  N=N+8;
		  break;
	    }
	  case 2:                             //锯齿
		{ DAC0832=N;
		  N=N+8;
		  break;
		}
	  case 3:                             //三角波
		{ 
	    if(M==0)	
		{N=N+8;
     	 DAC0832=N;
		 if(N==248)
		 M=1;
		 }

	    if(M==1)
		{ N=N-8;
		 DAC0832=N;
		 if(N==0)
		 {
		 M=0;}
		 }
		 break;
		}
	  case 4:                             //正弦波
		{ DAC0832=sin[N];
		  N=N+8;
		  break;
		}
   	  default:break;
	}
}

void work() interrupt 1               //定时器0,
{
	freq=led4[1]*100+led4[2]*10+led4[3];   // 计算输入的键值即为频率值
	if(freq!=0)
	 { freq=22118400/12/freq/32;          //频率值转换成定时器的定时数
	   TH0=(-freq)>>8;
	   TL0=(-freq);
	   output();                   //输出波形
	 }
	else DAC0832=0x00;
}

void displayer() interrupt 3      //定时器1
{
	TR1=0;                      //定时器关
	TH1=(-300)>>8;               //定时数重装
	TL1=(-300);	
	display();              //显示函数调用
	TR1=1;                  //定时器开
}

void initial()            //初始化函数
{
    DAC0832=0;           // 数模初始值为0
	led=0x00;            //数码管初始
	ledxuan=0xff;       //位选初始
	EA=1;               //中断允许
	TMOD=0x11;          //定时器0,1的方式都是1
	TH0=(-300)>>8;      //定时器0初值装入
	TL0=(-300);
	ET0=1;              //中断0允许
	TR0=1;	           //定时器0开
	TH1=(-300)>>8;     //定时器1初值装入
	TL1=(-300);        //中断1允许
	ET1=1;            //定时器1开
	TR1=1;	 
}

void main(void)      //主函数
{
	initial();      //初始化
	while(1){key();}  //死循环,调用按键函数
}


⌨️ 快捷键说明

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