📄 可调频.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 + -