📄 main.c
字号:
//======================================================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//========================================================================================
// 工程名称: Undee.spj
// 功能描述: 利用SPCE061A的D/A产生三角波、方波、正弦波
// 三角波可以调上升沿和下降沿时间
// 方波可以调整高低电平时间(占空比)
// 正弦波可以调频率。
// 文件来源: 《SPCE061单片机原理及应用技术》第八章 凌阳单片机应用及开发技术,第329页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
//
// 涉及的库: CMacro.lib、math.lib
//
// 组成文件: main.c
// FIQ.asm/hardware.asm/key.asm
// hardware.inc/hardware.h
// 日期: 2002-6-12
//===========================================================================================
#include "math.h"
#define TRIANG 1 //三角波
#define SINE 2 //正弦波
#define SQUARE 3 //方波
#define PI 3.1415926
//=========================================
//功能:延时
//入口:循环次数
//出口:无
//=========================================
void delay10ms(tim)
{
int delay;
for(delay=0;delay<tim;delay++)
;
}
unsigned int Key, Mode, Status;
unsigned int Counter,Out_Value,MM; //MM=0,则标志是下降沿,MM=1,则标志是上升沿
//Counter为计算台阶的个数
unsigned long T_High,T_Low; // 例T_High +=10; 上升沿时间增加
unsigned int M1,M2,M_Dir; //M_Dir 1---上升沿 0---下降沿(调整)
//M1上升沿计数初值,M2下降沿计数初值
unsigned int S_H,S_L,S_Dir;
float mx,my;
float mz; //x轴方向的增值变量
int vv;
unsigned int DelTime;
int main()
{
Status=0;
System_Initial();
while(1)
{
Key=KeyScan();
switch(Key)
{
case 0x00:
break;
case 0x01: //三角波
Status = TRIANG; //置为输出三角波状态
T_High = 50; //上升沿时间 50*100us
T_Low = 150; //下降沿时间 150*100us
M1=65535-(12288*T_High)/1000; //上升沿计数初值
M2=65535-(12288*T_Low)/1000; //下降沿计数初值
MM=0; //1---上升沿 0---下降沿
M_Dir=0; //1---上升沿 0---下降沿(调整)
Counter=0;
InitOutTriang();
OutputTriang(M1);
Key=0;
break;
case 0x02: //正弦波
Status = SINE; //置为输出正弦波状态
mz=0;
DelTime=5; //延时值/////////////////////
break;
case 0x04: //方波
Status = SQUARE; //置为输出方波状态
MM=0;
S_H=40; //高电平时间 40*100us
S_L=65; //低电平时间 65*100us
S_Dir=0; //1----高电平 0---低电平(调整)
Counter=0;
Key=0;
InitOutSQUARE();
break;
case 0x08: //时间加按下up键
switch(Status)
{
case TRIANG: //三角波
if(M_Dir==0 && T_Low<0xFFFF)
{
T_Low += 10; //下降沿时间增加
M2=65535-(12288*T_Low)/1000;
OutputTriang(M2);
}
if(M_Dir==1 && T_High<0xFFFF)
{
T_High +=10; //上升沿时间增加
M1=65535-(12288*T_High)/1000;
OutputTriang(M1);
}
break;
case SINE: //正弦波
if(DelTime<200)
DelTime += 10; //延时值增加
break;
case SQUARE: //方波
if(S_Dir ==0 && S_L<0xFFFF) ///////////////
S_L += 10; //低电平时间增加
if(S_Dir ==1 && S_H<0xFFFF)
S_H +=10; //高电平时间增加
break;
}
break;
case 0x10: //时间减
switch(Status)
{
case TRIANG:
if(M_Dir==0 && T_Low>50)
{
T_Low -= 10;
M2=65535-(12288*T_Low)/1000;
OutputTriang(M2);
}
if(M_Dir==1 && T_High>50)
{
T_High -=10;
M1=65535-(12288*T_High)/1000;
OutputTriang(M1);
}
break;
case SINE:
if(DelTime>2)
DelTime -= 10;
break;
case SQUARE:
if(S_Dir ==0 && S_L>50) S_L -= 10;
if(S_Dir ==1 && S_H>50) S_H -=10;
break;
}
break;
case 0x20: //调整状态
switch(Status)
{
case TRIANG:
M_Dir ^= 1; //三角波上升沿或下降沿切换
break;
case SQUARE:
S_Dir ^= 1; //方波高低电平切换
break;
}
break;
default:
break;
} // end of switch(Key)
switch(Status)
{
case TRIANG: //三角波
if(Counter>=100) //上升沿和下降沿都是由100个台阶组成
{
Counter=0;
if(MM == 0)
{OutputTriang(M2); MM=1;} //转至输出下降沿
else
{OutputTriang(M1); MM=0;} //转至输出上升沿
}
break;
case SINE: //正弦波
mx= mz * PI/2; //弧度
my = sinf(mx); //计算sin值
vv= (int) 32736 * my; //换算成D/A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -