新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 由STC12C5A50S2與NOKIA1100液晶屏構成的袖珍示波器

        由STC12C5A50S2與NOKIA1100液晶屏構成的袖珍示波器

        作者: 時間:2016-11-30 來源:網(wǎng)絡 收藏
        由STC12C5A50S2與NOKIA1100液晶屏構成的袖珍示波器,功能簡介:可測量雙通道波形,采樣率從75KHz到15Hz,輸入電壓應該能到50V(本人沒有測試過較高的電壓)。
        主要器件:手機電池供電,PT1301升壓到5V,以TL431輸出的2.5V為探頭的信號地,運放TL082做信號放大,數(shù)字電位器MCP41010做增益調(diào)節(jié),NOKIA1100液晶屏做為顯示,96*65像素點,其工作所需3.3V電壓是5V電壓串聯(lián)LED后得來的。STC12C5A50S2做為核心控制,據(jù)資料介紹其ADC采樣速度可達250KHz,兩路ADC采集波形數(shù)據(jù),一路ADC采集2.5V電壓,一路ADC采集電池電壓,兩路PWM經(jīng)低通濾波后控制調(diào)理電路的偏移。探頭接口是用的雙聲道耳機接口,比較節(jié)省空間,但是通道間會有干擾。按鍵有9個,CH:選通道; Vp/Hp:主菜單選擇:POWER:開機;Vs/Hs:(本程序未用) INC:+,STOP:關機 SET:進彈出菜單 DEC:- ESC:退出/暫停
        程序介紹:
        程序中為了方便圖形操作,為液晶屏建立了內(nèi)存緩沖,繪圖操做在單片機內(nèi)存中進行,然后整體復制到液晶屏.由于內(nèi)存不太充裕,采用了分塊的方法,以時間換取空間:
        #define LCD_WIDTH 96
        #define LCD_HEIGHT 8
        //液晶分區(qū)數(shù)
        #define LCD_PART 2
        //U8 lcd_x=0;
        //U8 lcd_y=0;
        xdata U8 lcd_buf[LCD_HEIGHT/LCD_PART][LCD_WIDTH];//lcd顯示緩存(1/LCD_PART屏)
        xdata S16 lcd_bufx0=0,lcd_bufy0=0,lcd_bufx1=0,lcd_bufy1=0;//緩沖區(qū)對應四角坐標,(去掉右邊框)
        //x0 <= x < x1;y0 <= y < y1;
        //-------------------------------------------------------
        //選擇液晶屏區(qū)域
        //s=0~LCD_PART-1
        //-------------------------------------------------------
        void lcd_buf_sel(U8 s)
        {
        if(s>=LCD_PART)return;
        lcd_bufx0=0;
        lcd_bufx1=LCD_WIDTH;
        lcd_bufy0=LCD_HEIGHT*s/LCD_PART;
        lcd_bufy1=LCD_HEIGHT*(s+1)/LCD_PART;
        }

        繪圖時需遍歷每個顯示緩存塊:
        for(p=0;p {
        lcd_buf_sel(p);
        //LCD_DrawPic(0,0,160,123,0,gImage_t1);
        lcd_buf_fill(0x04);
        GUI_SetFont6x8();
        GUI_dispnum(i,3,0,5,13,0);
        GUI_PutStr(5,5,"welcome...");
        GUI_SetFont8x16();
        GUI_PutStr(5,25,"welcome...");
        lcd_refresh();
        }

        程序在timer0中斷里采集波形數(shù)據(jù),主要代碼如下:
        //--------------------------------------------------
        //定時器中查詢AD
        //--------------------------------------------------
        void timer0(void) interrupt 1 using 3 //T0中斷,用寄存器組0
        {
        //while(TF0==0);
        //TF0=0;
        U8 ad;
        //static U8 fp=0;//分頻
        if(T0EXC==0)
        {
        //mmm++;
        TH0=TH0RLD;//重裝初值
        TL0=TL0RLD;
        T0EXC=T0EXH;
        //dosamp();
        while(ADC_CONTR&BIT(3));//等待通道0轉換完成
        //while(!(ADC_CONTR&BIT(4)));
        ad=ADC_RES;//讀通道0
        if(TrigCh==0)//通道1觸發(fā)
        {
        if(ChEnable & BIT(1))//通道2使能
        ADC_CONTR=(0xE8|ADCH2);//選通道2
        else //否則選通道1
        ADC_CONTR=(0xE8|ADCH1);//選通道1
        ADCBuf[0][BUF_Wps]=ad;//循環(huán)存儲數(shù)據(jù)
        }
        else
        {
        if(ChEnable & BIT(0))//通道1使能
        ADC_CONTR=(0xE8|ADCH1);//選通道1
        else //否則選通道1
        ADC_CONTR=(0xE8|ADCH2);//選通道2
        ADCBuf[1][BUF_Wps]=ad;//循環(huán)存儲數(shù)據(jù)
        }

        上一頁 1 2 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 望谟县| 湘潭市| 漳州市| 永年县| 天全县| 旬邑县| 清丰县| 沙湾县| 漯河市| 高清| 凤翔县| 昌图县| 咸宁市| 富源县| 台东县| 高清| 航空| 清徐县| 武乡县| 望都县| 游戏| 崇州市| 尼木县| 九龙坡区| 县级市| 岳阳市| 牙克石市| 肇州县| 峨边| 阳朔县| 晋中市| 平昌县| 天祝| 民权县| 大理市| 蛟河市| 常山县| 潢川县| 申扎县| 滦南县| 辽阳县|