• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            #

            求SGU 194即ZOJ 2314題AC代碼

                 摘要: 最近在搞網絡流,剛研究完幾個求最大流的基本算法,今天研究了一下有上下界的可行流問題,參考了大牛ADN.cn的圖論總結,算法倒不是很難,代碼也很快就寫好了,只是不知道原因,就是不能AC,郁悶我一晚上。。。在SGU上 只能過9組數據,也不知道被什么BT的數據給卡住了,希望大牛們能給我點指點。 我用的方法是添加兩個附加源匯,用dinic算法求最大流,如果源匯上的邊滿流,則說明有可行流,輸出每條邊的流量,...  閱讀全文

            posted @ 2009-07-12 01:58 abilitytao 閱讀(639) | 評論 (2)編輯 收藏

            歐幾里德算法及其擴展算法的迭代版本(轉)

            整除和最大公約數。

            如果m能整除n,記m|n

            對于不全為0的兩個整數ab,能同時整除他們倆的最大整數為它們的最大公約數,記為gcd(a,b)。如果gcd(a,b)=1,則ab互質。

            gcd(a,b)可用歐幾里德算法:

            a = q1 * b + r1

            b = q2 * r1 + r2

            r1 = q3 * r2 + r3

            r2 = q4 * r3 + r4

            ……

            rn-3 = qn-1 * rn-2 + rn-1

            rn-2 = qn * rn-1 + rn => rn就是gcd

            rn-1 = qn+1 * rn + 0

            歐幾里德算法非常好寫。以pascal語言為例:

            function gcd(a,b:longint):longint;

            begin

            if b=0 then gcd:=a

            else gcd:=gcd(b,a mod b);

            end;

            線性方程ax+by=c的解法。

            對于ab,ax+byab的線性組合。這里xy可以是任何整數。

            g=gcd(a,b),則g整除所有的ax+by。特別地,所有ax+by的取值中,最小的正值為g

            因此,方程ax+by=c,僅當gcd(a,b)|c時有解。因此只考慮方程ax+by=gcd(a,b)的解法。

            回憶上一章中講的歐幾里德算法,在第i步,我們有

            ri-2 = qi * ri-1 + ri 。若ri+1=0,ri就是gcd。

            假設ri可表示為ab的線性組合(xi,yi),即ri=axi+byi,則有(xi,yi)=(xi-2,yi-2)-qi* (xi-1,yi-1)。

            初始時, 由于a=q1*b+r1,即r1=a-b*q1,由序列{Rn}的通項公式Rn=R(n-2)-R(n-1)*q1,我們可以把a看做r(-1),

            b看做,r0,那么對應于表達式ri=a*xi+b*yi,r(-1)=a=a*1+b*0=(1,0),r0=b=a*0+b*1=(0,1);

            即r-1=a=(1,0),r0=b=(0,1)。這樣便可一步步推出rn=(xn,yn),即為原方程的一組解。

            因此有如下定理:

            ab為非零整數,g=gcd(a,b),則方程

            ax+by=g 總可以通過歐幾里德算法找出一組可行整解,記為(x1,y1)。它的通解可以表示為:

            (x,y)=(x1+k*b/g , y1-k*a/g) ,其中k為任意整數。

            競賽中常用的歐幾里德擴展算法采用的是倒推的方法,相比而言,本章提供的方法需要的變量稍多,常數稍大(只大了一點點)。但由于易于用迭代實現,而且實際測試中兩種算法時間差別十分微小,因此本算法仍有應用價值。

            posted @ 2009-07-10 17:59 abilitytao 閱讀(587) | 評論 (0)編輯 收藏

            傾情奉獻系列之最短路系列(POJ)

                 摘要: 第一部分 Dijkstra 算法POJ 2387 ——Til the Cows Come Home最典型的最短路題目,求兩點間的最短路徑,一次Dij即可,代碼如下: #include<iostream>#include<cmath>#include<cstdio>#include<algorithm>using namespace&nbs...  閱讀全文

            posted @ 2009-07-07 15:39 abilitytao 閱讀(5230) | 評論 (12)編輯 收藏

            POJ 1606-Jugs

                 摘要: 本題的題意大致是:給你兩個容器,指定它們的容量Ca,Cb,還有一個目標容量N;兩個容器初始含水量都是零,問如何配制出容量為N的液體;我的做法很簡單 BFS搜索,不過代碼實在太長   在網上搜了一下 居然有一個500+B的代碼 看得不是很明白 希望有牛人能夠指點一下 //This is the source code for&n...  閱讀全文

            posted @ 2009-07-06 16:38 abilitytao 閱讀(601) | 評論 (1)編輯 收藏

            POJ 1056-IMMEDIATE DECODABILITY 解題報告

                 摘要: 很久不做題目了 今天重新開始做 還頗費了一些時間 呵呵原題鏈接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1056其實這道題 就是哈弗曼編碼的問題 標準的做法是用樹結構來模擬實現,與字典樹的方法還有些神似。首先建立一個深度足夠的滿二叉樹,然后按照長度由長到短的順序,往里面添加路徑(一邊添加一邊檢查是不是前綴碼),即0,往左走,1,往右走,把走過的所有...  閱讀全文

            posted @ 2009-07-06 13:42 abilitytao 閱讀(1082) | 評論 (0)編輯 收藏

            偏愛——張蕓京

            把昨天都作廢 現在你在我眼前
            我想愛 請給我機會
            如果我錯了也承擔 認定你就是答案
            我不怕誰嘲笑我極端

            相信自己的直覺
            頑固的人不喊累
            愛上你 我不撤退

            我說過 我不閃躲 我非要這麼做
            講不聽 也偏要愛 更努力愛 讓你明白
            沒有別條路能走 你決定要不要陪我
            講不聽 偏愛 靠我感覺愛
            等你的依賴 對你偏愛
            痛也很愉快

            把昨天都作廢 現在你在我眼前
            我想愛 請給我機會
            如果我錯了也承擔 認定你就是答案
            我不怕誰嘲笑我極端

            相信自己的直覺
            頑固的人不喊累
            愛上你 我不撤退

            我說過 我不閃躲 我非要這麼做
            講不聽 也偏要愛 更努力愛 讓你明白
            沒有別條路能走 你決定要不要陪我
            講不聽 偏愛 靠我感覺愛
            等你的依賴


            不后悔 有把握 我不閃躲 我非要這麼做
            講不聽 也偏要愛 更努力愛 讓你明白
            沒有別條路能走 你決定要不要陪我
            講不聽 偏愛 靠我感覺愛
            等你的依賴 對你偏愛 愛
            痛也很愉快

            posted @ 2009-06-28 20:36 abilitytao 閱讀(370) | 評論 (0)編輯 收藏

            VC下顯示位圖的幾種方法(轉)

            總結一下關于位圖的幾種用法。
            說到這還是開頭給大家介紹一下,有關位圖的知識吧,以及對于我們比較有用的幾個關于位圖的結構體。
            一.位圖結構如下:
             

            ---- 一、BMP文件結構
            ---- 1. BMP文件組成
            ---- BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。
            ---- 2. BMP文件頭
            ---- BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。
            ---- 其結構定義如下: 
            typedef struct tagBITMAPFILEHEADER
            {
            WORDbfType;   // 位圖文件的類型,必須為BM
            DWORD   bfSize;   // 位圖文件的大小,以字節為單位
            WORDbfReserved1;  // 位圖文件保留字,必須為0
            WORDbfReserved2;  // 位圖文件保留字,必須為0
            DWORD   bfOffBits; // 位圖數據的起始位置,以相對于位圖
            // 文件頭的偏移量表示,以字節為單位
            } BITMAPFILEHEADER;
            ---- 3. 位圖信息頭 
            BMP位圖信息頭數據用于說明位圖的尺寸等信息。
            typedef struct tagBITMAPINFOHEADER{
               DWORD  biSize;   // 本結構所占用字節數
               LONGbiWidth;  // 位圖的寬度,以像素為單位
               LONGbiHeight; // 位圖的高度,以像素為單位
               WORD   biPlanes; // 目標設備的級別,必須為1
               WORD   biBitCount// 每個像素所需的位數,必須是1(雙色),
              // 4(16色),8(256色)或24(真彩色)之一
               DWORD  biCompression;   // 位圖壓縮類型,必須是 0(不壓縮),
              // 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
               DWORD  biSizeImage; // 位圖的大小,以字節為單位
               LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數
               LONGbiYPelsPerMeter;  // 位圖垂直分辨率,每米像素數
               DWORD  biClrUsed;// 位圖實際使用的顏色表中的顏色數
               DWORD  biClrImportant;// 位圖顯示過程中重要的顏色數
            } BITMAPINFOHEADER;
            ---- 4. 顏色表 
                顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
            typedef struct tagRGBQUAD {

            BYTErgbBlue;// 藍色的亮度(值范圍為0-255)
            BYTErgbGreen;   // 綠色的亮度(值范圍為0-255)
            BYTErgbRed; // 紅色的亮度(值范圍為0-255)
            BYTErgbReserved;// 保留,必須為0
            } RGBQUAD;
            顏色表中RGBQUAD結構數據的個數有biBitCount來確定:
            當biBitCount=1,4,8時,分別有2,16,256個表項;
            當biBitCount=24時,沒有顏色表項。
               位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下:
            typedef struct tagBITMAPINFO {
               BITMAPINFOHEADER bmiHeader;   // 位圖信息頭
               RGBQUAD  bmiColors[1];  // 顏色表
            } BITMAPINFO;
            下面我們介紹第一種辦法:
            //第一種方法,使用WM__CTRLCOLOR來實現
            /*******************OnCtlColor中添加的代碼*****************/
            HBRUSH CDemoBitmapDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
            {
             HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
             
             // TODO: Change any attributes of the DC here
             //第一種實現方法
             if(nCtlColor=CTLCOLOR_DLG)
             {
              return brush;
             }
             // TODO: Return a different brush if the default is not desired
             return hbr;
            }

            BOOL CDemoBitmapDlg::OnInitDialog()
            {
             //第一種方法,使用wm_ctlcolor來實現
             CBitmap bitmap;
             bitmap.LoadBitmap(IDB_BITMAP1);
             brush.CreatePatternBrush(&bitmap);//brush定義在頭文件中CBrush burush
             bitmap.deleteobject();
            }
            第二種方法使用資源文件中導入的IDB_BITMAP來實現
            第一步先在資源中導入一個位圖:IDB_BITMAP1
            void CDemoBitmapDlg::OnBtnBitmap()
            {
             // TODO: Add your control notification handler code here
             /***************顯示BITMAP的第二種方法**********************/
             HBITMAP hBitmap;
             CBitmap bitmap;
             CClientDC *pDC;
             pDC=new CClientDC(this);
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             bitmap.Attach(hBitmap);
             CDC CDCompatible;
             CDCompatible.CreateCompatibleDC(pDC);//創建兼容DC
             CDCompatible.Selectobject(&bitmap);
             /*********其它幾種顯示方式********/
            /* pDC->BitBlt(0,0,200,200,&CDCompatible,0,0,SRCCOPY);
             CDCompatible.SetBkMode(TRANSPARENT);
             pDC->StretchBlt(0,0,352,288,&CDCompatible,0,0,352,288,SRCCOPY);
                CDCompatible.CreateCompatibleDC(this->GetDC());
                CDCompatible.Selectobject(&bitmap); */ //選擇繪圖對象
             BITMAP bmp;
             bitmap.GetBitmap(&bmp);
                pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&CDCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
                CDCompatible.deleteDC(); 
                ::deleteobject(&bitmap);
            }
            第三種方法是通過讀取指定目錄中的位圖文件來顯示(這里分別把它們顯示在Picture控件和Static上面這也是大家通常要用到的):
            void CDemoBitmapDlg::OnBtnPic()
            {
             // TODO: Add your control notification handler code here
             /****************向PICTURE控件中動態添加位圖****************************/
             HBITMAP hBitmap;
             CBitmap bitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             bitmap.Attach(hBitmap);
             m_Pic.SetBitmap(hBitmap);

            }
            /****************在STATIC中顯示位圖*********************/
            void CDemoBitmapDlg::OnBtnStatic()
            {
             // TODO: Add your control notification handler code here
             CBitmap hbmp;
             HBITMAP hbitmap;
             //將pStatic指向要顯示的地方
             CStatic *pStaic;
             pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
            // pStaic=(CStatic*)GetDlgItem(IDC_BUTTON1);
             //裝載資源 MM.bmp是我的一個文件名,用你的替換
             hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"NetFriend.bmp",
              IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             
             hbmp.Attach(hbitmap);
             //獲取圖片格式
             BITMAP bm;
             hbmp.GetBitmap(&bm);
             CDC dcMem;
             dcMem.CreateCompatibleDC(GetDC());
             CBitmap *poldBitmap=(CBitmap*)dcMem.Selectobject(hbmp);
             CRect lRect;
             pStaic->GetClientRect(&lRect);
             //顯示位圖
             pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),  &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
             dcMem.Selectobject(&poldBitmap);
            }
            /*****************向BUTTON中添加ICON*****************************/
            //方法和導入其它位圖類似,在這里就只做一個說明一下就是了。
            HICON hIco;
             hIco=AfxGetApp()->LoadIcon(IDI_ICON1);
             m_BtnBitmap.SetIcon(hIco);
            第四種讀取位圖文件來顯示位圖:
            void CDemoBitmapDlg::OnBtnBtmfile()
            {
             // TODO: Add your control notification handler code here
             /*******************通過讀取位圖文件來顯示位圖**********************/
             CString strFileName;
             strFileName.Format("%s","NetFriend.bmp");
             //成位圖信息BITMAPINFO
             BITMAPINFO *bitmapinfo=NULL;
             BYTE *BmpData=NULL;
             CFile file;//讀取位圖信息
             //設置文件的打開方式
             if(!file.Open(strFileName,Cfile::modeRead|Cfile::typeBinary))
             {
              return;
             }
             //BITMAP文件頭結構體
             BITMAPFILEHEADER BitmapHead;
             //讀取位圖文件頭
             if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
             {
              MessageBox("讀取文件頭失敗!");
              return;
             }
             if(BitmapHead.bfType!=0x4d42)
             {
              MessageBox("對不起,您讀取的不是位圖文件!");
              return;
             }
             //位圖信息
             BITMAPINFOHEADER  BitmapInfo;
             if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
             {
              MessageBox("讀取位圖信息失敗!");
              return;
             }
             if(BitmapInfo.biBitCount!=24)
             {
              MessageBox("對不起,當前程序只支持24位位圖信息!");
              return;
             }
             bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
             if(!bitmapinfo)
             {
              MessageBox("內存分配失敗!");
              return;
             }
             /*把BMP位圖信息頭中的數據讀取到位圖信息結構中去.*/
             memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
             /*用來得到位圖文件的大小*/
             DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
             BmpData=(BYTE*)new char[dataByte];
             if(!BmpData)
             {
              MessageBox("內存分配失敗!");
              delete bitmapinfo;
              delete BmpData;
              return;
             }
             if(file.Read(BmpData,dataByte)!=dataByte)
             {
              MessageBox("讀取位圖數據失敗!");
              return;
             }
             file.Close();
             CClientDC *pDC=new CClientDC(this);
             pDC->SetStretchBltMode(COLORONCOLOR);
             StretchDIBits(pDC->GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight,  0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
            }
            最后給大家介紹兩個顯示位圖的特效的例子更多的特效顯示(http://www.pconline.com.cn/pcedu/empolder/gj/vc/0504/608259.html):
            1> 水平交錯顯示位圖
            void CListBmap::OnButton1()
            {
             // TODO: Add your control notification handler code here
             HBITMAP hBitmap;
             CBitmap cBitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",  IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             cBitmap.Attach(hBitmap);
             cBitmap.GetBitmap(&bitmap);
             int i=0,j=0;
             CClientDC *pDC=new CClientDC(this);
             CDC memDC;
             memDC.CreateCompatibleDC(GetDC());
             memDC.Selectobject(&cBitmap);
             for(i=0;i<bitmap.bmHeight;i+=2)
             {
              j=i;
              while(j>0)
              {
               pDC->StretchBlt(0,j-1,bitmap.bmWidth,1,&memDC,0,bitmap.bmHeight-(i-j+1),    bitmap.bmWidth,1,SRCCOPY);
               pDC->StretchBlt(0,bitmap.bmHeight-j,bitmap.bmWidth,1,&memDC,0,i-j,    bitmap.bmWidth,1,SRCCOPY);
               j-=2;
              }
              Sleep(50);
             }

            }

            2>雨點顯示:
            void CListBmap::OnButton2()
            {
             // TODO: Add your control notification handler code here

             HBITMAP hBitmap;
             CBitmap cBitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",  IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             cBitmap.Attach(hBitmap);
             cBitmap.GetBitmap(&bitmap);
             int i=0,j=0;
             CClientDC *pDC=new CClientDC(this);
             CDC memDC;
             memDC.CreateCompatibleDC(GetDC());
             memDC.Selectobject(&cBitmap);
             for ( i=0; i<=bitmap.bmHeight; i++ )  
             {
              for ( j=0; j<=bitmap.bmHeight-i; j++ ) 
               pDC->StretchBlt( 
               0,j, 
               //目標設備邏輯橫、縱坐標 
               bitmap.bmWidth,1, 
               //顯示位圖的像素寬、高度
               &memDC, 
               //源位圖設備情境對象
               0,bitmap.bmHeight-i, 
               //源位圖的起始橫、縱坐標 
               bitmap.bmWidth,1, 
               //源位圖的像素寬、高度 
               SRCCOPY); 
              Sleep(20); 
             }
            }

            轉自:http://blog.csdn.net/xyshu/archive/2008/08/20/2802162.aspx

            posted @ 2009-06-14 14:37 abilitytao 閱讀(561) | 評論 (0)編輯 收藏

            AT89C51SND1(MP3核心器件)

            主要內容:
            本文介紹了以AT89C51SND1為核心的MP3播放器設計開發步驟,詳細分析了MP3各個環節的功能實現,給出了多種實現其功能的方案。具體以AT公司提供的方案為例,詳細作了分析,并介紹了關于AT89C51SND1在系統程序燒寫的方法,以及MP3實現其功能的各種操作方法。

            關鍵詞:

            功能簡介 系統分析設計 外部通訊 FAT文件 程序燒寫

            簡述:
            隨著科技的進步,MP3播放器已成為現代消費者首選的隨身聽產品,它以小巧玲瓏的體積,精美的外形,低廉的價格及其強大的功能深得消費者的厚愛。這同時也引起了DIY發燒者的興趣,他們不惜高價買進元器件,以自己組裝的MP3為榮。國際上很多芯片制造商看準商機,開發出以自己生產的芯片為核心的MP3方案,并公布于眾,這些核心芯片包括:ATJ-207X系列,AT9015系列,AT161系列,STMP341X系列等。其中,以ATMEL公司生產的AT89X51SND1系列芯片最為著名,這就包括AT89C51SND1.

            功能強大的AT89C51SND1
            AT89C51SND1單片機是ATMEL公司專門針對開發MP3而設計的,其主要特點是內部集成了MPEG2解碼器和USB通訊接口,內含64k的內部程序存儲器,支持在系統編輯ISP功能,通過USB或者串行口對芯片進行編程操作,內部數據存儲器為2056字節。它最高支持20MHz的工作頻率,工作電壓為3V,內部集成的MPEG2解碼功能支持48,44.1,32,24,22.05及16赫茲的采樣序列,可直接與DAC音頻轉換芯片連接,支持USB1.1協議全速引擎,并提供相應的鍵盤中斷、IDE/ATATPI /MMC及ISP接口。

            系統分析設計:

            目前MP3DIY主要有兩種方案:使用DSP裝配和使用專用MP3開發芯片。
            DSP系統硬件設計麻煩,程序難以理解,購買DSP芯片的價格也較高,這些使MP3DIY愛好者們不約而同的選擇了后一種方法。
            國內流行的DIY方案很多,使用的專用芯片也是多種多樣,但大部分方案整體上大致相同。以AT89C51SND1為核心的MP3系統主要實現一個MP3播放器的功能,整個系統由AT89C51SND1(MCU)、K9F1208UDF(FLASH芯片)或硬盤、音頻轉換部分、USB接口、外部控制、串行通訊、電源部分和錄音部分組成。

            MCU部分:即AT89C51SND1,控制整個系統,提供USB控制和MP3解碼功能;
            存儲器:作為MP3播放文件的存儲器;
            音頻轉化部分:將數據流轉化成聲音信號;
            外部控制:對MP3進行操作的外部中斷按鍵;
            通訊系統:包括USB及串口通訊。
            外部顯示:包括了LED發光管指示燈,液晶顯示屏等。
            電源部分: 為MP3提供所需要的電能;
            外部音頻輸入部分:包括音頻輸入元件MIC及A/D轉換芯片

            下面我們具體來了解一下由ATMEL公司在網上公開提供的一款以AT89C51SND1為核心的MP3方案(以下稱小板方案)。

            電源部分:
            整個開發板上的芯片統一采用3.3V供電,對開發板的供電采用兩種形式:USB供電和電池供電

            USB接口提供5V電壓和200mA電流,Imax=500mA, AT89C51SND1C所需的電壓為3V(偏差10%),25mA。若使用USB口供電,需將5V轉化成3.3V。一般可以采用電阻分壓和DC-DC芯片降壓。因為MP3屬于高速信息傳輸數碼產品,能否有一個良好的電源對MP3使用的穩定性來說至關重要,因此一般采用芯片降壓的供電方案,本方案選用的芯片為A1117,它輸入電壓為4.75-10V,最大輸出電流為800mA,轉換后輸出電壓為3.3V,是比較理想的USB電平轉換芯片。

            電池供電可采用兩種方式:直接串接電池法和高頻振蕩升壓法
            前一種用兩節1.5V的電池串聯形成3V的電壓直接接入MP3,這種方法不需要什么外圍電路,芯片工作正常,但普通電池壓降比較明顯,當電池使用一段時間后,壓降后的電壓會導致MP3長期工作于不穩定的低壓狀態,對其音質和機體有很大的損害。

            后一種則將1.5V的電壓經高頻振蕩后送入電平轉換芯片,將其轉換成3.3V電壓。這種方法是目前最常用的電源技術,它只需要一節電池供電,占用體積小,由于電壓是經過高頻振蕩后轉化而來的,所以電池的壓降不會影響最終輸出的電壓,這也大大延長了電池的使用壽命,真正做到節能,是現代各種隨身產品的首選供電方式。

             


            在小板方案中,其電源轉換主要是由SP6641(直流推進轉換器)和SP6231(萬用串列總線外圍設備)構成,電路中,場效應管SI2312DS與按鍵SW5構成了電源開關控制電路,每觸發一下SW5,SI2312DS將作導通和斷開電源,電感L1和肖特基二極管BAT54S構成高頻振蕩電路,它將高頻電流送入SP6231處理后,再由它送入SP6641進行直流電壓轉換,最終將3.3V電壓送至整個設備。


            直流電源]和數字電源的區別:在一些數字電路中,我們會發現會有DVDD(數字電源)和AVDD(模擬電源)兩種電源,在小板方案中也不例外,這是因為一些芯片制造商在設計芯片時,為了讓芯片工作于一個穩定的環境里,特意為其設計了專用電源DVDD。原則上,數字電源與模擬電源沒有什么大的區別,但模擬電源工作的環境中,可能會出現大的壓降或其他影響整個電源的情況。為保證系統的穩定性,通常在設計時,將數字電源和模擬電源分開設計,最后用一跳線將兩個電源連接在一起,這樣可以避免模擬電源對數字電源的影響,以保證系統的穩定性。
            外部通訊系統:


            外部通訊系統主要由USB通訊和串口通訊兩種通訊方式,通過他們都可以進行程序燒寫(51SND支持系統在線編輯功能),但通過USB接口還可進行文件的存儲,即具有U盤通訊功能,所以一般直需要完成USB通訊接口就可以了。
            串口通訊的實現:和其他的單片機串口通訊一樣,要使用MAX232進行TTL電平轉換,然后直接將信號送入51SND1的25,26腳(串行通訊接口),通過51SND1內部的程序支持和計算機上的軟件來完成串口的信息通訊,串口通訊需要注意波特率問題,選用不當的波特率有可能造成通訊失敗,最常用的波特率是9600和19200。


            USB接口的實現則是通過51SND1自帶的USB1.1協議通訊端口,它不需要使用飛利浦等公司生產的USB接口轉換芯片,此方案則是通過兩個27歐姆的電阻后直接接入51SND的21,22腳,這兩個電阻的阻值是官方站對自己所開發的芯片提供的,最好使用精度高的電阻,否則,會因為電阻分壓不當而導致計算機無法識別51SND芯片。該方案中,有一PNP三級管2N2907,它的作用是作為一個開關,在實現U盤功能時,I/O口將硬件響應信號送入三極管的基極,使其CE導通,電源VDD通過1.5K電阻拉高USB的D+端口電位,以告知計算機有新的硬件接入。我們在設計電路時,通常在三極管CE上設一跳線開管,在燒寫MP3程序時,需手動拉高D+口電位。

             

            外部音頻輸入部分:

            89C51SND1芯片提供了外部錄音功能,在程序的支持下,通過外部設備MIC及其模數轉換芯片向其送入音頻信息,51SND1將其轉化成WAV文件后保存在存儲器中,通過MP3放音功能可將其音頻信息讀出。該方案中,實現MIC到CPU轉換的是MAXIM公司生產的MAX4468(增益帶寬涌流器), 它的主要功能是將MIC的信號放大,并將其轉化成數字信息,通過CPU將數字信息儲存在存儲器中,從而實現MP3的錄音功能。

            mp3音頻轉換部分:

            AT89C51SND1支持PCM和I2S兩種音頻結構,音頻數據流可以來自MP3解碼的輸出,也可以來自MCU直接的音頻輸出,和MP3解碼部分類似,整個音頻部分和51內核也通過5個寄存器來進行數據和控制信息的交流,這5個寄存器是:

            1.音頻接口控制寄存器0 AUDCON0 (AUDIO INTERFACE CONTROL REGISTER 0)
            2.音頻接口控制器 1 AUDCON 1 ( AUDIO INTERFACE CONTROL REGISTER 1 )
            3.音頻接口狀態寄存器 AUDSTA (AUDIO INTERFACE STATUS REGISTER)
            4.音頻接口數據寄存器 AUDDAT (AUDIO INTERFACE DATA REGISTER)
            5.音頻時鐘分頻寄存器 AUDCLK (AUDIO CLOCK DIVIDER REGISTER )

            當音頻數據的第一位送入DA轉換器的時候就會產生時鐘信號。從MP3解碼器送出的數據被送入MP3緩沖器,MP3的解碼數據緩存和解碼器通過一個握手信號進行通訊,可以通過AUDCON1寄存器中的DERQEN位來決定是否需要數據。

             

            存儲器:


            目前市場上的MP3,其存儲器是多種多樣的,按照其存儲器的不同,大致可分為:FLASH芯片存儲,CF卡存儲和硬盤存儲三種。當然,不能否認還有一些使用的是碟片或者其它芯片存儲。

            FLASH芯片存儲的MP3最常見,因為其體積小,存儲速度快,耗電省等特點,已成為現在MP3存儲器的首選(目前市場上的大部分MP3都使用這種存儲器),本方案使用的FLASH存儲器是韓國三星公司生產的K9F系列FLASH存儲器,這些存儲器從16M到256M不等,但價格比較高,一片64M的芯片售價是130元左右,256M的售價300多元,用戶可根據需要來選擇,但選用不同的FLASH芯片時,應注意程序兼容的問題,比如設定存儲器的大小,FLASH存儲器讀出和寫入的入口地址等等。

            CF卡存儲器最早應該是應用在數碼相機上,它的特點是支持插拔,更換碟片容易,市場上很容易買到,其價格也比較便宜。這類MP3在市場上不常見,因為其體極大,存儲量又不如硬盤,常用于數碼攝像機機帶MP3功能的存儲器。但因為CF卡價格便宜,多為DIY者選用。

            上邊介紹的兩種存儲器存儲量遠遠滿足不了需要,于是人們便把目光投向了硬盤。一些公司看準商機,生產出專門用于MP3的微型硬盤,它的容量大小從幾個G到幾十個G,但此類MP3 目前售價較高,使很多MP3愛好者望塵莫及。在MP3DIY一族里,已經有不少高手使用普通硬盤完成了硬盤MP3,使用的CPU正是51SND1。51SND1與硬盤通訊的方法多種多樣,最常用的方法是利用鎖存器74373和38譯碼器74138作為接口擴展,32KRAM62256作為緩沖器與硬盤的IDE接口連接,由于硬盤需使用12V和5V兩種電源,其耗電量也非常大,不適合隨身攜帶,所以大部分DIY的硬盤MP3多是以臺式的方式出現,并配上了液晶顯示及功放電路。

            用硬盤作為MP3的存儲器要比使用FLASH芯片和CF卡復雜的多,不僅僅要了解硬盤接口的定義,在編寫驅動程序時,還要完全讀懂FAT文件,這個文件包括軟盤數據的邏輯存儲、硬盤中的數據組織、硬盤主引導記錄(DBR)及其結構、引導記錄及其結構、文件分配表FAT、文件目錄表、分區表等等。要想完全看懂這些東西,必須要對計算機原理作充分的了解,理清程序算法,這些不亞于學好幾門高等數學。在國內的DIY人群中,能看懂FAT文件,寫出硬盤驅動的人也寥寥無幾,大部分DIY者是使用別人寫好的HEX文件。正因為這個原因,51SND1控制硬盤的源程序到目前還沒有公開。若讀者對此感興趣,可到21IC網去下載硬盤FAT文件作具體分析,在此不多作介紹。

             


            工作指示部分:

            市場上的MP3都有一個漂亮的液晶屏來顯示工作狀態,如果自己DIY,所要使用的液晶屏都必須含驅動電路,其體積過大不易攜帶,所以大部分DIY者將這一部分省下了,取而代之的是4個LED發光管。通過程序控制,4個發光管分別表示不同的狀態,由4個按鍵來控制整個MP3的工作過程。

            程序部分:
            MP3的強大功能與其程序是分不開的,沒有合適的程序任何一個硬件都無法工作,關于MP3的程序設計在網上和一些相關的書籍上都有介紹,如果對其感興趣,可到網上下在源程序研究,也可下在編譯過的HEX程序直接進行燒寫。


            程序燒寫:
            前面已經介紹過,89C51SND1具有在系統編譯功能,可用ISP端口控制,通過USB口或串口進行燒寫,下面就一些程序燒寫問題進行介紹:

            1. 安裝89C51SND1的在系統燒寫軟件flip2.2。

            2. 通過開始菜單運行InstUsb.exe(建議在開始菜單中運行,否則會出現路徑找不到,系統建議用2000,xp兼容性太差。)

             

            3.將PCB板上的ISP接地,USB的D+電位拉高(即短接三極管CE兩腳),注意一定要過1.5K電阻,否則硬件不能被識別。


            4.連接USB線(或串口線),出現硬件響應后選擇自動安裝程序。

            5.打開flip2.2,選擇芯片為AT89C51SND1,連接方式為USB(或串口)。

            6.將SBV中的F0改為FC,調入所要燒寫的HEX文件(文件所在路徑中不能含有中文)。


            7.進行燒寫后,即可完成自己的MP3。

            Mp3功能操作:
            本方案中共有4個按鍵:
            S1: 播放/停止/確定鍵
            S2: NEXT鍵
            S3: BACK鍵
            S4: 功能選擇鍵

            其指示燈也表示4種狀態:
            L1: 播放指示燈/音量大小
            L2: 錄音指示燈/高音
            L3: U盤聯機指示燈/中音
            L4: 格式化指示燈/低音

            用選擇鍵選取相應功能的指示燈按確定鍵即可實現其功能,在播放過程中,可用S2和S3來選擇上一首和下一首歌曲。若在播放中按選擇鍵,播放指示燈便會高速閃爍,此時可按S2和S3控制音量大小,若繼續按選擇鍵,可依次調節高、中、低音效控制。

            U盤功能:停止播放歌曲,選擇U盤聯機功能,按確定即可作為U盤使用,在此可為MP3增加歌曲和存儲其它文件。

            注:U盤功能在2000以上系統免驅,其它系統必須到ATMEL公司的網站下載相應的驅動程序。


            總結:
            本文系統的介紹了關于ATMEL公司生產的89C51SND1芯片開發MP3功能的方法,但對于89C51SND1來說,實現MP3只是它強大功能的一部分,還需要廣大DIY愛好者深入開發,但51SND還有很多不足之處。有不少使用者反映,89C51SND1的數據傳輸速度跟不上,用其開發硬盤MP3易出現聲音 斷斷續續的。除此以外,51SND1的穩定性也不好,長期的上電掉電會導致51SND1內部程序混亂,更有甚者成為“老年癡呆癥患者”。但51SND1強大的功能早已彌補了這一點的不足,在當今MP3DIY愛好者中,89C51SND1仍然是裝備MP3的首選芯片。

             

            參考資料:
            《51系列單片機高級實例開發指南》 作者:李軍 北京航空航天大學出版社
            AT89C51SND1芯片說明 ATMEL www. ATMEL .com
            AT89C51SND1硬件電路設計 ATMEL www. ATMEL .com
            AT89C51SND1控制硬盤硬件電路 藍牙 www. mp3DIY .com
            EMU控制硬盤方案 未知 www. 21IC .com
            硬盤FAT資料 未知 www.21IC.com
            MP3程序燒寫資料 未知 安然技術論壇

            posted @ 2009-06-06 23:54 abilitytao 閱讀(1407) | 評論 (0)編輯 收藏

            Setimer和Ontimer的使用(轉)

            關于OnTimer()函數的填寫,對于CDialog,可以Ctrl+W中添加;

            對于SetTimer可以在初始化當中添加!

            OnTimer()函數是響應用SetTimer()函數設定的時鐘發送的時鐘消息的,你沒設定時鐘,就不會有時鐘消息,OnTimer()里的語句當然也不會被調用。

            為類添加VM_TIMER消息響應,會看到類中多了個OnTimer(UINT nIDEvent)。
            然后用SetTimer(1,10,NULL)就行了。第一個參數是ID,第二個是間隔時間,單位是毫秒,第3個是響應函數,因為要在OnTimer(UINT nIDEvent)里面做響應操作,所以此處給個NULL就行了

            Timer事件,即定時器事件,是在游戲編程中,經常使用的一個事件。借助它可以產生定時執行動作的效果。這篇文章,就和大家一起探討一下如何使用SetTimer()函數。
            1、SetTimer定義在那里?

            SetTimer表示的是定義個定時器。根據定義指定的窗口,在指定的窗口(CWnd)中實現OnTimer事件,這樣,就可以相應事件了。

            SetTimer有兩個函數。一個是全局的函數::SetTimer()

            UINT SetTimer(
            HWND hWnd, // handle of window for timer messages
            UINT nIDEvent, // timer identifier
            UINT uElapse, // time-out value
            TIMERPROC lpTimerFunc // address of timer procedure
            );

            其中hWnd 是指向CWnd的指針,即處理Timer事件的窗口類。說道窗口類(CWnd),我們有必要來看一下CWnd的繼承情況:CWnd有以下子類:CFrameWnd,CDialog,CView,CControlBar等類。這也意味這些類中都可以定義SetTimer事件。

            同時,SetTimer()在CWnd中也有定義,即SetTimer()是CWnd的一個成員函數。CWnd的子類可以調用該函數,來設置觸發器。

            UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );

            參數含義:

            nIDEvent:是指設置這個定時器的iD,即身份標志,這樣在OnTimer()事件中,才能根據不同的定時器,來做不同的事件響應。這個ID是一個無符號的整型。

            nElapse

            是指時間延遲。單位是毫秒。這意味著,每隔nElapse毫秒系統調用一次Ontimer()。

            void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)

            Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object。

            意思是,指定應用程序提供的TimerProc回調函數的地址,來處里這個Timer事件。如果是NULL,處理這個Timer事件的定義這個Timer的CWnd對象。他將WM_TIMER消息傳遞給這個對象,通過實現這個對象的OnTimer()事件來處理這個Timer事件。

            所以,一般情況下,我們將這個值設為NULL,有設置該定時器的對象中的OnTimer()函數來處理這個事件。

            同樣的,我們再看看KillTimer()和OnTimer()的定義:

            KillTimer同SetTimer()一樣,他也有兩個,一個是全局的::KillTimer(),另一個是CWnd的一個函數。他的聲明如下:


            //全局函數

            BOOL KillTimer(
            HWND hWnd, // handle of window that installed timer
            UINT uIDEvent // timer identifier
            );

            //CWnd函數

            BOOL KillTimer( int nIDEvent );

            這兩個函數表示的意思是將iD為nIDEVENT的定時器移走。使其不再作用。其用法如同SetTimer()一樣。

            再看看OnTimer()

            CWnd::OnTimer
            afx_msg void OnTimer( UINT nIDEvent );

            ontimer()是響應CWnd對象產生的WM_Timer消息。nIDEvent表示要響應TIMER事件的ID。

            2、Timer事件的使用:

            由以上的分析,我們應該很清楚,如何來使用Timer事件。假定我們在視圖上畫一個漸變的動畫。我們首先在菜單欄上添加一個菜單項,給這個菜單添加命令響應:

            pView->SetTimer(1,1000,NULL);//pView是視圖類的指針,這里是在視圖類當中設置一個定時器。

            添加完畢,再給視圖類添加一個WM_Timer事件的相應。在OnTimer()函數中編寫漢書,進行相應。

            如此,就能做出動畫。

            posted @ 2009-06-02 00:09 abilitytao 閱讀(10494) | 評論 (0)編輯 收藏

            坦克究竟該怎么寫嘛?

            這學期學了MFC,期末老師布置我們寫個游戲。我選了坦克大戰,上課的時候覺得老師講的挺簡單的,都能聽懂,但是真正寫起來卻發現自己無從下手了,我個人的設計思路是這樣的:
            首先寫個坦克類,里面有坦克的坐標,速度,還有裝載的位圖。再寫個子彈類,每個坦克里面包含一顆子彈。
            寫消息映射,上下左右,分別控制坦克移動,空格鍵發射子彈;任何一個消息事件,均觸發重繪,將屏幕刷新;

            可是,之后該怎么辦,我就無從下手了,因為,還有敵方的坦克,我的子彈打出去,地方坦克難道就不動了嗎?這顯然不可能啊~更何況,敵方坦克的AI要怎么寫呢?我想,可能是由于上課的時候很多消息都沒有學到造成的吧,不知道有沒有牛人可以指點我一下呢。
            感激不盡~

            posted @ 2009-06-01 12:59 abilitytao 閱讀(506) | 評論 (2)編輯 收藏

            僅列出標題
            共42頁: First 28 29 30 31 32 33 34 35 36 Last 
            国产精品久久久久一区二区三区| 四虎国产精品免费久久久| 欧美伊香蕉久久综合类网站| 久久九九久精品国产免费直播| 成人午夜精品久久久久久久小说| 久久精品人人槡人妻人人玩AV| 久久中文字幕精品| 欧美色综合久久久久久| 久久久久国产视频电影| 久久99精品久久久久久水蜜桃| 亚洲国产精品久久久久久| 97r久久精品国产99国产精| 国内精品久久人妻互换| 亚洲精品乱码久久久久久| 国产偷久久久精品专区| AV无码久久久久不卡蜜桃| 国产成人精品三上悠亚久久| 伊人久久大香线蕉综合Av| 伊人久久大香线蕉亚洲| 日产精品久久久久久久性色| 久久超乳爆乳中文字幕| 国产一级持黄大片99久久| 亚洲一区二区三区日本久久九| 国产成人综合久久久久久| 国产成人精品久久| 久久综合伊人77777| 亚洲欧洲精品成人久久奇米网| 精品久久久久久久国产潘金莲| 久久精品aⅴ无码中文字字幕不卡| 亚洲国产精品无码久久一线| 久久丫精品国产亚洲av| 精品久久久久久国产潘金莲 | 日韩欧美亚洲综合久久影院Ds| 久久亚洲av无码精品浪潮| 亚洲欧美一级久久精品| 亚洲综合伊人久久综合| 精品久久一区二区| 久久精品一区二区影院| 无遮挡粉嫩小泬久久久久久久 | 久久国产精品一区二区| 久久国产免费直播|