|
#include <reg52.h>
#include <ABSACC.H>
#include <math.h>
#include <lcd12864.h>
#define DAC0832Addr 0x7FFF //DAC0832地址
#define PI 3.14159
#define uchar unsigned char //uchar代表无符号字符
#define uint unsigned int //unit代表无符号整型数据类型
sbit Key1=P2^0; //定义按键 - 用来选择波形
char Wave_flag=0; //波形标志位 0-三角波 1-锯齿波 2-方波 3-正弦波
void KeyScan(void); //按键扫描函数
void Waveform(void); //波形产生函数
void TransformData(uchar c0832data); //数据转换函数 - DA输出
void delay_ms(uint i); //延时函数
void main(void)
{
lcdinit(); //lcd12864初始化
Clear_Screen(); //清屏
Show_Word(); //初始化界面
while(1)
{
KeyScan(); //按键扫描
Waveform(); //产波函数
Display();
}
}
void Waveform(void)
{
uchar cDigital=0;
switch(Wave_flag)
{
/*-- 三角波 --*/
case 0:
/*-- 周期为 (255 + 255) * 1 = 510ms --*/
for(cDigital=0;cDigital<255;cDigital++) //产生三角波下降沿
{
delay_ms(1);
TransformData(cDigital);
}
for(cDigital=255;cDigital>0;cDigital--) //产生三角波上升沿
{
delay_ms(1);
TransformData(cDigital);
}
break;
/*-- 锯齿波 --*/
case 1:
/*-- 周期为 255 * 2 = 510ms --*/
for(cDigital=255;cDigital>0;cDigital--)
{
delay_ms(2);
TransformData(cDigital);
}
break;
/*-- 方波 --*/
case 2:
/*-- 周期为 510ms --*/
cDigital=0;
TransformData(cDigital);
delay_ms(255);
cDigital=255;
TransformData(cDigital);
delay_ms(255);
break;
/*-- 正弦波 --*/
case 3:
/*-- 因为sin函数占用时间未知 周期未确定 --*/
for(cDigital=0;cDigital<100;cDigital++)
{
TransformData( 127 * sin( (2.0 * PI * (float)cDigital) / 100 ) + 127 );
delay_ms(1);
}
break;
}
}
void KeyScan(void)
{
if(Key1 == 0)
{
Wave_flag ++;
while(Key1 == 0);
}
if(Wave_flag>3)Wave_flag=0;
}
void TransformData(uchar c0832data) //数/模转换函数
{
*((uchar xdata*)DAC0832Addr)=c0832data;
}
void delay_ms(uint i) //延时ms函数
{
uint j;
for(;i>0;i--)
{
for(j=110;j>0;j--);
KeyScan();
}
}
|
|