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

📄 main.c

📁 c语言写的哦,里面还带有整点报时音乐,音乐程序很简单
💻 C
📖 第 1 页 / 共 2 页
字号:
//============================================================================
//  工程名称:   bujin.spj  "悬挂控制系统"
//  功能描述:    见使用说明(工程文件夹里)
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.4(or later)
//
//  涉及的库:	SPCE061V004.lib/sacmv25.lib/CmacroB100.lib/clib100.lib
//	硬件连接:  针对配合SPCE061A精简开发板使用   4*4键盘(接IOA0--7)
//  组成文件:
//    	main.c/cbit.c/dianji.c/display.c/IRQ.C/UART.C
//		key.asm/system.asm
//     	hardware.asm/Resource.asm
//		hardware.h/SPCE061V004.H/cbit.H/math.h/stdlib.h/Resource.inc
//  日期:          	2005-9-10(建立)
//					2006-1-7(添加部份使用说明)
//注:编译前先设好以下链接:  prkject--setting--bujing files--link--library modules--(本工程文件夹下的use-lib里的库)
//==============================================================================

#include "SPCE061V004.H"
#include "hardware.H"
#include "cbit.H"
#include "math.h"
#include "stdlib.h" 

#define HaveKey  1
#define NoKey    0

double sqrt(double x);    

void initlcm(void);                  //ST7920字符液晶显示相关子函数(见display.c)
void SendByte(char dat);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void display(char *str);
void dis_12232num(long int b);

extern void UART_Init();            //串口相关子函数(见UART.C)由于时间关系,比赛时没能加入(通过红外进行无线传输)
extern void UartSendByte();         //此部份已能正确接收数据
extern void sendsixteenbit();
unsigned int UartReadByte();

void meterlift(unsigned int cycle);
void meterright(unsigned int cycle);
void meterdergeelift(unsigned int cycle);
void meterdergeeright(unsigned int cycle);

unsigned int starx[9];              //存储从键盘输入的坐标值(x,y)
unsigned int stary[9];
unsigned int nextto=0;

extern	unsigned int uidata=0;
extern	unsigned int round=0;

extern	unsigned int alltime=0;

unsigned int  KeyVal;
unsigned int  KeyFlag;                    //按键标识 
unsigned int  keyadd=0,cot=0; 
unsigned int  xb=0,yb=0; 

unsigned int  degree=0;                   //转运的延时参数
signed int n=0,m=0;

unsigned int shuhai=0;

unsigned int keyy=0,savekey=0;             //黑线参数

unsigned int severdata=0,shuzuchang=0,adxnu=0,adynu=0;

//--圆参数设置----------------------------------
float  circlex=0, circley=0,w=0,X,Y;
float startx=0,starty=0;
float setx=0,sety=0,A=0,B=0;
float n0=0.0,m0=0.0;
int ii,i;
float ms=0,mz=0,mn=0;
//----------------------------------------

void PlayRespond(int Result)                  
{	
    //unsigned int Protect; 
   // Protect = *P_INT_Mask;          //保护*P_INT_Ctrl   
    SACM_A2000_Initial(1);            //初始化,其中*P_INT_Ctrl变为:0x0000
	SACM_A2000_Play(Result, 3, 3);	  //其中*P_INT_Ctrl变为:0x2000
	 
	SACM_A2000_Volume(15);            //音量调节0--15
	
	while((SACM_A2000_Status()&0x0001) != 0)
	{
		SACM_A2000_ServiceLoop();
        *P_Watchdog_Clear=0x0001;   //不加入这句可能会复位	
	}
	SACM_A2000_Stop();	            //*P_INT_Ctrl变为:0x0000
	
	//*P_INT_Mask |= Protect;	
	//*P_TimerA_Ctrl=0x0000;
	//*P_TimerA_Data=0x0000;         //恢复*P_TimerA_Data
	*P_SystemClock=0x000b;            //24.576   /8  强振
	//*P_DAC_Ctrl=0x0000;
	//*P_INT_Clear=0xffff;
	asm("FIQ OFF"); 
}
void Playsoundnum(int soundnum)                //播报数字
{
  if((soundnum/100)>0)
     { 
     PlayRespond(soundnum/100);
     PlayRespond(11);                          //百
     soundnum=(soundnum-(int)(soundnum/100)*100); 
     if(soundnum!=0)
        {
        if((soundnum/10)<1)  PlayRespond(0);     //零
        if((soundnum/10)==1)  PlayRespond(1);    //一
        }        
     }
  if((soundnum/10)>1)  PlayRespond(soundnum/10);
  if((soundnum/10)>0)  PlayRespond(10);          //十
  if((soundnum%10)!= 0)  PlayRespond(soundnum%10);
}

void black()
{
startx=starx[nextto];
starty=stary[nextto];
   for(;severdata>0;severdata--)
   {
nextto=nextto+1;
setx=starx[nextto];
sety=stary[nextto];
     A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
	   *P_Watchdog_Clear=0x0001;
	  B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
    n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-A;
       *P_Watchdog_Clear=0x0001;
    m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-B;
       *P_Watchdog_Clear=0x0001;
   
  if(n0>0)
    n0=n0+0.5;
    else 
     n0=n0-0.5;
   if(m0>0)
    m0=m0+0.5;
    else 
     m0=m0-0.5;       
   n=(int)(n0);
   m=(int)(m0);
   go(); 
   startx=setx;
   starty=sety;   
   *P_Watchdog_Clear=0x0001; 
   }
       while(1)
      { 
             *P_Watchdog_Clear=0x0001;
             }	
	
//=================================================
}


void System_ServiceLoop()
{  
  savekey=*P_IOB_Data;
  keyy=savekey&0x0003;
  switch(keyy)
    {
     case 0x0001:				        	//改 向上    	
      meterlift(1);        //左电机上拉 
      break;	
		 
	 case 0x0002:				        	//改 向下
	   meterdergeeright(1); //右电机下拉	
       meterright(1);       //左电机下拉
       meterright(1);       //左电机下拉
       meterright(1);       //左电机下拉
      break;	
		          
	  default:
	  break;	   
	 }			
    keyy=savekey&0x000c;
  switch(keyy)
	{
	  case 0x0004:				        	//改 向左
	    meterright(1);       //左电机下拉
		meterdergeelift(1);  //右电机上拉
		break;	
		 
	  case 0x0008:				        	//改 向右
		meterlift(1);        //左电机上拉
		break;	
		          	     		          
		default:
		break;	   
	}			 
}	

void hunderd()
{
  if(xb<=40&&yb>=50)
    {
      for(shuhai=0;shuhai<25;shuhai++)
       {
		meterright(1);       //左电机下拉
        meterdergeeright(1); //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;        //清看门狗
        }
        for(shuhai=0;shuhai<25;shuhai++)
       {
        meterright(1);       //左电机下拉
        meterdergeelift(1);  //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;        //清看门狗
        }
        
        for(shuhai=0;shuhai<25;shuhai++)
       {
		meterlift(1);       //左电机上拉
        meterdergeelift(1); //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;        //清看门狗
        }
         for(shuhai=0;shuhai<25;shuhai++)
       {
        meterlift(1);       //左电机上拉
        meterdergeeright(1);  //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;        //清看门狗
        }
    }
  if(xb>40&&yb>50)
    {
     for(shuhai=0;shuhai<25;shuhai++)
       {
		meterright(1);       //左电机下拉
        meterdergeeright(1); //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;        //清看门狗
        }
         for(shuhai=0;shuhai<25;shuhai++)
       {
	     meterlift(1);        //左电机上拉
        meterdergeeright(1);  //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;      
        }
        
        for(shuhai=0;shuhai<25;shuhai++)
       {
		meterlift(1);         //左电机上拉
        meterdergeelift(1);   //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
        
         for(shuhai=0;shuhai<25;shuhai++)
       {
	     meterright(1);        //左电机下拉
        meterdergeelift(1);    //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;        
        }
    }
  if(xb>=40&&yb<=50)
    {
     for(shuhai=0;shuhai<25;shuhai++)
       {
		meterlift(1);          //左电机上拉
        meterdergeelift(1);    //右电机上拉
        
        *P_Watchdog_Clear=C_WDTCLR;      
        }
         for(shuhai=0;shuhai<25;shuhai++)
       {
	      meterlift(1);        //左电机上拉
        meterdergeeright(1);   //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;      
        }
       
        for(shuhai=0;shuhai<25;shuhai++)
       {
			meterright(1);       //左电机下拉
        meterdergeeright(1);     //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
        
         for(shuhai=0;shuhai<25;shuhai++)
       {
	      meterright(1);         //左电机下拉
        meterdergeelift(1);      //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
    }
  if(xb<40&&yb<50)
    {
      for(shuhai=0;shuhai<25;shuhai++)
       {
		meterlift(1);            //左电机上拉
        meterdergeelift(1);      //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;        
        }
         for(shuhai=0;shuhai<25;shuhai++)
       {
	     meterright(1);          //左电机下拉
        meterdergeelift(1);      //右电机上拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
        
        for(shuhai=0;shuhai<25;shuhai++)
       {
	 meterright(1);              //左电机下拉
        meterdergeeright(1);     //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
          for(shuhai=0;shuhai<25;shuhai++)
       {
	     meterlift(1);           //左电机上拉
        meterdergeeright(1);     //右电机下拉
        *P_Watchdog_Clear=C_WDTCLR;       
        }
    }
}

void roundcycle()    //画园
{
  //----------------------------------------------------------------------------  
startx=circlex-25;//求起点位置
starty=circley;
       A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
	   *P_Watchdog_Clear=0x0001;
	   B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
for(ii=30;ii<390;ii=ii+30)
{
       w=ii*3.14159/180;
       X=circlex-25*cos(w);
       *P_Watchdog_Clear=0x0001;
       Y=circley+25*sin(w);
       *P_Watchdog_Clear=0x0001;
	   setx=X;
	   sety=Y;	     
     n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-A;
       *P_Watchdog_Clear=0x0001;
      m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-B;
       *P_Watchdog_Clear=0x0001;
if(circlex>40&circley>50)//误差效准
{
 if(n0>0)
    n0=n0+0.5;
    else 
     n0=n0-0.5;
      
   if(m0>0)
    m0=m0+0.5;
    else 
     m0=m0-0.5;
}
else
{
 if(n0>0)
    n0=n0+0.9;
    else 
     n0=n0-0.9;
      
   if(m0>0)
    m0=m0+0.9;
    else 
     m0=m0-0.9;
} 
     n=(int)(n0);
     m=(int)(m0);
  go();     
   startx=setx;
   starty=sety;
   
    SendCMD(0x0001);                   //清屏
	SendCMD(0x82);   display("圆周坐标:");
	SendCMD(0x90);   display("X: ");  dis_12232num((unsigned int)(setx)); 		      		      
	SendCMD(0x94);   display("Y: ");  dis_12232num((unsigned int)(sety)); 
		      
   A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
  *P_Watchdog_Clear=0x0001;
   B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
   *P_Watchdog_Clear=0x0001; 	
}
//=================================================
}

void ooo()   //从原点出发
{
  n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-115.911;
       *P_Watchdog_Clear=0x0001;
    m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-148.846;
       *P_Watchdog_Clear=0x0001;
   
  if(n0>0)
    n0=n0+0.5;
    else 
     n0=n0-0.5;
      
   if(m0>0)
    m0=m0+0.5;
    else 
     m0=m0-0.5;       
   n=(int)(n0);
   m=(int)(m0);
   go();     
   *P_Watchdog_Clear=0x0001; 	
}

void go()
{
//--------------------------------------------------------
if(n==0)
{
if(m>0)
{
 for(;m>0;m--)
            {
 meterdergeeright(1); //右电机下拉
            }

}
else if(m<0)
{
m=m*(-1);
 for(;m>0;m--)
            {
 meterdergeelift(1);  //右电机上拉
            }

}

}
//------------------------------
else if(m==0)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -