⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 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 + -