專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

基于凌陽61單片機的超聲波測距系統(tǒng)軟件設計

作者:浪子   來源:浪子   點擊數(shù):  更新時間:2014年06月10日   【字體:

 #include <SPCE061V004.h>

#include "hardware.h"
# define uchar unsigned char
# define uint unsigned int
void LCD_write_command(uchar  command);//寫指令函數(shù)
void LCD_write_data(uchar  dat);//寫數(shù)據(jù)函數(shù)
void LCD_disp_char(uchar  x,uchar  y,uchar  dat);//在某個屏幕位置上顯示一個字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延時函數(shù) 
unsigned char Key,fg1;
unsigned int fg2;
//
uchar DISP1[]={"TJPU Tongxin064 "};
uchar DISP2[]={"   Gou Jinxing  "};
uchar mode1[]={"  In Short Mode"};
uchar mode2[]={"  In Long Mode "};
uchar TIMER[]={" RUNTIME ERROR! "};
/
void LCD_write_command(uchar dat)
   {uint k;
     *P_IOA_Dir=0xfff0;
     delay_n40us(2);
        *P_IOA_Attrib=0xffff;
        delay_n40us(2);
           k=(uint)(dat<<8);
    k=k&0xff00;
    k=k|0x0020;
    *P_IOA_Data=k;
    k=k&0xff1f;
    *P_IOA_Data=k;
delay_n40us(2);
//********寫數(shù)據(jù)函數(shù)*************
void LCD_write_data(uchar dat)
  {uint k=0;
    *P_IOA_Dir=0xfff0;
    delay_n40us(2);
        *P_IOA_Attrib=0xffff;   
        delay_n40us(2);  
   k=(uint)(dat<<8);
   k=k&0xff00;
   k=k|0x00a0;
   *P_IOA_Data=k;
    k=k&0xff8f;
    *P_IOA_Data=k;
     delay_n40us(2);
}
void LCD_init(void)
{
delay_n40us(37);
LCD_write_command(0x38);//設置8位格式,2行,5x7
 delay_n40us(12);
LCD_write_command(0x38);//設置8位格式,2行,5x7
 delay_n40us(12);
LCD_write_command(0x38);//設置8位格式,2行,5x7
LCD_write_command(0x0f);//整體顯示,關光標,不閃爍
LCD_write_command(0x06);//設定輸入方式,增量不移位
LCD_write_command(0x01);//清除屏幕顯示
delay_n40us(10);
}
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
   address=(y<2)?(0x80+x):(0xC0+x);  
LCD_write_command(address);
delay_n40us(20);//
if(dat>=0&&dat<10)
dat=dat+48;
LCD_write_data(dat);
 delay_n40us(20); 
}
//********************************
 void IRQ3(void)
 {   uint  j;
     float k;
     uchar i,flag[]={"  Successfully  "},rst[16];
       __asm("INT OFF");
       *P_INT_Clear=0x2100;
     *P_INT_Ctrl=*P_INT_Mask&(0x0000);  //屏蔽定時器中斷
       *P_TimerB_Ctrl=0x0006;         //stop timer B;               
        LCD_write_command(0x01);
        j=*P_TimerB_Data;
        k=j*0.0097+8;
        j=(uint)(k);               
        rst[0]=j/10000;   //65536
        rst[1]=j/1000%10;
        rst[2]=j/100%10;       
        rst[3]=j/10%10;
        rst[4]='.';             
        rst[5]=j%10;
        rst[6]='c';
        rst[7]='m';
        rst[8]='T';
        rst[9]='o';
        rst[10]='n';
        rst[11]='g';
        rst[12]='x';
        rst[13]='i';
        rst[14]='n';              
        *P_TimerB_Data=0x0000;
           for(i=0;i<15;i++)
         LCD_disp_char(i,1,rst[i]),
         LCD_disp_char(i,2,flag[i]);
         delay(55500);                            
    }
void FIQ(void)
{  uchar l;   
     __asm("INT OFF");     
   for(l=0;l<15;l++)  
 LCD_disp_char(l,1,TIMER[l]);
 delay(1000);   
 *P_INT_Clear=0x0900; 
}
void measure(uchar n)
  {uint temp;
  __asm("INT OFF");  
  *P_TimerB_Ctrl=0x0006;         //stop timer B;
  temp=*P_IOA_Buffer;
  temp=temp|0x0010;   //P—IOA4口輸出脈沖;
   *P_SystemClock=0x004d;  //32.768M,強震,32分頻,1us,1MHz
   *P_INT_Mask=0x0000;
  while(n--)
   {*P_IOA_Data=temp;
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");
    *P_IOA_Data=temp&0xffef;
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");
    __asm("nop");__asm("nop");   
    __asm("nop");
   }
   delay_n40us(fg2);
   *P_SystemClock=0x005c;          //32.768/16=2.048MHz;
     *P_TimerB_Data=0x0000;          //count from zero,flow when full;
     *P_TimerB_Ctrl=0x0030;         //fosc/2;       
        *P_INT_Mask=0x0900;      //Right ,interrupt mode on ,2100,for timerB      
       __asm("INT FIQ,IRQ"); //
       delay(55000);               
  }
  uchar Getkey(void)
  {uint k0,k1,k; 
   *P_IOA_Dir=0xfff0;
     *P_IOA_Attrib=0xffff;
      k0=*P_IOA_Data;
      delay(1);
      k1=*P_IOA_Data;
      if(k0==k1)    
    {   k0=k0&0x0007;
      switch(k0)
    { case 1:k=1;
      break;
      case 2:k=2;
      break;
      case 4:k=3;
      break;
      default:k=0;break;}
      return(k);}
  }
int main()
{   uchar m;  
   for(m=0;m<15;m++)
      LCD_disp_char(m,1,DISP1[m]),
      LCD_disp_char(m,2,DISP2[m]);
 while(1)
  {   Key = Getkey();     //獲取鍵值
   switch(Key)
   {   case 1: LCD_init();measure(fg1); //KEY1:Start to measure     
    break;
    case 2:     // KEY2: Short mode
    fg1=1;
    fg2=1;
    for(m=0;m<15;m++)
         LCD_disp_char(m,1,mode1[m]);
         delay(55000);             
    break;     
       case 3: //KEY3: Long mode    
       for(m=0;m<15;m++)
       LCD_disp_char(m,1,mode2[m]);
       delay(55000);      
       fg1=12;
       fg2=50000;
       measure(12);
        break;    
        default:
        break;
      }
    }   
}
關閉窗口

相關文章