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

📄 可调频.c

📁 DAC0832可调频的程序
💻 C
字号:
/**********************************************************
**实验目的:练习数据输出控制的C编程
**应用软件:Keil 8.0
**系统使用器件: STC8051  ADC0832
___________________________________________________________
-----------------------------------------------------------
**创建人:历岩  	QQ:342372282
**文件名:0832
**创建日期: 2008.8.13
___________________________________________________________
-----------------------------------------------------------
**描述:用8051输出控制0832,在定时器中断程序里输出三角波、方
		波、锯齿波、正弦波;并通过外部中断调节频率;另外用数
		码管显示频率(因为频率调节不明显主要是用来调试作用);

***********************************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAC0832 P2			//将DAC0832定义为P2口;
#define ALL 65536			//将ALL定义为65536;
#define Fosc 12000000		//频率为12M
uchar TH_0,TL_0,flag1,flag=0;
uchar qian,bai,shi,ge;	//显示部分参数
uint  FREQ=100,num;	//起始频率设定为100HZ
float temp;
uchar code sin_num[]={     
      0,0,	0,	0,	0,	0,	0,	0,	1,	1,	1,	1,	1,	2,	2,	2,
	  2,	3,	3,	4,	4,	4,	5,	5,	6,	6,	7,	7,	8,	8,	9,	9,
      10,	10,	11,	12,	12,	13,	14,	15,	15,	16,	17,	18,	18,	19,	20,	21,
	  22,	23,	24,	25,	25,	26,	27,	28,	29,	30,	31,	32,	34,	35,	36,	37,
      38,	39,	40,	41,	42,	44,	45,	46,	47,	49,	50,	51,	52,	54,	55,	56,
      57,	59,	60,	61,	63,	64,	66,	67,	68,	70,	71,	73,	74,	75,	77,	78,
 	  80,	81,	83,	84,	86,	87,	89,	90,	92,	93,	95,	96,	98,	99,	101,102,
	  104,	106,	107,	109,	110,	112,    113,	115,	116,	118,	120,	121,	123,	124,	126,	128,
	  129,	131,    132,	134,	135,    137,    139,	140,	142,	143,	145,	146,	148,    149,	151,	153,
	  154,	156,	157,	159,	160,	162,	163,	165,    166,	168,	169,	171,	172,	174,	175,	177,
	  178,	180,	181,    182,	184,	185,	187,	188,	189,	191,	192,	194,	195,	196,	198,	199,
	  200,	201,	203,	204,	205,	206,	208,	209,	210,	211,	213,	214,	215,	216,	217,	218,	
	  219,	220,	221,	223,	224,	225,	226,	227,	228,	229,	230,	230,	231,	232,	233,	234,	
	  235,	236,	237,	237,	238,	239,	240,	240,	241,	242,	243,	243,	244,	245,	245,	246,	
	  246,	247,	247,	248,	248,	249,	249,	250,	250,	251,	251,    251,	252,	252,	253,	253,	
	  253,	253,	254,	254,	254,	254,	254,	255,	255,	255,	255,    255,	255,	255,	255,	255
	  };
/***********8051端口设置***************/
sbit cs=P3^6;
sbit change=P1^0; 
sbit ADDFREQ=P1^1;
sbit SUBBFREQ=P1^2;

void display(uchar qian,uchar bai,uchar shi,uchar ge);
/***********延时函数:延时1ms*********/
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
} 
/***********初始化函数***********/
void init()
{
	TMOD=0X01;	 //设定工作模式 1
	temp=ALL-Fosc/12.0/256/FREQ; //定时器初值计算(将没个周期划分为256份)
	TH_0=(uint)temp/256;
	TL_0=(uint)temp%256;
	EA=1;	  //开总中断
	EX0=1;	  //开外部中断
	IT0=1;	  //设定下降沿有效工作方式
	ET0=1;	  //设定定时器工作在定时方式
	TR0=1;	  //开定时器中断
} 

/************频率调节函数********************/
void changefreq(void)
{
	if(change==0)
	{flag++;	if(flag==4) {flag=0;num=0;}}
	if(ADDFREQ==0)  FREQ=FREQ+10;//FREQ++;
	if(SUBBFREQ==0)	FREQ=FREQ-10;//FREQ--;
    temp=ALL-Fosc/12.0/256/FREQ;//通过改变初值来实现定时器定时时间,从而改变波形频率
	TH_0=(uint)temp/256;
	TL_0=(uint)temp%256;
	ge=FREQ%10;	   //数值分离;
	shi=FREQ/10%10;
	bai=FREQ/100%10;
	qian=FREQ/1000;
}  
/***********三角波发生函数**********************/
void san(void)
{
	for(num=0;num<255;num++)
	{cs=0;DAC0832=num;cs=1;}
	for(num=255;num>0;--num)
	{cs=0;DAC0832=num;cs=1;}
}
/************方波发生函数*********************/
void fang(void)
{
	cs=0;DAC0832=0XFF;cs=1;
	for(num=0;num<255;num++);
	cs=0;DAC0832=0X00;cs=1;
	for(num=255;num>0;num--);
}
/************锯齿波发生函数**********************/
void juchi(void)
{
	cs=0;DAC0832=++num;cs=1;	
}
/*************正弦波发生函数********************/
void zhengxian(void)
{
	for(num=0;num<255;num++)
	{cs=0;DAC0832=sin_num[num];cs=1;}
	for(num=255;num>0;num--)
	{cs=0;DAC0832=sin_num[num];cs=1;}
}
/*************外部中断服务函数***********************/
void ext0() interrupt 0
{
	changefreq(); //引用频率改变函数
}
/**************定时器中断函数****************/
void timer0() interrupt 1
{
	TH0=TH_0;TL0=TL_0;	//重新装初值
	TR0=0;
	switch(flag)
	{
		case 0: {san();TR0=1;break;}  
		case 1: {fang();TR0=1;break;}
		case 2: {juchi();TR0=1;break;}
		case 3: {zhengxian();TR0=1;break;} 
		default: ;
	}
}
/**************频率显示函数*********************/
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
	P0=0X00+qian;
	delay(5);
	P0=0X10+bai;
	delay(5);
	P0=0X20+shi;
	delay(5);
	P0=0x30+ge;
	delay(5);
}

/**************主函数********************/
void main()
{
	init();
//	while(1){display(qian,bai,shi,ge);};
	while(1);
}

⌨️ 快捷键说明

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