#include <reg51.h> //51单片机的头文件
#include <absacc.h>
#define uchar unsigned char//用uchar代替unsigned char
#define uint unsigned int//同上
#define DAC 0xCFB0 //同上
//正弦波的表
uchar code sin[]={0x7f,0x89,0x94,0x9f,0xaa,0xb4,0xbe,0xc8,0xd1,
0xd9,0xe0,0xe7,0xed,0xf2,0xf7,0xfa,0xfc,0xfe,0xff};
//共阴数码管的码表
uchar code SEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar a; //定义一个变量a
//段式数码管的初始化函数
void Init()//8279初始化
{
XBYTE[0xCFE9]=0x00; //4条都是初始化
XBYTE[0xCFE9]=0xD1;
while (XBYTE[0xCFE9]&0x80);
XBYTE[0xCFE8]=0x34;
}
//扫描按键,获取键值
uchar ReadKey() //键盘读值
{
if(XBYTE[0xCFE9]&0x07) //判断有没有按键按下
{
XBYTE[0xCFE9]=0x40;
a=XBYTE[0xCFE8]; //赋值
}
return 0;
}
//数码管显示函数
void display(uchar y)
{
XBYTE[0xCFE9]=0x80;
XBYTE[0xCFE8]=SEG[y];//显示
}
//延时函数
void delay()
{
uchar i;
for(i=0;i<0xa0;i++); //延时0xa0个空指令
}
//三角波函数
void sanjiaobo()
{
uchar i=0;
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;//初始为0
//从0到255
do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i++;
}while(i<0xff);
//从255减到0 ,就是三角波波形
do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i--;
}while(i>0x0);
}
//锯齿波函数
void juchibo()
{
uchar i=0;
while(a==4)
{
XBYTE[DAC]=i++; //从0开始加
XBYTE[DAC+1]=i++;
ReadKey();//读取按键
}
}
//方波函数
void fangbo()
{
XBYTE[DAC]=0x00; //初始是0,延时一会
XBYTE[DAC+1]=0x00;
delay();
XBYTE[DAC]=0xff; //再输出255,输出方波
XBYTE[DAC+1]=0xff;
delay();
}
//正弦波函数
void sinbo()
{
uchar i;
for(i=0;i<18;i++) //循环18次,用查表法,依次加
{
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];
}
for(i=18;i>0;i--) //循环18次,用查表法,依次减
{
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];
}
for(i=0;i<18;i++) //循环18次,用查表法,依次加,输出与上次对称的波形
{
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];
}
for(i=18;i>0;i--) //循环18次,用查表法,依次减,输出与上次对称的波形
{
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];
}
}
//主函数
void main()
{
Init(); //初始化
display(0); //显示0
EX0=1;//开启外部中断
IT0=1; //开启定时器中断
EA=1;//开启总中断
while(1)
{
if(XBYTE[0xCFE9]&0x07)//判断是否有按键按下
{
ReadKey();
a=a-192;
display(a); //显示
delay();
switch (a) //根据按键的值显示相应的波形
{
case 1: while(!(XBYTE[0xCFE9]&0x07)) sinbo(); //正弦波
break;
case 2: while (!(XBYTE[0xCFE9]&0x07)) sanjiaobo(); //三角波
break;
case 3: while(!(XBYTE[0xCFE9]&0x07)) fangbo(); //方波
break;
case 4: while(!(XBYTE[0xCFE9]&0x07)) juchibo(); //锯齿波
break;
}
}
}
}
#include <absacc.h>
#define uchar unsigned char//用uchar代替unsigned char
#define uint unsigned int//同上
#define DAC 0xCFB0 //同上
//正弦波的表
uchar code sin[]={0x7f,0x89,0x94,0x9f,0xaa,0xb4,0xbe,0xc8,0xd1,
0xd9,0xe0,0xe7,0xed,0xf2,0xf7,0xfa,0xfc,0xfe,0xff};
//共阴数码管的码表
uchar code SEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar a; //定义一个变量a
//段式数码管的初始化函数
void Init()//8279初始化
{
XBYTE[0xCFE9]=0x00; //4条都是初始化
XBYTE[0xCFE9]=0xD1;
while (XBYTE[0xCFE9]&0x80);
XBYTE[0xCFE8]=0x34;
}
//扫描按键,获取键值
uchar ReadKey() //键盘读值
{
if(XBYTE[0xCFE9]&0x07) //判断有没有按键按下
{
XBYTE[0xCFE9]=0x40;
a=XBYTE[0xCFE8]; //赋值
}
return 0;
}
//数码管显示函数
void display(uchar y)
{
XBYTE[0xCFE9]=0x80;
XBYTE[0xCFE8]=SEG[y];//显示
}
//延时函数
void delay()
{
uchar i;
for(i=0;i<0xa0;i++); //延时0xa0个空指令
}
//三角波函数
void sanjiaobo()
{
uchar i=0;
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;//初始为0
//从0到255
do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i++;
}while(i<0xff);
//从255减到0 ,就是三角波波形
do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i--;
}while(i>0x0);
}
//锯齿波函数
void juchibo()
{
uchar i=0;
while(a==4)
{
XBYTE[DAC]=i++; //从0开始加
XBYTE[DAC+1]=i++;
ReadKey();//读取按键
}
}
//方波函数
void fangbo()
{
XBYTE[DAC]=0x00; //初始是0,延时一会
XBYTE[DAC+1]=0x00;
delay();
XBYTE[DAC]=0xff; //再输出255,输出方波
XBYTE[DAC+1]=0xff;
delay();
}
//正弦波函数
void sinbo()
{
uchar i;
for(i=0;i<18;i++) //循环18次,用查表法,依次加
{
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];
}
for(i=18;i>0;i--) //循环18次,用查表法,依次减
{
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];
}
for(i=0;i<18;i++) //循环18次,用查表法,依次加,输出与上次对称的波形
{
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];
}
for(i=18;i>0;i--) //循环18次,用查表法,依次减,输出与上次对称的波形
{
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];
}
}
//主函数
void main()
{
Init(); //初始化
display(0); //显示0
EX0=1;//开启外部中断
IT0=1; //开启定时器中断
EA=1;//开启总中断
while(1)
{
if(XBYTE[0xCFE9]&0x07)//判断是否有按键按下
{
ReadKey();
a=a-192;
display(a); //显示
delay();
switch (a) //根据按键的值显示相应的波形
{
case 1: while(!(XBYTE[0xCFE9]&0x07)) sinbo(); //正弦波
break;
case 2: while (!(XBYTE[0xCFE9]&0x07)) sanjiaobo(); //三角波
break;
case 3: while(!(XBYTE[0xCFE9]&0x07)) fangbo(); //方波
break;
case 4: while(!(XBYTE[0xCFE9]&0x07)) juchibo(); //锯齿波
break;
}
}
}
}