#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DAC 0x7fff //定义DAC端口地址
uchar code SINTAB[]={0x7F,0x89,0x94,0x9F,0xAA,0xB4,0xBE,0xC8,0xD1,0xD9,0xE0,0xE7,
0xED,0xF2,0xF7,0xFA,0xFC,0xFE,0xFF};
uchar bdata Tbase=0x20;
sbit KST=Tbase^0; //阶梯波标志
sbit KTRI=Tbase^1; //三角波标志
sbit KSQ=Tbase^2; //方波标志
sbit KSIN=Tbase^3; //正弦波标志
sbit K1=P1^0; //K1键
sbit K2=P1^2; //K2键
sbit K3=P1^4; //K3键
sbit K4=P1^6; //K4键
/**************延时函数*******************/
void delay()
{
uchar i;
for(i=0;i0xff;i++);
}
/**************阶梯波函数*******************/
void st()
{
uchar i=0;
while(KST)
{
XBYTE[DAC]=i++; //启动DAC
}
}
/**************三角波函数*******************/
void tri()
{
uchar i=0;
XBYTE[DAC]=i;
do
{
XBYTE[DAC]=i;
i++;
}
while(i0xff);
do
{
XBYTE[DAC]=i;
i--;
}
while(i>0x0);
}
/**************方波函数*******************/
void sq()
{
XBYTE[DAC]=0x00;
delay();
XBYTE[DAC]=0xff;
delay();
}
/**************正弦波函数*******************/
void sin()
{
uchar i;
for(i=0;i18;i++)XBYTE[DAC]=SINTAB[i]; //第1个1/4周期
for(i=18;i>0;i--)XBYTE[DAC]=SINTAB[i]; //第2个1/4周期
for(i=0;i18;i++)XBYTE[DAC]=~SINTAB[i]; //第3个1/4周期
for(i=18;i>0;i--)XBYTE[DAC]=~SINTAB[i]; //第4个1/4周期
}
/**************主函数*******************/
main()
{
EX0=1;IT0=1;EA=1;
while(1){
if(KST==1)st();
if(KTRI==1)tri();
if(KSQ==1)sq();
if(KSIN==1)sin();
}
}
/**************INT0中断服务函数*******************/
void int0() interrupt 0 using 1
{
if(K1==0) //判断梯形波是否按下
{
Tbase=0;
KST=1;
}
if(K2==0) //判断三角波是否按下
{
Tbase=0;
KTRI=1;
}
if(K3==0) //判断方波是否按下
{
Tbase=0;
KSQ=1;
}
if(K4==0) //判断正弦波是否按下
{
Tbase=0;
KSIN=1;
}
}