<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

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

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

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

         #include <SPCE061V004.h>

        #include "hardware.h"
        # define uchar unsigned char
        # define uint unsigned int
        void LCD_write_command(uchar  command);//寫指令函數
        void LCD_write_data(uchar  dat);//寫數據函數
        void LCD_disp_char(uchar  x,uchar  y,uchar  dat);//在某個屏幕位置上顯示一個字符,X(0-16),y(1-2)
        void delay_n40us(uint n);//延時函數 
        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);
        //********寫數據函數*************
        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;
              }
            }   
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮