![數(shù)字示波器完整設(shè)計(jì)過程_第1頁](http://file4.renrendoc.com/view11/M02/1B/10/wKhkGWXzmFqAA8LZAALSz-j4mGo278.jpg)
![數(shù)字示波器完整設(shè)計(jì)過程_第2頁](http://file4.renrendoc.com/view11/M02/1B/10/wKhkGWXzmFqAA8LZAALSz-j4mGo2782.jpg)
![數(shù)字示波器完整設(shè)計(jì)過程_第3頁](http://file4.renrendoc.com/view11/M02/1B/10/wKhkGWXzmFqAA8LZAALSz-j4mGo2783.jpg)
![數(shù)字示波器完整設(shè)計(jì)過程_第4頁](http://file4.renrendoc.com/view11/M02/1B/10/wKhkGWXzmFqAA8LZAALSz-j4mGo2784.jpg)
![數(shù)字示波器完整設(shè)計(jì)過程_第5頁](http://file4.renrendoc.com/view11/M02/1B/10/wKhkGWXzmFqAA8LZAALSz-j4mGo2785.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Mini51板的數(shù)字示波器設(shè)計(jì)基于Mini51板硬件資源,構(gòu)思數(shù)字示波器的方案已經(jīng)思考很久了,總是沒有集中的時(shí)間,一個(gè)稍微復(fù)雜的設(shè)計(jì)完成創(chuàng)作需要集中的時(shí)間才能完成,這次利用學(xué)期結(jié)束的一段集中時(shí)間,完成了基于LCD12864顯示的數(shù)字示波器程序設(shè)計(jì),現(xiàn)在將文檔寫出來供大家交流學(xué)習(xí)用。在此聲明,這個(gè)教程是寫給初學(xué)者看的,我會(huì)從簡單到復(fù)雜一步一步詳細(xì)介紹設(shè)計(jì)過程,甚至是調(diào)試的過程,還包括一些經(jīng)驗(yàn)總結(jié),特別是提供了完整的keil工程附件。希望讀者立足示波器工程,學(xué)到更多關(guān)于軟硬件開發(fā)的一些經(jīng)驗(yàn)技巧。1簡易數(shù)字示波器原理數(shù)字示波器根本原理可以簡單理解為:數(shù)據(jù)采集+圖形顯示,該過程循環(huán)進(jìn)行,如圖1-1所示。首先是數(shù)據(jù)采集,這一版我們直接用Mini51板上的ADC“TLC1549”。〔如果你沒有ADC,也可能沒有信號發(fā)生器,后面會(huì)介紹一種正弦表調(diào)試方法?!砊LC1549驅(qū)動(dòng)函數(shù)unsignedintread_adc(void)。圖1-1簡易數(shù)字示波器流程圖unsignedintread_adc(void){unsignedchari;unsignedinttemp=0;ADC_CS=0;//開啟控制電路,使能DA和CKIO引腳for(i=0;i<10;i++){//采集10次,即10bitADC_CK=0;temp<<=1;if(ADC_DA)temp++;ADC_CK=1;}ADC_CS=1;return(temp);}注:帶背景色的源碼都是直接從演示程序中拷貝的。以上是是驅(qū)動(dòng)TLC1549的函數(shù),如果你還想徹底弄清TLC1549的各種參數(shù),請參考數(shù)據(jù)手冊TLC1549.pdf,使用該函數(shù)需要注意的是,兩次調(diào)用該函數(shù)之間的間隔要超過21us,AD轉(zhuǎn)換是要一段時(shí)間的,在高速系統(tǒng)中時(shí)間控制尤其關(guān)鍵。Mini51板單片機(jī)在22.1184M晶振時(shí)鐘頻率下運(yùn)行,連續(xù)兩次AD采集數(shù)據(jù)并將數(shù)據(jù)寫入外部擴(kuò)展RAM變量緩沖區(qū),之間的時(shí)間間隔實(shí)測略小于21us的,需要適當(dāng)延時(shí)。這在高速檔數(shù)據(jù)采集時(shí)增加了一定延時(shí)等待就是這個(gè)原因。圖形顯示有很多種,LCD顯示稍難,ADC得到的結(jié)果如何在LCD上描點(diǎn),這確實(shí)是一個(gè)難點(diǎn),涉及LCD驅(qū)動(dòng)問題,需要花費(fèi)很大篇幅才能完成。最初調(diào)試我們可以選用串口來做,借助他人現(xiàn)成的工具軟件。下面介紹基于串口和上位機(jī)工具軟件的波形顯示程序設(shè)計(jì)。串口初始化函數(shù)rs232_port_init(void)。voidrs232_port_init(void)//串口初始化{ SCON=0x50; //串口工作在方式1,異步模式 PCON=0x80; //波特率翻倍 TMOD=0x20;//定時(shí)器1工作在方式2 TH1=0xff; //波特率115200bps,單片機(jī)時(shí)鐘晶振為22.1184MHz TL1=0xff; TR1=1; //開啟時(shí)鐘 RI=0; //清空接受標(biāo)志位 TI=0; //清空發(fā)送標(biāo)志位}往串口寫1字節(jié)函數(shù)voiduart_put_uchar(unsignedcharc)。voiduart_put_uchar(unsignedcharc)//往串口寫1字節(jié)無符號數(shù)據(jù){ SBUF=c; while(!TI); TI=0;}從串口讀1字節(jié)函數(shù)unsignedcharuart_get_uchar()。unsignedcharuart_get_uchar()//從串口讀1字節(jié)無符號數(shù)據(jù){ while(!RI); RI=0; returnSBUF;}以上這幾個(gè)函數(shù)是學(xué)單片機(jī)的人一定要掌握的,能夠隨手拿來就用,通過串口調(diào)試程序,很方便。有了以上4個(gè)函數(shù),再建一個(gè)keil工程,添加一個(gè)主函數(shù),就可以演示了。#include"mini51b.h" //所有與硬件相關(guān)的接口函數(shù)定義#include"uart.h"voidmain(){ rs232_port_init();//串口初始化 read_adc();//首個(gè)ADC數(shù)據(jù)喪失 while(1){ if(uart_get_uchar()==0x55)uart_put_uchar(read_adc()/4); //10bit/4變8bit }}在主程序循環(huán)中,接收到上位機(jī)下發(fā)的數(shù)據(jù)0x55后,讀取ADC數(shù)據(jù)并發(fā)送一次,在串口調(diào)試助手〔例如SSCOM〕里,設(shè)置相關(guān)端口和波特率后,發(fā)送0x55,注意HEX〔十六進(jìn)制格式〕選項(xiàng),就可以看到ADC的結(jié)果,如圖1-2所示。圖1-2串口調(diào)試ADC調(diào)試ADC還有一種更方便的方法,結(jié)果直接在Mini51板上的數(shù)碼管上顯示出來,不管你對數(shù)碼管硬件熟悉不熟悉,只要使用模板程序提供的數(shù)碼管驅(qū)動(dòng)函數(shù)led_disp(uintnumber)即可。Mini51板數(shù)碼管驅(qū)動(dòng)函數(shù)led_disp(unsignedint)。voidled_disp(uintnumber)//Mini51板數(shù)碼管顯示函數(shù),傳入整數(shù)0~9999{ unsignedcharcodetab1[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; unsignedchartemp,flag=0; if(number<10000) { temp=number/1000%10;//千位數(shù)碼管 if(temp){ SEG_Q=tab1[temp]; flag=1; } else{ SEG_Q=0xff;//數(shù)碼管熄滅 flag=0; } temp=number/100%10;//百位數(shù)碼管 if(flag|temp) { SEG_B=tab1[temp]; flag=1; } else{ SEG_B=0xff;//數(shù)碼管熄滅 flag=0; } temp=number/10%10;//十位數(shù)碼管 if(flag|temp)SEG_S=tab1[temp]; elseSEG_S=0xff;//數(shù)碼管熄滅 temp=number%10;//個(gè)位數(shù)碼管 SEG_G=tab1[temp]; } else{ SEG_Q=0xbf;//"-" SEG_B=0xbf; SEG_S=0xbf; SEG_G=0xbf; }}以上演示源程序keil工程請參考附件【串口調(diào)試1】這里我再介紹兩款串口繪圖軟件【MyOsc】和【ComCalWave】,可以直接把串口接收到的數(shù)據(jù)按X-Y軸繪圖,顯示結(jié)果更直觀。主程序這樣改:#include"mini51b.n" //所有與硬件相關(guān)的接口函數(shù)定義#include"uart.h"voidmain(){ rs232_port_init(); read_adc(); delay_ms(1); while(1){ uart_put_uchar(read_adc()/4); //seg7_disp(read_adc()); delay_ms(1); //這里的延時(shí)起到調(diào)節(jié)采樣率的作用 }}運(yùn)行【MyOsc】,設(shè)置串口和波特率后“OPEN”,適當(dāng)調(diào)節(jié)輸入信號頻率后可以看到如圖1-3所示的圖案。圖1-3串口繪圖軟件例如運(yùn)行【ComCalWave】,選擇正確的串口號和波特率,“OpenCOM”,再設(shè)置“WaveShow”,看到了什么?圖形!在圖形窗口嘗試用鼠標(biāo)右鍵操作,還可選擇特定范圍顯示,如圖1-4所示。圖1-4串口繪圖軟件例如2要看到以上漂亮的波形,還有一些硬件連接要做,需要將信號發(fā)生器和Mini51板上ADCin接口連接,注意,TLC1549只能進(jìn)行0到5V之間的信號轉(zhuǎn)換,你還需要調(diào)整信號發(fā)生器,產(chǎn)生滿足條件的信號才行。以上演示源程序keil工程請參考附件【串口調(diào)試2】實(shí)際在調(diào)試程序中,缺少必要硬件設(shè)備的,還可以用正弦表代替實(shí)際ADC,這里再介紹一款正弦表生成器軟件【正弦表發(fā)生器】,軟件界面如圖1-5所示。圖1-5正弦表發(fā)生器【量化階數(shù)】就是ADC位數(shù),例如tlc1549是10階,ADC0809是8階;【采樣點(diǎn)數(shù)】就是在一個(gè)正弦周期內(nèi),均勻分布多少個(gè)采樣點(diǎn),例如在128點(diǎn)的lcd上顯示2個(gè)以上周期的話,采樣點(diǎn)數(shù)要小于64點(diǎn),這里選用30點(diǎn)數(shù)來舉例,源程序如下。#include"mini51b.h"http://所有與硬件相關(guān)的接口函數(shù)定義#include"uart.h"unsignedcharcodedot[30]={//正弦表,注意數(shù)據(jù)類型是“code”,存放在rom當(dāng)中 0x80,0x9a,0xb4,0xcb,0xdf,0xee,0xf9,0xff,0xff,0xf9, 0xee,0xdf,0xcb,0xb4,0x9a,0x80,0x65,0x4c,0x34,0x21, 0x11,0x6,0x0,0x0,0x6, 0x10,0x20,0x34,0x4b,0x65,};voidmain(){ unsignedchari; rs232_port_init(); delay_ms(1); while(1){ for(i=0;i<128;i++){ uart_put_uchar(dot[i%30]); delay_ms(1);//此處延時(shí)當(dāng)于調(diào)節(jié)了采樣率 } }}用以上調(diào)試軟件同樣可以看到漂亮的正弦信號圖形。以上調(diào)試成功后,是不是感覺很棒,如果你是第一次親自完成ADC將數(shù)據(jù)采集,再用軟件繪圖顯示復(fù)原信號波形圖,一定是一件特別令人沖動(dòng)的事情。2圖形液晶LCD12864繪圖驅(qū)動(dòng)設(shè)計(jì)根底下面我們學(xué)習(xí)如何在LCD12864上顯示同樣的正弦波形。關(guān)于LCD的硬件接口電路,在前面的教程中有詳細(xì)介紹,涉及單片機(jī)總線知識和CPLD內(nèi)部電路,需要專門學(xué)習(xí),這里我們借助現(xiàn)成的驅(qū)動(dòng)函數(shù),重點(diǎn)講解LCD繪圖程序設(shè)計(jì)。LCD12864的電路接口在【mini51b.h】頭文件中定義。#defineLCD_LCWXBYTE[0xf4ea] //左屏命令寫入#defineLCD_LDWXBYTE[0xf5ea]//左屏數(shù)據(jù)寫入#defineLCD_LCRXBYTE[0xf6ea] //左屏命令讀出#defineLCD_LDRXBYTE[0xf7ea] //左屏數(shù)據(jù)讀出#defineLCD_RCWXBYTE[0xf8ea] //右屏命令寫入#defineLCD_RDWXBYTE[0xf9ea]//右屏數(shù)據(jù)寫入#defineLCD_RCRXBYTE[0xfaea] //右屏命令讀出#defineLCD_RDRXBYTE[0xfbea]//右屏數(shù)據(jù)讀出后面所有對LCD的編程操作都是基于以上接口定義〔總線編址〕進(jìn)行的讀寫操作。首先來看LCD點(diǎn)陣結(jié)構(gòu)圖,這里以不帶字庫的LCD12864來講解,如圖2-1所示。圖2-1LCD點(diǎn)陣分布結(jié)構(gòu)圖此LCD屏由水平128列,垂直64行組成。水平128列分左右各64列兩個(gè)半屏構(gòu)成。垂直64行又分8頁,每頁8行〔1列8點(diǎn)剛好1字節(jié)〕。程序每次對LCD的繪圖操作就是以最小單位1字節(jié)進(jìn)行操作的。理解這點(diǎn)至關(guān)重要。也就是每次只能針對8點(diǎn)進(jìn)行操作,而不是1點(diǎn)進(jìn)行操作。左右屏由單獨(dú)地址線控制〔前面的接口定義就是分左右屏定義的〕。實(shí)際打點(diǎn)只需往指定“位置”寫入數(shù)據(jù),“1”亮,“0”LCD驅(qū)動(dòng)函數(shù):忙檢測函數(shù)voidloop_lcd12864_is_busy(unsignedcharright)。voidloop_lcd12864_is_busy(unsignedcharright){unsignedchartmp,counter=0;do{ if(right)tmp=LCD_RCR; elsetmp=LCD_LCR; if(counter++>50)break;//超時(shí)跳出}while((tmp|0x7f)==0xff);//bit7為1那么表示LCD內(nèi)部執(zhí)行命令,處于“忙”狀態(tài)}對LCD進(jìn)行讀寫操作時(shí),需要進(jìn)行“忙”檢測,LCD內(nèi)部也是由控制器來完成一些列LCD屏顯示操作的,執(zhí)行各種操作都是需要一定的時(shí)間的,也就是說不是任何時(shí)候外部控制器都可以操作LCD的,只有LCD為空閑狀態(tài)時(shí)才可以操作,忙檢測就是循環(huán)讀取LCD狀態(tài)標(biāo)志位,判斷是否空閑,關(guān)于命令的細(xì)節(jié)請參考數(shù)據(jù)手冊。命令寫入函數(shù)voidlcd_cmd_wr(unsignedcharcmd,right)。voidlcd_cmd_wr(unsignedcharcmd,right){loop_lcd12864_is_busy(right); //忙檢測if(right)LCD_RCW=cmd; //右屏命令寫入elseLCD_LCW=cmd; //左屏命令寫入}數(shù)據(jù)寫入函數(shù)voidlcd_dat_wr(unsignedchardata,right)。voidlcd_dat_wr(unsignedchardata,right){loop_lcd12864_is_busy(right);if(right)LCD_RDW=data;elseLCD_LDW=data;}lcd_cmd_wr()和lcd_dat_wr()兩個(gè)函數(shù)分別是給LCD寫命令和寫數(shù)據(jù)函數(shù),通過寫命令函數(shù)設(shè)定地址。每個(gè)函數(shù)都分左右屏,用0,非0選擇。讀數(shù)據(jù)函數(shù)unsignedcharlcd_dat_rd(unsignedcharright)。unsignedcharlcd_dat_rd(unsignedcharright){loop_lcd12864_is_busy(right);if(right)return(LCD_RDR);elseretuen(LCD_LDR);}該函數(shù)完成對LCD已顯示的數(shù)據(jù)讀出,首次操作需要讀2次數(shù)據(jù)才有效。LCD清屏函數(shù)voidlcd12864_clr(void)。voidlcd12864_clr(void){ unsignedchari,j; for(i=0;i<8;i++){//從0到7共8頁 lcd_cmd_wr(ORGX,0);//分頁設(shè)定左屏0點(diǎn)地址 lcd_cmd_wr(ORGY+i,0); lcd_cmd_wr(ORGX,1);//分頁設(shè)定右屏0點(diǎn)地址 lcd_cmd_wr(ORGY+i,1); for(j=0;j<64;j++){ lcd_data_wr(0,0); lcd_data_wr(0,1); } }}該函數(shù)對LCD所有點(diǎn)陣寫0,完成一次清屏操作。這里的ORGY,PRGX是設(shè)定光標(biāo)的命令,光標(biāo)指向(0,0)字節(jié),是一個(gè)固定值。實(shí)際在執(zhí)行數(shù)據(jù)寫入的時(shí),x坐標(biāo)范圍從0到63,在連續(xù)寫入過程中能夠?qū)崿F(xiàn)自動(dòng)加1,y軸頁地址范圍從0到7,需要逐頁設(shè)定。LCD初始化函數(shù)voidlcd12864_init(void)。voidlcd12864_init(void){lcd_cmd_wr(DISPON,0); //顯示開啟lcd_cmd_wr(DISPFIRST,0);//設(shè)定顯示首行地址 //修改首行地址可以實(shí)現(xiàn)屏幕滾動(dòng)顯示效果lcd_cmd_wr(ORGY,0);//設(shè)定初始光標(biāo)lcd_cmd_wr(ORGX,0);lcd_cmd_wr(DISPON,1);//初始另外一半lcd_cmd_wr(DISPFIRST,1);lcd_cmd_wr(ORGY,1);lcd_cmd_wr(ORG,1);lcd12864_clr();//執(zhí)行清屏,非必須操作}該函數(shù)用來初始化LCD,設(shè)置顯示模式,光標(biāo)位置等,在對LCD繪圖時(shí),最多的命令就是設(shè)定當(dāng)前光標(biāo)位置,通過光標(biāo)位置來指定將要操作的LCD顯示點(diǎn)。在對LCD編程操作以前,一定要執(zhí)行此函數(shù)對LCD進(jìn)行初始化操作。例如給左半屏〔0,0〕首字節(jié)寫入數(shù)據(jù)0x55,應(yīng)該執(zhí)行以下程序。lcd12864_init();//LCD初始化lcd_cmd_wr(ORGX,0);//設(shè)定水平軸X地址lcd_cmd_wr(ORGY,0);//設(shè)定垂直軸Y地址lcd_dat_wr(0x55,0);//寫入數(shù)據(jù),從下至上為01010101lcd_dat_wr(0xaa,0);//寫入數(shù)據(jù),從下至上為10101010,連續(xù)寫入,X地址自動(dòng)加1這樣在如圖0字節(jié)和1字節(jié)就將交替有4點(diǎn)亮,4點(diǎn)暗,構(gòu)成如圖2-2所示圖案。圖2-2LCD顯示例如圖2-3LCD顯示例如又如執(zhí)行程序:lcd12864_init();lcd_cmd_wr(ORGX,1);lcd_cmd_wr(ORGY,1);lcd_dat_wr(0x55,1); 顯示效果如圖2-3所示。如果執(zhí)行以下程序:lcd12864_init();lcd_cmd_wr(ORGX+1,0);lcd_cmd_wr(ORGY+1,0);lcd_data_wr(0x55,0); 顯示效果如圖2-4所示。圖2-4LCD顯示例如圖2-5LCD顯示例如從驅(qū)動(dòng)函數(shù)可見,一次對LCD寫入數(shù)據(jù)是以字節(jié)為單位,通過寫命令確定坐標(biāo),Y坐標(biāo)從0頁到7頁,X坐標(biāo)從0列到63列,分左右屏,左上角為坐標(biāo)〔0,0〕點(diǎn),這和我們習(xí)慣的左下角為〔0,0〕坐標(biāo)軸是不一樣的。因?yàn)槊看尾僮鱈CD是一個(gè)字節(jié)為單位,對應(yīng)8點(diǎn),如果我們希望以任意點(diǎn)為坐標(biāo)顯示,還得另外尋找別的方法編程實(shí)現(xiàn)真正“點(diǎn)”顯示。如圖2-5所示,在屏幕上指定位置畫點(diǎn),水平軸就是x,與lcd坐標(biāo)一致,y軸需要將點(diǎn)坐標(biāo)變成字節(jié)為單位的坐標(biāo),我們先按習(xí)慣將y軸64點(diǎn)從下至上編號0到63,其中0到7點(diǎn)為字節(jié)0,8到15點(diǎn)為字節(jié)1,依此類推對應(yīng)8字節(jié)。第一點(diǎn)Y軸為30,應(yīng)該是哪字節(jié)哪bit呢?30/8取整為3,前3字節(jié)〔0,1,2三字節(jié)〕對應(yīng)0到23點(diǎn)跳過,實(shí)際30點(diǎn)應(yīng)該在第4字節(jié)〔24到31〕的bit6上,這就要用算法計(jì)算出字節(jié)數(shù)和bit位,前面30/8=3,這里的3似乎就是要找的字節(jié)數(shù),那么30%8〔30除8取余數(shù)〕呢,余數(shù)是6,不是剛好是bit位嗎?所以可以這樣將y值映射到某字節(jié)的某點(diǎn)上,如果Y軸64點(diǎn)對應(yīng)8字節(jié)變量Da[n],n從0到7,那么:da[y/8]=1<<(y%8);或da[y>>3]=0x01<<(y&0x07);后一種算法更優(yōu)。通過總結(jié)規(guī)律,用以上算法可以將任意0到63之間的數(shù)據(jù)作為坐標(biāo)描點(diǎn)到對應(yīng)的8個(gè)字節(jié)中,然后將8個(gè)字節(jié)全部寫入LCD,那么通過剛剛算法就會(huì)有一點(diǎn)與所給坐標(biāo)一致。第一點(diǎn):da[30/8]=1<<30%8;即da[3]=0x40;第二點(diǎn):da[10/8]=1<<10%8;即da[1]=0x04;下面我們來設(shè)計(jì)的函數(shù)??偨Y(jié)以上算法,編寫出在LCD任何坐標(biāo)位置上描點(diǎn)繪圖函數(shù)voidlcd_disp(unsignedcharx,y)。列更新子函數(shù)lcd_row_wr(unsignedcharx,unsignedchar*da)。voidlcd_row_wr(unsignedcharx,unsignedchar*da)//x是列坐標(biāo),*da是8字節(jié)列數(shù)據(jù){ unsignedcharj; if(x<64){//根據(jù)列坐標(biāo)選擇左右半屏 for(j=0;j<8;j++){//寫左半屏 lcd_cmd_wr(ORGY+j,0); lcd_cmd_wr(ORGX+x,0); lcd_data_wr(da[j],0); } } else{ x-=64;//坐標(biāo)調(diào)整 for(j=0;j<8;j++){//寫右半屏 lcd_cmd_wr(ORGY+j,1); lcd_cmd_wr(ORGX+x,1); lcd_data_wr(da[j],1); } }}voidlcd_disp(unsignedcharx,y)//x水平坐標(biāo),y垂直坐標(biāo){ unsignedchardat[8]; unsignedcharj; for(j=0;j<8;j++)dat[j]=0x0; dat[y/8]|=0x01<<(y&0x07); lcd_row_wr(x,dat);}以上函數(shù)能夠在指定坐標(biāo)〔x,y〕上描點(diǎn),例如執(zhí)行程序:lcd_init();lcd_disp(0,0);lcd_disp(1,1);lcd_disp(2,2);lcd_disp(3,3);lcd_disp(4,4);lcd_disp(5,5);lcd_disp(6,6);lcd_disp(7,7);lcd_disp(70,10);lcd_disp(71,20);lcd_disp(72,30);lcd_disp(73,40);效果如圖2-6所示。圖2-6LCD顯示例如圖2-7LCD顯示例如以上演示源程序keil工程請參考附件【LCD驅(qū)動(dòng)exa1】。如圖2-6所示效果,Y軸“反了”,是的,這很好辦,在lcd_disp()函數(shù)中增加一句:y=63-y;就可以實(shí)現(xiàn)。在下面的例子中將做到與我們習(xí)慣的坐標(biāo)一致。voidmain(){ unsignedchari; lcd_init(); for(i=0;i<128;i++){ lcd_disp(i,i/2); } while(1);}效果如圖2-7所示。以上演示源程序keil工程請參考附件【LCD驅(qū)動(dòng)exa2】。如果將正弦表的數(shù)據(jù)送LCD顯示,程序:voidmain(){ unsignedchari; lcd_init(); for(i=0;i<128;i++){ lcd_disp(i,dot[i%30]/4);//除以4是變8bit為6bit〔0-63〕進(jìn)行LCD映射 } while(1);}效果如圖2-8所示。圖2-8LCD顯示例如圖2-9矢量繪圖例如以上演示源程序keil工程請參考附件【LCD驅(qū)動(dòng)exa3】。以上是逐點(diǎn)繪圖,其實(shí)矢量繪圖效果會(huì)更好,矢量繪圖原理在本文第7節(jié)介紹。進(jìn)一步完善繪圖函數(shù)lcd_disp〔〕。voidlcd_disp(unsignedcharx,unsignedchary,charl)//x水平坐標(biāo),y垂直坐標(biāo),l矢量繪圖參數(shù){ unsignedchardat[8]; unsignedcharj; y=63-y; for(j=0;j<8;j++)dat[j]=0x0; if(l==0)dat[y>>3]|=0x01<<(y&0x07); elseif(l>0)for(j=0;j<l;j++)dat[(y+j)/8]|=0x01<<((y+j)&0x07); elsefor(j=0;j<(-l);j++)dat[(y-j)/8]|=0x01<<((y-j)&0x07); lcd_row_wr(x,dat);}主函數(shù)也要傳遞對應(yīng)參數(shù)。voidmain(){ unsignedchari; chark; lcd_init(); for(i=0;i<128;i++){ k=dot[i%30]-dot[(i+1)%30]; lcd_disp(i,dot[i%30]/4,k/4); } while(1);}效果如圖2-9所示。以上演示源程序keil工程請參考附件【LCD驅(qū)動(dòng)exa3s】。繼續(xù)改良參數(shù),嘗試將adc的值采集送lcd顯示。再按時(shí)間軸X軸順序?qū)⒉煌瑫r(shí)刻采集到的Y值順序?qū)懭隠CD,這是我們就可以在LCD上看到隨時(shí)間變化的電壓曲線了。voidmain(){ unsignedchari; lcd12864_init(); for(i=0;i<128;i++){ lcd_disp(i,read_adc(0)/16);//從10bit映射到6bit,要除16 } while(1);}效果如圖2-9所示。圖2-9LCD顯示例如圖2-10LCD顯示例如調(diào)整信號頻率,可以得到滿意的波形圖了,效果如圖2-10所示。如果你成功做到了這一步,可喜可賀,具備了做一款數(shù)字示波器的根底了。還要繼續(xù)完善。從驅(qū)動(dòng)函數(shù)可見,單片機(jī)對LCD上每點(diǎn)都要重復(fù)計(jì)算,是不是覺得單片機(jī)運(yùn)行會(huì)很辛苦呢〔很慢〕?其實(shí)這就是計(jì)算機(jī)的優(yōu)勢,最擅長重復(fù)做有規(guī)律事情,單片機(jī)通過高速的運(yùn)行指令,實(shí)現(xiàn)了這些任務(wù)的“瞬時(shí)”完成效果,實(shí)際運(yùn)行效果很好的。【一點(diǎn)經(jīng)驗(yàn)】作為終端輸出顯示裝置,并不需要很高的更新〔刷新〕速度,因?yàn)樗墙o“人”看的,每秒超過10次的變化,對人眼睛產(chǎn)生不了有用的效果。教程寫到這里,對于完成示波器圖形顯示LCD驅(qū)動(dòng)程序應(yīng)該差不多學(xué)會(huì)了吧。實(shí)際上完整的示波器程序還需要在LCD上顯示網(wǎng)格〔背景格〕和可移動(dòng)游標(biāo)線,還有一些指示符號,我們來繼續(xù)深入學(xué)習(xí)。3圖形液晶LCD12864繪圖驅(qū)動(dòng)設(shè)計(jì)提高如何在現(xiàn)實(shí)波形顯示的根底上,同時(shí)將定標(biāo)網(wǎng)格也顯示出來了?我們繼續(xù)完善LCD圖形顯示驅(qū)動(dòng)。首先我們看一種C語法,A=0x05;A|=0x50;運(yùn)行以上指令后,A=0x55;也可以說第二個(gè)數(shù)據(jù)0x50是疊加到第一個(gè)數(shù)據(jù)上的,我們可以用這種算法把需要顯示的亮點(diǎn)〔也就是“1”〕按一定的算法疊加在一起,送LCD顯示,就出現(xiàn)了我們希望的在波形上增加背景網(wǎng)格的效果。因?yàn)榫W(wǎng)格與水平X軸是嚴(yán)格關(guān)聯(lián)的,所以我們可以對X軸數(shù)據(jù)進(jìn)行判斷,有規(guī)律的將邊框和背景格點(diǎn)參加。改良帶背景格的lcd_disp()函數(shù)。voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=0;j<8;j++)da[j]=0x0; da[y/8]|=0x01<<(y%8); if(x%5==0){da[2]|=0x01;da[5]|=0x80;}//添加網(wǎng)格數(shù)據(jù) lcd_row_wr(x,da);}效果如圖3-1所示。圖3-1LCD顯示例如圖3-2LCD顯示例如進(jìn)一步完善:voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=1;j<7;j++)da[j]=0x0; da[y/8]|=0x01<<(y%8); da[0]=0x01;//加邊框 da[7]=0x80;//加邊框 if(x%5==0){ da[21/8]|=0x01<<(21%8); da[42/8]|=0x01<<(42%8); } lcd_row_wr(x,da);}效果如圖3-2所示。看出問題來沒?再改良:voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=1;j<7;j++)da[j]=0x0; da[0]=0x01; da[7]=0x80; if(x%5==0){ da[21/8]|=0x01<<(21%8); da[42/8]|=0x01<<(42%8); } da[y/8]|=0x01<<(y%8);//先加邊框再疊加波形數(shù)據(jù) lcd_row_wr(x,da);}效果如圖3-3所示。圖3-3LCD顯示例如圖3-4LCD顯示例如進(jìn)一步完善:voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=1;j<7;j++)da[j]=0x0; da[0]=0x01; da[7]=0x80; if(x%5==0){ da[21/8]|=0x01<<(21%8); da[42/8]|=0x01<<(42%8); } if((x==0)||(x==127)){//加兩端邊框 for(j=0;j<8;j++)da[j]=0xff; } da[y/8]|=0x01<<(y%8); lcd_row_wr(x,da);}效果如圖3-4所示。做到這里,似乎感覺驅(qū)動(dòng)LCD圖形顯示很容易的嘛,就是!其實(shí)不難!驅(qū)動(dòng)LCD是完成示波器的根底,后面還要介紹在LCD上顯示數(shù)字,顯示測量線等。4紅外遙控按鍵輸入下面我們來學(xué)習(xí)遙控器按鍵輸入。由于示波器控制需要很多按鍵輸入,Mini51板自帶按鍵只有4個(gè),遠(yuǎn)遠(yuǎn)不夠,最初用那4個(gè)按鍵分多模式來做,使用不是很方便,后來改用遙控器做按鍵輸入,很方便。一種紅外編碼,如圖4-1所示。“0”,“1”用不同寬度〔周期中高電平局部〕的周期信號表示。這種編解碼原理網(wǎng)上資料很多,這里不多說。圖4-1常見紅外編碼這里介紹另外一種編碼方式,通過對金星遙控器G328111發(fā)射信號進(jìn)行研究,總結(jié)得到,如圖4-2所示。圖4-2金星遙控器G328111編碼短周期信號為“0”,1/2長周期〔短周期2倍〕信號表示“1”,低電平開始,高電平結(jié)束。這種規(guī)律我們可以用數(shù)字示波器把波形存儲后分析得到,這里介紹一種不用數(shù)字示波器,直接用單片機(jī)測試紅外編碼的方法。程序設(shè)計(jì)思想:While〔低電平〕{計(jì)數(shù)1}While〔高電平〕{計(jì)數(shù)2}……用一個(gè)數(shù)組記錄一次按鍵所有周期上下電平計(jì)數(shù)數(shù)值,分析數(shù)據(jù)可以得到紅外編碼規(guī)律。實(shí)際程序:while(IRM_DQ)P1=0;//P1口LED燈亮表示可以按遙控器按鍵了P1=0xff;//燈熄滅,解碼開始 for(i=0;i<15;i++){ while(!M51_IRM_DQ){if(++da[i*2]>0x54)break;delay(10);}//低電平長度檢測 while(M51_IRM_DQ){if(++da[i*2+1]>0x54)break;delay(10);}//高電平長度檢測}這里的da[]就是記錄信號變化長短的數(shù)組,將這一數(shù)組通過串口發(fā)送到PC機(jī)就可以分析紅外信號上下電平的規(guī)律了。例如:1E1838171D191C1A1C181D181D311E181C1A38181D181D1D181E18371A1C191C191C181D181D181C331D1938181D實(shí)際信號周期只有兩種時(shí)長,我們可以把【17到1E】當(dāng)成短周期,【31到38】當(dāng)成長周期,從而可以繪出波形圖:1E1838171D191C1A1C181D181D311E181C1A38181D181D___---______----__----___----___----___----___--------___----___---______----___----___0100000100100以上演示源程序keil工程請參考附件【遙控解碼1】【感悟】我寫這篇教程,特別注重解決問題的方法總結(jié),掌握一種解決問題的方法比掌握一種具體的知識要重要得多。金星遙控器G328111解碼程序分析:unsignedchari,flag;unsignedintda,unsignedinttemp=0;for(i=0;i<13;i++){ //實(shí)際測試,一個(gè)編碼有13個(gè)周期 da=0; while(!M51_IRM_DQ){if(++da>300)break;}//低電平檢測 if((da>10)&&(da<300)){//判斷電平時(shí)長是否有效 if(da>200)temp++;//長周期當(dāng)“1 elseflag^=0xff;//雙短周期當(dāng)“0 if(flag==0)temp<<=1; } da=0; while(M51_IRM_DQ){if(++da>300)break;}//高電平檢測 if((da>10)&&(da<300)){ if(da>200)temp++; elseflag^=0xff; if(flag==0)temp<<=1; }}Return(〔unsignedchar〕temp);//返回鍵值低8位以上演示源程序keil工程請參考附件【遙控解碼2】紅外遙控器按鍵輸入流程圖如圖4-3所示。圖4-3紅外遙控按鍵輸入流程圖紅外接收頭接收到遙控器輸出的紅外信號后,輸出低電平,該電平變化信號觸發(fā)單片機(jī)外部中斷,在中斷程序中完成鍵值解碼,得到有效鍵值后傳遞給一個(gè)全局鍵值變量,在主循環(huán)程序中,對全局鍵值變量檢測判斷,一旦檢測到有效鍵值,立即根據(jù)鍵值執(zhí)行相關(guān)程序,實(shí)現(xiàn)按鍵輸入。紅外中斷初始化函數(shù)voidint2_init(void)。voidint2_init(void){ IT2=1; //設(shè)置成下降沿中斷而不是低電平中斷 EX2=1; //開紅外接口外部中斷 EA=1; //開總中斷}紅外中斷函數(shù)voidirm_int(void)interrupt6,STC單片機(jī)特有的外部中斷INT2實(shí)現(xiàn)紅外解碼,解碼結(jié)果由數(shù)據(jù)緩沖區(qū)返回。voidirm_int(void)interrupt6{ unsignedchari,flag; unsignedintda; unsignedinttemp=0; EA=0; temp=0; da=0; flag=0; for(i=0;i<14;i++){ da=0; while(!M51_IRM_DQ){if(++da>300)break;} if((da>10)&&(da<500)){ if(da>200)temp++; elseflag^=0xff; if(flag==0)temp<<=1; } da=0; while(M51_IRM_DQ){if(++da>300)break;} if((da>10)&&(da<500)){ if(da>200)temp++; elseflag^=0xff; if(flag==0)temp<<=1; } } irm_code=(unsignedchar)(temp&0x00ff); IE2=0; EA=1; }這里irm_code為鍵值全局變量,在以上中斷函數(shù)當(dāng)中,如果檢測到有效按鍵,那么修改此變量為解碼成功的鍵值。主程序:voidmain(){ int2_init(); while(1){ if(irm_code!=0xff){//對鍵值進(jìn)行判斷 seg7_disp(irm_code);//顯示鍵值 irm_code=0xff;//去除當(dāng)前鍵值 } }}在主程序循環(huán)中,對鍵值變量irm_code進(jìn)行有效鍵值判斷。這里直接使用Mini51板上的數(shù)碼管顯示鍵值,對遙控器鍵值確認(rèn)很方便。以上演示源程序keil工程請參考附件【紅外按鍵輸入1】下面我們對鍵值進(jìn)行掃描判斷,完成對應(yīng)按鍵任務(wù)。voidkey_task(void){ if(irm_code!=0xff){ switch(irm_code) { case36:counter++;break; case38:counter--;break; default:break; } //seg7_disp(irm_code);//調(diào)試用 irm_code=0xff; }}這里采用switchcase結(jié)構(gòu)語句,很方便多按鍵任務(wù)自由添加。只要在主程循環(huán)中調(diào)用key_task()即可。unsignedcharcounter=0;voidmain(){ int2_init(); while(1){ key_task(); seg7_disp(counter);//結(jié)果顯示 delay_ms(10); }}這里演示了兩個(gè)按鍵對counter變量加減操作。以上演示源程序keil工程請參考附件【紅外按鍵輸入2】實(shí)際測試效果一般,容易出現(xiàn)連按鍵操作,即主觀按一次鍵,客觀執(zhí)行幾次加減操作的現(xiàn)象,那是因?yàn)榘存I解碼很快,一次按鍵,遙控器會(huì)連續(xù)發(fā)出多組鍵值信號。5圖形液晶LCD12864移動(dòng)游標(biāo)線繪圖驅(qū)動(dòng)設(shè)計(jì)有了按鍵模塊,下面我們來設(shè)計(jì)可以移動(dòng)的游標(biāo)線〔測量線〕,也就是在lcd上顯示一條可以移動(dòng)的線,最好是虛線,線的移動(dòng)受遙控器控制。首先看水平線,水平線在Y軸方向由變量控制,X軸方向根據(jù)x坐標(biāo)交替取值實(shí)現(xiàn)虛線效果。聲明控制水平線的變量【unsignedcharpointY=0;】可以從0到63變化。改良lcd_disp()函數(shù):voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=1;j<7;j++)da[j]=0x0; {//繪制邊框 da[0]=0x01; da[7]=0x80; if((x==0)||(x==127)){ for(j=0;j<8;j++)da[j]=0xff; } } //繪制由變量pointY控制游標(biāo)線 if(x%5==0)da[pointY>>3]|=0x01<<(pointY&0x07); //繪制信號波形 da[y/8]|=0x01<<(y%8); lcd_row_wr(x,da);}按鍵任務(wù)函數(shù)voidkey_task(void){ if(irm_code!=0){ switch(irm_code) { case34:pointY++;break;//游標(biāo)移動(dòng)變量調(diào)整 case35:pointY--;break; default:break; } //seg7_disp(irm_code);//調(diào)試用 irm_code=0; }}主程序while(1){ key_task(); for(i=0;i<128;i++){ lcd_disp(i,dot[i%30]/4);}}這時(shí)lcd_disp()需要放在循環(huán)體中運(yùn)行,不斷刷新LCD,否那么變量修改后的效果出現(xiàn)不了。運(yùn)行效果如圖5-1所示。圖5-1水平移動(dòng)游標(biāo)線例如圖5-2垂直移動(dòng)游標(biāo)線例如以上演示源程序keil工程請參考附件【LCD繪圖exa4】我們再來看垂直游標(biāo)線,垂直線在X軸方向由變量控制,Y軸方向給出特定數(shù)據(jù)實(shí)現(xiàn)虛線效果。聲明控制垂直線的變量【unsignedcharpointX=0;】可以從0到127變化。進(jìn)一步改良lcd_disp()函數(shù)voidlcd_disp(unsignedcharx,unsignedchary){ unsignedcharda[8]; unsignedcharj; y=63-y; for(j=1;j<7;j++)da[j]=0x0; {//繪制邊框 da[0]=0x01; da[7]=0x80; if((x==0)||(x==127)){ for(j=0;j<8;j++)da[j]=0xff; } } //繪制由變量pointY控制的水平游標(biāo)線 if(x%5==0)da[pointY>>3]|=0x01<<(pointY&0x07); //繪制由變量pointX控制的垂直游標(biāo)線 if(x==pointX) for(j=0;j<64;j++) if(j%5==0)da[j>>3]|=0x01<<(j&0x07); //繪制信號波形 da[y/8]|=0x01<<(y%8); lcd_row_wr(x,da);}按鍵任務(wù)voidkey_task(void){ if(irm_code!=0){ switch(irm_code) { case34:pointY++;break; case35:pointY--;break; case42:pointX++;break; case43:pointX--;break; default:break; } //seg7_disp(irm_code);//調(diào)試用 irm_code=0; }}主函數(shù)不變運(yùn)行效果如圖5-2所示。以上演示源程序keil工程請參考附件【LCD繪圖exa5】6圖形液晶LCD12864數(shù)字符號顯示前面從繪圖角度完成了對LCD的驅(qū)動(dòng),下面我們還要學(xué)習(xí)在LCD上顯示數(shù)字,顯示字符,完成數(shù)字示波器所必需的量度顯示。圖形點(diǎn)陣LCD顯示數(shù)字,原理是把數(shù)字以點(diǎn)陣的形式取模,再把點(diǎn)陣模寫入特定的lcd空間即可。首先來看數(shù)字取模,如圖6-1所示,對數(shù)字“0”按8×5點(diǎn)取模。圖6-1數(shù)字取模例如圖縱向看,8點(diǎn)一列,從上至下對應(yīng)bit0到bit7,我們用1表示“亮”,0表示“暗”,從左至右,依次確定為01111100,即0x7c;10000010,即0x82;10000010,即0x82;10000010,即0x82;01111100,即0x7c;如果我們依次將這5個(gè)字節(jié)寫入LCD某頁連續(xù)5個(gè)地址空間,lcd上就會(huì)顯示“0”。關(guān)于點(diǎn)陣取模,可以借助現(xiàn)成的軟件實(shí)現(xiàn),這里介紹一款字模提取軟件,軟件界面如圖6-2所示。圖6-2字模軟件界面我們首先將數(shù)字做成黑白點(diǎn)陣圖片,不直接輸入數(shù)字取模的原因是圖片修改更靈活,不受字體限制。圖6-3是數(shù)字0到9和小數(shù)點(diǎn)的點(diǎn)陣圖。圖6-3數(shù)字字模圖這里考慮到LCD空間限制,數(shù)字按8×4點(diǎn)陣取模,運(yùn)行取模軟件,翻開圖片,如圖6-4所示。圖6-4取模軟件翻開圖片效果進(jìn)行必要的參數(shù)設(shè)置,如圖6-5所示。圖6-5取模軟件參數(shù)設(shè)置按C51格式取模,取模后軟件界面如圖6-6所示。圖6-6C51格式取模下面我們把數(shù)字變量在LCD上動(dòng)態(tài)顯示,就是數(shù)值變了,顯示跟著變。字符顯示Lcd驅(qū)動(dòng)函數(shù)voidlcd_put_xyns(unsignedcharx,y,n,unsignedchar*s)。//8×n點(diǎn)陣字符寫入函數(shù)voidlcd_put_xyns(unsignedcharx,y,n,unsignedchar*s){ unsignedchari; for(i=0;i<n;i++){ if((x+i)>63){ lcd_cmd_wr(ORGY+y,1); lcd_cmd_wr(ORGX+x+i-64,1); lcd_dat_wr(s[i],1); } else{ lcd_cmd_wr(ORGY+y,0); lcd_cmd_wr(ORGX+x+i,0); lcd_dat_wr(s[i],0); } } }參數(shù):【x,y】是坐標(biāo),這里y是頁坐標(biāo),取值從0到7,【n】是點(diǎn)陣模字節(jié)數(shù),【*s】是點(diǎn)陣模起始地址。將字模生成字模表:unsignedcharcodenumber[]={/*--寬度x高度=41x8--*/0x7C,0x82,0x82,0x7C,0x84,0xFE,0x80,0x00,0xCC,0xA2,0x92,0x8C,0x44,0x92,0x92,0x6C,0x38,0x24,0xFE,0x20,0x9E,0x92,0x92,0x62,0x7C,0x92,0x92,0x64,0x06,0xF2,0x0E,0x02,0x6C,0x92,0x92,0x6C,0x4C,0x92,0x92,0x7C,0x80,};執(zhí)行:lcd_put_xyns(0,0,4,number+0*4);//直接顯示字符0lcd_put_xyns(4,0,4,number+1*4);//直接顯示字符1lcd_put_xyns(8,0,4,number+2*4);//直接顯示字符2lcd_put_xyns(12,0,4,number+3*4);//直接顯示字符3tmp=3421;//以下代碼顯示變量tmplcd_put_xyns(80,2,4,number+(tmp/1000)*4);lcd_put_xyns(84,2,4,number+(tmp/100%10)*4);lcd_put_xyns(88,2,4,number+(tmp/10%10)*4);lcd_put_xyns(92,2,4,number+(tmp%10)*4);運(yùn)行效果如圖6-7所示。圖6-7LCD顯示數(shù)字例如圖6-8LCD顯示數(shù)字例如調(diào)整坐標(biāo)間隔,顯示效果更好。lcd_put_xyns(0,0,4,number+0*4);lcd_put_xyns(5,0,4,number+1*4);lcd_put_xyns(10,0,4,number+2*4);lcd_put_xyns(15,0,4,number+3*4);tmp=3421;lcd_put_xyns(80,2,4,number+(tmp/1000)*4);lcd_put_xyns(85,2,4,number+(tmp/100%10)*4);lcd_put_xyns(90,2,4,number+(tmp/10%10)*4);lcd_put_xyns(95,2,4,number+(tmp%10)*4);運(yùn)行效果如圖6-8所示。用這個(gè)函數(shù),可以把我們希望的各種圖案符號顯示在LCD上,同樣先設(shè)計(jì)圖片,再給圖片取模。以上演示源程序keil工程請參考附件【LCD繪圖exa6】7數(shù)字示波器幾個(gè)參數(shù)數(shù)據(jù)采樣率與時(shí)間軸定標(biāo)數(shù)據(jù)采樣率也就是每秒鐘連續(xù)采集到的數(shù)據(jù)個(gè)數(shù),或者說兩個(gè)有效數(shù)據(jù)之間的時(shí)間間隔。為了在LCD上復(fù)原波形圖,時(shí)間軸與采樣率之間要有嚴(yán)格的換算關(guān)系。為了復(fù)原波形圖,采樣率與被測量信號頻率之間有一定的關(guān)聯(lián),不同的采樣率,對應(yīng)不同頻段的信號,高采樣率適合高頻信號,低采樣率適合變化緩慢的低頻信號。從顯示效果來看,為了在屏幕上再現(xiàn)信號的頻率特征,根據(jù)Nyquist頻率特征定理,一般要保證信號的每個(gè)周期內(nèi)至少有2點(diǎn),用LCD再現(xiàn),2點(diǎn)效果已經(jīng)很差了。最高采樣率一般由ADC器件決定,這里用的TLC1549最快只能做到88us采集一點(diǎn),按2點(diǎn)每周期計(jì)算的話,可以做到對5.6K(1000000/88/2)信號采樣,實(shí)際效果已經(jīng)很差了,1K以內(nèi)效果最好。實(shí)際在設(shè)計(jì)采樣率檔位時(shí),最快檔按100us每點(diǎn),屏幕每5點(diǎn)〔500us〕一格,第一檔就是0.5ms/div,這一檔位需要連續(xù)采樣,用少量延時(shí)控制采樣率為10k,第二檔就是1ms/div,第三檔2ms/div,第四檔5ms/div,第五檔10ms/div,后面四檔分別用定時(shí)器控制完成。電壓軸分檔定標(biāo)由于這版沒做模擬電路,不能對信號電壓進(jìn)行調(diào)理,所謂電壓檔定標(biāo)是純軟件算法實(shí)現(xiàn),屏幕同樣取5點(diǎn)一格,共10格,當(dāng)輸入信號從0到5V變化時(shí),LCD剛好滿屏顯示,每格0.5V,另外還設(shè)計(jì)了0.1v/div,0.2v/div,1v/div,2v/div,5v/div。共6檔。交流直流切換功能完善的示波器應(yīng)該從硬件上實(shí)現(xiàn)交直流切換,本版先從軟件上實(shí)現(xiàn)交流直流顯示,設(shè)計(jì)思想是根據(jù)采樣得到的數(shù)據(jù)的最大值和最小值確定交流信號幅度和中值,把直流局部減掉,顯示只顯示交流局部,這就是交流檔,直流檔就是不做去直流處理。運(yùn)行停止切換該功能實(shí)現(xiàn)起來很容易,所謂停止,就是停止新的數(shù)據(jù)采集,重復(fù)顯示同一幀數(shù)據(jù),顯示的效果就是波形穩(wěn)定無抖動(dòng),便于對信號電壓和頻率進(jìn)行測量。電壓測量根據(jù)當(dāng)前電壓檔位〔每格表示多少伏〕,計(jì)算出兩測量線之間的電壓值,在LCD上顯示。頻率測量根據(jù)當(dāng)前時(shí)間軸檔位〔每格表示多長時(shí)間〕,計(jì)算出兩測量線之間的時(shí)間,假定兩測量線之間剛好是一個(gè)周期,轉(zhuǎn)換成頻率值在LCD上顯示。波形平移用變量控制波形在LCD上顯示的相對位置,實(shí)現(xiàn)波形上下左右平移。幀同步我們使用的數(shù)字示波器,對有規(guī)律的周期信號能夠穩(wěn)定顯示,要想實(shí)現(xiàn)穩(wěn)定顯示,需要在起始點(diǎn)顯示信號的不同周期的同一點(diǎn),如何做到這點(diǎn)呢?如圖7-1所示,我們比照兩幀數(shù)據(jù),波形起點(diǎn)不在同一點(diǎn),我們沒方法保證每次數(shù)據(jù)采樣剛好在同一點(diǎn)〔硬件觸發(fā)的除外〕,我需要按一定的規(guī)律,在LCD上繪圖時(shí),總是從同一點(diǎn)開始,例如過零點(diǎn),這里我們首先用統(tǒng)計(jì)的方法找出信號的最大值和最小值,計(jì)算出信號中交流局部的中點(diǎn),也就是過零點(diǎn),然后逐點(diǎn)比擬,搜尋過零點(diǎn)。圖7-1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年巴音郭楞道路運(yùn)輸從業(yè)資格證考試內(nèi)容是什么
- 小學(xué)三年級100道口算題
- 2025年欽州貨運(yùn)上崗證模擬考試題
- 2025年荷澤貨運(yùn)從業(yè)資格證模擬考試駕考
- 華東師大版七年級數(shù)學(xué)上冊《第3章整式的加減3.1列代數(shù)式3.1.3列代數(shù)式 》聽評課記錄
- 湘教版數(shù)學(xué)八年級下冊《2.2.1平行四邊形的邊、角性質(zhì)》聽評課記錄
- 建筑項(xiàng)目經(jīng)理工作總結(jié)
- 初中理科教研組工作計(jì)劃
- 新學(xué)校校辦室工作計(jì)劃
- 平面設(shè)計(jì)師工作計(jì)劃范文欣賞
- 《反家庭暴力》課件
- 【物理】《跨學(xué)科實(shí)踐:制作簡易桿秤》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教版(2024)初中物理八年級下冊
- 新蘇教版一年級數(shù)學(xué)下冊第六單元《簡單的數(shù)量關(guān)系(一)》教案(共2課時(shí))
- GA/T 2146-2024法庭科學(xué)涉火案件物證檢驗(yàn)移動(dòng)實(shí)驗(yàn)室建設(shè)通用要求
- 2024-2025學(xué)年成都市石室聯(lián)中七年級上英語期末考試題(含答案)
- 2025年度服務(wù)外包合同:銀行呼叫中心服務(wù)外包協(xié)議3篇
- 【課件】跨學(xué)科實(shí)踐制作微型密度計(jì)++課件人教版物理八年級下冊
- 北師大版五年級數(shù)學(xué)下冊第4課時(shí)體積單位的換算課件
- Module 2 Unit 2 I dont like ginger. (說課稿)-2024-2025學(xué)年外研版(一起)英語二年級上冊
- 2025年新高考語文模擬考試試卷(五) (含答案解析)
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》專題培訓(xùn)
評論
0/150
提交評論