![單片機(jī)最小系統(tǒng)設(shè)計(jì)的制作訓(xùn)練_第1頁](http://file4.renrendoc.com/view/ee857cb6d71e8201d1066ebd1b957446/ee857cb6d71e8201d1066ebd1b9574461.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)的制作訓(xùn)練_第2頁](http://file4.renrendoc.com/view/ee857cb6d71e8201d1066ebd1b957446/ee857cb6d71e8201d1066ebd1b9574462.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)的制作訓(xùn)練_第3頁](http://file4.renrendoc.com/view/ee857cb6d71e8201d1066ebd1b957446/ee857cb6d71e8201d1066ebd1b9574463.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)的制作訓(xùn)練_第4頁](http://file4.renrendoc.com/view/ee857cb6d71e8201d1066ebd1b957446/ee857cb6d71e8201d1066ebd1b9574464.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)的制作訓(xùn)練_第5頁](http://file4.renrendoc.com/view/ee857cb6d71e8201d1066ebd1b957446/ee857cb6d71e8201d1066ebd1b9574465.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
-.z單片機(jī)最小系統(tǒng)設(shè)計(jì)制作訓(xùn)練3.1單片機(jī)最小系統(tǒng)設(shè)計(jì)制作單片機(jī)最小系統(tǒng)電路板硬件設(shè)計(jì)單片機(jī)的主要功能是負(fù)責(zé)整個(gè)系統(tǒng)的控制,不承當(dāng)復(fù)雜的數(shù)據(jù)處理任務(wù),因此在設(shè)計(jì)單片機(jī)最小系統(tǒng)時(shí)通常選用AT89C5l、AT89C52、AT89S51、AT89S52〔S系列芯片支持ISP功能〕等型號(hào)的8位單片機(jī)作為MCU一個(gè)典型的單片機(jī)最小系統(tǒng)一般由時(shí)鐘電路、復(fù)位電路、片外RAM、片外ROM、按鍵、數(shù)碼管、液晶顯示器、外部擴(kuò)展接口等局部組成,圖3.1、圖3.2分別給出了單片機(jī)最小系統(tǒng)的構(gòu)造框圖、原理圖。圖3.1單片機(jī)最小系統(tǒng)的構(gòu)造框圖圖3.2原理圖單片機(jī)最小系統(tǒng)時(shí)鐘、復(fù)位、譯碼電路簡介1、時(shí)鐘源電路單片機(jī)內(nèi)部具有一個(gè)高增益反相放大器,用于構(gòu)成振蕩器。通常在引腳*TALl和*TAL2跨接石英晶體和兩個(gè)補(bǔ)償電容構(gòu)成自激振蕩器,構(gòu)造如圖2中Y1、C16、C17。可以根據(jù)情況選擇6MHz、12MHz或24MHz等頻率的石英晶體,補(bǔ)償電容通常選擇30pF左右的瓷片電容。2、復(fù)位電路單片機(jī)小系統(tǒng)采用上電自動(dòng)復(fù)位和手動(dòng)按鍵復(fù)位兩種方式實(shí)現(xiàn)系統(tǒng)的復(fù)位操作。上電復(fù)位要求接通電源后,自動(dòng)實(shí)現(xiàn)復(fù)位操作。手動(dòng)復(fù)位要求在電源接通的條件下,在單片機(jī)運(yùn)行期間,用按鈕開關(guān)操作使單片機(jī)復(fù)位。其構(gòu)造如圖2中R24、R26、C18和K17。上電自動(dòng)復(fù)位通過電容C18充電來實(shí)現(xiàn)。手動(dòng)按鍵復(fù)位是通過按鍵將電阻R26與VCC接通來實(shí)現(xiàn)。3、地址譯碼電路最小系統(tǒng)上的全部硬件除EEPROM以外均是采用總線方式進(jìn)展擴(kuò)展的,每一個(gè)硬件均占用特定的物理地址。為了減少芯片的使用數(shù)量和降低PCB板布線的復(fù)雜度,本系統(tǒng)使用小規(guī)??删幊踢壿嬈骷礼AL代替74系列芯片實(shí)現(xiàn)譯碼電路。具體硬件見圖2中U24。3.2鍵盤顯示電路設(shè)計(jì)鍵盤接口電路及程序設(shè)計(jì)單片機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換成為電氣上的邏輯關(guān)系。也就是說,它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便與通用數(shù)字系統(tǒng)的邏輯電平相容。小系統(tǒng)上設(shè)置了一個(gè)2行乘8列的陣列式鍵盤,系統(tǒng)硬件電路如圖4所示。電路構(gòu)造采用總線擴(kuò)展方式進(jìn)展設(shè)計(jì),同時(shí)使用P13和P14進(jìn)展行選擇,按鍵信號(hào)通過一片74LS245掛接到數(shù)據(jù)總線上,片選信號(hào)為KEY_CS,為其分配的物理地址為0*A100。圖3.3鍵盤接口電路由于系統(tǒng)的鍵盤接口采用的是總線方式,因此讀取按鍵數(shù)值變得相當(dāng)方便,下面是使用C編寫的讀取鍵盤程序:*defineKEY*BYTE[0*A100]//鍵盤地址sbitfirst_row=P1^4;//鍵盤第一行控制sbitsecond_row=P1^3;//鍵盤第二行控制ucharM_key;//鍵盤數(shù)值暫存單元first_row=0;//讀取第一行鍵盤數(shù)值second_row=1;M_key=KEY;first_row=1;//讀取第二行鍵盤數(shù)值second_row=0;M_key=KEY;系統(tǒng)采用定時(shí)掃描的方式〔掃描間隔為4ms,內(nèi)部定時(shí)器定時(shí)中斷間隔為2ms,每兩次定時(shí)中斷進(jìn)展一次鍵盤掃描〕進(jìn)展鍵盤識(shí)別,設(shè)計(jì)程序時(shí)通常要進(jìn)展以下四個(gè)方面的處理:〔1〕每隔4ms讀取一次鍵盤的數(shù)值,判斷有無按鍵按下。具體方法是令first_row=0,second_row=0,M_key=KEY,判斷M_key的值是否為0*FF,如果等于0*FF說明沒有按鍵按下,如果不等于0*FF說明有按鍵按下?!?〕去除按鍵的機(jī)械抖動(dòng)影響。通過設(shè)置狀態(tài)標(biāo)志位first_getkey來判斷連續(xù)兩次掃描鍵盤是否都檢測到有按鍵按下。如果沒有連續(xù)兩次都檢測到按鍵按下則按照鍵抖動(dòng)處理;否則,認(rèn)為確實(shí)有按鍵按下。〔3〕準(zhǔn)確輸出按鍵值keynum,并提供獲得有效按鍵標(biāo)志getkey?!?〕防止按鍵沖突。在獲得有效按鍵以后設(shè)定狀態(tài)標(biāo)志位keyon來實(shí)現(xiàn)每次只處理一個(gè)按鍵,且無論一次按鍵時(shí)間有多長,系統(tǒng)僅執(zhí)行一次按鍵功能程序。鍵盤識(shí)別程序流程如圖3.4所示。程序代碼將在介紹完數(shù)碼管顯示器以后統(tǒng)一給出。圖3.4鍵盤識(shí)別程序流程數(shù)碼管接口電路及程序設(shè)計(jì)本系統(tǒng)共設(shè)置了8個(gè)7段碼數(shù)碼管顯示器,電路構(gòu)造如圖3.5所示。圖3.58個(gè)7段碼數(shù)碼管顯示器電路電路構(gòu)造同樣采用總線擴(kuò)展方式進(jìn)展設(shè)計(jì),其中使用的數(shù)碼管為連4位的共陽型數(shù)碼管。通過芯片U15〔74HC573〕鎖存,為數(shù)碼管提供段碼數(shù)據(jù)。通過芯片U14〔74HC573〕、U13〔74HC138〕以及三極管Q1—Q8將低三位地址A2..0進(jìn)展硬件譯碼,為每個(gè)數(shù)碼管提供一個(gè)唯一的物理地址,具體地址為0*A000—0*A007。此外本電路構(gòu)造還考慮了不同數(shù)碼管進(jìn)展顯示切換時(shí)的消隱問題,在編寫程序時(shí)不用通過額外的處理進(jìn)展消隱。由于為每個(gè)數(shù)碼管都分配了一個(gè)固定的物理地址,在編寫程序時(shí)只要將相應(yīng)的段碼數(shù)據(jù)寫入到對(duì)應(yīng)的地址當(dāng)中便可以完成顯示,例如要在第二個(gè)數(shù)碼管上顯示“1〞,使用C語言辦成實(shí)現(xiàn)如下:*define7SEG_LED2*BYTE[0*A001]//第二個(gè)數(shù)碼管的地址定義7SEG_LED2=0*F9;//將“1”的段碼數(shù)據(jù)“0*F9//存器U15上,同時(shí)低三位地址A2..0“001//經(jīng)過硬件譯碼使位碼LED2為高。通過上面一條語句便可以實(shí)現(xiàn)在第二個(gè)數(shù)碼管上顯示“1〞的操作。但由于全部數(shù)碼管的段碼線共用,在同一時(shí)刻只能點(diǎn)亮一個(gè)數(shù)碼管,所以在實(shí)際應(yīng)用中必須采用動(dòng)態(tài)掃描的方式進(jìn)展8個(gè)數(shù)碼管的顯示。具體實(shí)現(xiàn)方法是使用內(nèi)部定時(shí)器每2ms產(chǎn)生一次定時(shí)中斷,系統(tǒng)在每進(jìn)入到一次定時(shí)中斷后更新一次顯示內(nèi)容,對(duì)于每個(gè)數(shù)碼管來說其顯示的周期為16ms,由于顯示頻率足夠高人眼感覺不到閃爍的存在。數(shù)碼管顯示程序流程如下:圖3.6數(shù)碼管顯示程序流程在編寫程序時(shí)考慮到單片機(jī)的資源利用情況,使用一個(gè)定時(shí)器為鍵盤掃描和數(shù)碼管顯示更新提供定時(shí)效勞,定時(shí)中斷函數(shù)流程如圖3.7所示。定時(shí)器定時(shí)間隔為2ms,每次進(jìn)入中斷調(diào)用一次顯示更新函數(shù),每兩次進(jìn)入中斷調(diào)用一次掃描鍵盤函數(shù)。圖3.8給出了利用以上給出的鍵盤掃描和數(shù)碼管顯示以及中斷函數(shù)實(shí)現(xiàn)一個(gè)最簡單系統(tǒng)的主程序流程圖。在主程序中通過查詢方式判斷getkey〔獲得有效按鍵標(biāo)志位,當(dāng)獲得一個(gè)有效按鍵后鍵盤掃描函數(shù)講其置為1〕,當(dāng)獲得有效按鍵后令所有的數(shù)碼管顯示按鍵的數(shù)值。圖3.7定時(shí)中斷函數(shù)流程圖3.8主程序流程圖C程序代碼如下:*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar/*數(shù)碼管物理地址*/*defineLED1*BYTE[0*A000]*defineLED2*BYTE[0*A001]*defineLED3*BYTE[0*A002]*defineLED4*BYTE[0*A003]*defineLED5*BYTE[0*A004]*defineLED6*BYTE[0*A005]*defineLED7*BYTE[0*A006]*defineLED8*BYTE[0*A007]/*鍵盤物理地址*/*defineKEY*BYTE[0*A100]/*掃描鍵盤使用的變量*/sbitfirst_row=P1^4;//鍵盤第一行控制sbitsecond_row=P1^3;//鍵盤第二行控制bitfirst_getkey=0,control_readkey=0;//讀鍵盤過程中的標(biāo)志位bitgetkey=0;//獲得有效鍵值標(biāo)志位,等于1時(shí)代表得到一個(gè)有效鍵值bitkeyon=0;//防止按鍵沖突標(biāo)志位ucharkeynum=0;//獲得的有效按鍵值存放器/*數(shù)碼管顯示使用的變量和常量*/ucharlednum=0;//數(shù)碼管顯示位控制存放器ucharled[8]={0,0,0,0,0,0,0,0};//數(shù)碼管顯示內(nèi)容存放器ucharcodesegtab[18]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e,0*8c,0*ff};//七段碼段碼表//"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","P","black"/*函數(shù)聲明*/voidleddisp(void);//數(shù)碼管顯示更新函數(shù)voidreadkey(void);//鍵盤掃描函數(shù)/*T0定時(shí)中斷處理函數(shù)*/voidintT0()interrupt1{TH0=-4230/256;//定時(shí)器中斷時(shí)間間隔2msTL0=-4230%256;leddisp();//每次定時(shí)中斷顯示更新一次if(control_readkey==1)//每兩次定時(shí)中斷掃描一次鍵盤{readkey();}control_readkey=!control_readkey;}/*主函數(shù)*/voidmain(void){TMOD=0*01;//設(shè)定定時(shí)器T0工作模式為模式1TH0=-4230/256;//定時(shí)器中斷時(shí)間間隔2msTL0=-4230%256;TCON=0*10;ET0=1;EA=1;while(1)//等待獲得有效按鍵{if(getkey==1)//判斷是否獲得有效按鍵{getkey=0;//當(dāng)獲得有效按鍵時(shí),去除標(biāo)志位。led[0]=keynum;//令全部數(shù)碼管顯示按鍵值led[1]=keynum;led[2]=keynum;led[3]=keynum;led[4]=keynum;led[5]=keynum;-.zled[6]=keynum;led[7]=keynum;}}}-.z/***************************************************鍵盤掃描函數(shù)原型:voidreadkey(void);功能:當(dāng)獲得有效按鍵時(shí),令getkey=1,keynum為按鍵值****************************************************/voidreadkey(void){ucharM_key=0;////鍵盤數(shù)值暫存單元first_row=0;second_row=0;M_key=KEY;if(M_key!=0*ff)//如果有連續(xù)兩次按鍵按下,認(rèn)為有有效按鍵按下。消除按鍵抖動(dòng){if(first_getkey==0){first_getkey=1;}else//當(dāng)有有效按鍵按下時(shí),進(jìn)一步識(shí)別是哪一個(gè)按鍵{if(keyon==0)//防止按鍵沖突,當(dāng)還有未釋放的按鍵時(shí)不對(duì)其它按鍵動(dòng)作響應(yīng){first_row=0;//掃描第一行按鍵second_row=1;M_key=KEY;if(M_key!=0*ff){switch(M_key){case0*fe:keynum=0*00;break;case0*fd:keynum=0*01;break;case0*fb:keynum=0*02;break;case0*f7:keynum=0*03;break;case0*ef:keynum=0*04;break;case0*df:keynum=0*05;break;case0*bf:keynum=0*06;break;case0*7f:keynum=0*07;break;}}else{second_row=0;//掃描第二行按鍵first_row=1;M_key=KEY;switch(M_key){case0*fe:keynum=0*08;break;case0*fd:keynum=0*09;break;case0*fb:keynum=0*0a;break;case0*f7:keynum=0*0b;break;case0*ef:keynum=0*0c;break;case0*df:keynum=0*0d;break;case0*bf:keynum=0*0e;break;case0*7f:keynum=0*0f;break;}}getkey=1;//獲得有效按鍵數(shù)值keyon=1;//防止按鍵沖突,當(dāng)獲得有效按鍵時(shí)將其置1}}}else{first_getkey=0;keyon=0;//防止按鍵沖突,當(dāng)所有的按鍵都釋放時(shí)將其清0}}/***************************************************數(shù)碼管顯示函數(shù)原型:voidleddisp(void);功能:每次調(diào)用輪流顯示一位數(shù)碼管****************************************************/voidleddisp(void){switch(lednum)//選擇需要顯示的數(shù)碼位{case0:LED1=segtab[led[0]];break;case1:LED2=segtab[led[1]];break;case2:LED3=segtab[led[2]];break;case3:LED4=segtab[led[3]];break;case4:LED5=segtab[led[4]];break;case5:LED6=segtab[led[5]];break;case6:LED7=segtab[led[6]];break;case7:LED8=segtab[led[7]];break;}if(lednum==0)//更新需要顯示的數(shù)碼管位置{lednum=7;}else{lednum=lednum-1;}}液晶接口電路及程序設(shè)計(jì)傳統(tǒng)的顯示器件數(shù)碼管已經(jīng)不能滿足顯示復(fù)雜操作界面的要求。因此最小系統(tǒng)中除了數(shù)碼管顯示器以外,還接入了一個(gè)液晶顯示模塊,其型號(hào)為SGM12864C,可以顯示64行128列的點(diǎn)陣數(shù)據(jù),通過編寫相應(yīng)的程序可以顯示英文、漢字或圖形,可以實(shí)現(xiàn)比擬復(fù)雜的用戶操作界面。硬件接口電路如圖3.9所示。液晶模塊的構(gòu)造及操作控制請參閱SMG12864C.PDF。圖3.9硬件接口電路在硬件設(shè)計(jì)中使用譯碼電路提供的LCD_R_CS、LCD_L_CS、LCD_E為液晶模塊提供片選及使能信號(hào)。使用系統(tǒng)的地址信號(hào)A0控制向液晶寫入的是命令字還是數(shù)據(jù)字。此外將液晶的讀寫控制端接地,制止從液晶中讀數(shù)據(jù),在向液晶中寫入一個(gè)數(shù)據(jù)或命令后延時(shí)一段時(shí)間再向其中寫入新的數(shù)據(jù),防止由于液晶處在忙狀態(tài)導(dǎo)致寫入錯(cuò)誤的情況發(fā)生。根據(jù)地址譯碼器提供的地址以及信號(hào)A0,可以得出向液晶左右兩個(gè)控制器中寫入命令和數(shù)據(jù)的物理地址,下面給出在C語言中的具體定義:*defineLCD_L_DATA*BYTE[0*A201]//左半邊液晶數(shù)據(jù)地址*defineLCD_R_DATA*BYTE[0*A301]//右半邊液晶數(shù)據(jù)地址*defineLCD_L_mand*BYTE[0*A200]//左半邊液晶命令地址*defineLCD_R_mand*BYTE[0*A300]//右半邊液晶命令地址為了使液晶能夠顯示字符、漢字以及圖形,需要對(duì)其進(jìn)展正確的設(shè)置,具體過程如下:〔1〕在系統(tǒng)上電后對(duì)其進(jìn)展初始化設(shè)置。向左右兩局部控制器寫入控制字0*C0,設(shè)置顯示的初始行。向左右兩局部控制器寫入控制字0*3F,將液晶的左右兩局部顯示開啟。此局部功能由后面給出程序中的lcd_initial()函數(shù)完成?!?〕在液晶指定位置顯示給定的數(shù)據(jù)。完成液晶的初始化以后,通過寫入命令字確定顯示的列地址和頁地址,然后寫入需要顯示的數(shù)據(jù)。以下給出了在液晶指定位置顯示大小為8*8字符、16*16漢字以及128*64圖形的C語言程序,用戶可以根據(jù)需要利用函數(shù)lcd_write_byte()編寫顯示任意大小圖形和文字的函數(shù)。*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar*defineLCD_L_DATA*BYTE[0*A201]//左半邊液晶數(shù)據(jù)地址*defineLCD_R_DATA*BYTE[0*A301]//右半邊液晶數(shù)據(jù)地址*defineLCD_L_mand*BYTE[0*A200]//左半邊液晶命令地址*defineLCD_R_mand*BYTE[0*A300]//右半邊液晶命令地址ucharcodeG[8]={0*00,0*00,0*3e,0*41,0*49,0*49,0*7a,0*00};/*G*/ucharcodeU[8]={0*00,0*00,0*3f,0*40,0*40,0*40,0*3f,0*00};/*U*/ucharcodeO[8]={0*00,0*00,0*3e,0*41,0*41,0*41,0*3e,0*00};/*O*//*--宋體12;此字體下對(duì)應(yīng)的點(diǎn)陣為:寬*高=16*16--*//*--文字:國--*/ucharcodeguo[32]={0*00,0*FE,0*02,0*0A,0*8A,0*8A,0*8A,0*FA,0*8A,0*8A,0*8A,0*0A,0*02,0*FE,0*00,0*00,0*00,0*FF,0*40,0*48,0*48,0*48,0*48,0*4F,0*48,0*49,0*4E,0*48,0*40,0*FF,0*00,0*00};/*--文字:防--*/ucharcodefang[32]={0*00,0*FE,0*22,0*5A,0*86,0*02,0*08,0*08,0*F9,0*8E,0*88,0*88,0*88,0*08,0*08,0*00,0*00,0*FF,0*04,0*08,0*47,0*20,0*18,0*07,0*00,0*00,0*40,0*80,0*7F,0*00,0*00,0*00};/*--文字:科--*/ucharcodeke[32]={0*10,0*12,0*92,0*72,0*FE,0*51,0*91,0*00,0*22,0*CC,0*00,0*00,0*FF,0*00,0*00,0*00,0*04,0*02,0*01,0*00,0*FF,0*00,0*04,0*04,0*04,0*02,0*02,0*02,0*FF,0*01,0*01,0*00};/*--文字:技--*/ucharcodeji[32]={0*08,0*08,0*88,0*FF,0*48,0*28,0*00,0*C8,0*48,0*48,0*7F,0*48,0*C8,0*48,0*08,0*00,0*01,0*41,0*80,0*7F,0*00,0*40,0*40,0*20,0*13,0*0C,0*0C,0*12,0*21,0*60,0*20,0*00};/*--文字:大--*/ucharcodeda[32]={0*20,0*20,0*20,0*20,0*20,0*20,0*A0,0*7F,0*A0,0*20,0*20,0*20,0*20,0*20,0*20,0*00,0*00,0*80,0*40,0*20,0*10,0*0C,0*03,0*00,0*01,0*06,0*08,0*30,0*60,0*C0,0*40,0*00};/*--文字:學(xué)--*/ucharcode*ue[32]={0*40,0*30,0*10,0*12,0*5C,0*54,0*50,0*51,0*5E,0*D4,0*50,0*18,0*57,0*32,0*10,0*00,0*00,0*02,0*02,0*02,0*02,0*02,0*42,0*82,0*7F,0*02,0*02,0*02,0*02,0*02,0*02,0*00};/**********************************液晶驅(qū)動(dòng)函數(shù)聲明***********************************/voidlcd_initial(void);voidlcd_write_byte(uchar*pos,ucharypos,uchar*byte);voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr);voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr);voidlcd_clear(void);voidlcd_fill(void);voiddelay(uchartime_nop);voidmain(void){lcd_initial();//初始化液晶lcd_clear();//液晶清屏lcd_write_char(0,0,G);//顯示"A"lcd_write_char(1,0,U);//顯示"B"lcd_write_char(2,0,O);//顯示"C"lcd_write_hanzi(2,2,guo);//顯示"國"lcd_write_hanzi(4,2,fang);//顯示"防"lcd_write_hanzi(6,2,ke);//顯示"科"lcd_write_hanzi(8,2,ji);//顯示"技"lcd_write_hanzi(10,2,da);//顯示"大"lcd_write_hanzi(12,2,*ue);//顯示"學(xué)"while(1){}}/*******************************************************************延時(shí)函數(shù)函數(shù)原型:voiddelay(uchartime_nop);功能:延時(shí)time_nop個(gè)nop********************************************************************/voiddelay(uchartime_nop){uchari;for(i=0;i<time_nop;i++){_nop_();}}/******************************************************************************LCD初始化原型:voidlcd_initial(void);功能:將LCD進(jìn)展初始化,設(shè)置初始行并開顯示******************************************************************************/voidlcd_initial(void){delay(5);LCD_L_mand=0*C0;//設(shè)置顯示初始行delay(5);LCD_R_mand=0*C0;delay(5);LCD_L_mand=0*3F;//開顯示delay(5);LCD_R_mand=0*3F;delay(5);}/******************************************************************************向LCD中寫入一個(gè)字節(jié)數(shù)據(jù)函數(shù)原型:voidlcd_write_byte(uchar*pos,ucharypos,ucharbyte);功能:將一個(gè)字節(jié)數(shù)據(jù)byte寫入液晶的〔*pos,ypos〕的位置處此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)展定義,*pos為橫坐標(biāo)從左到右順序?yàn)?-127,ypos為縱坐標(biāo)從上到下順序?yàn)?-7。******************************************************************************/voidlcd_write_byte(uchar*pos,ucharypos,uchar*byte){if(*pos<=63)//坐標(biāo)位置處在液晶的左半局部{delay(5);LCD_L_mand=*pos+0*40;//設(shè)定寫入數(shù)據(jù)的列地址delay(5);LCD_L_mand=ypos+0*B8;//設(shè)定寫入數(shù)據(jù)的行地址delay(5);LCD_L_DATA=*byte;//向(*pos,ypos)處寫數(shù)據(jù)delay(5);}else//坐標(biāo)位置處在液晶的右半局部{delay(5);LCD_R_mand=(*pos-64)+0*40;//設(shè)定寫入數(shù)據(jù)的列地址delay(5);LCD_R_mand=ypos+0*B8;//設(shè)定寫入數(shù)據(jù)的行地址delay(5);LCD_R_DATA=*byte;//向(*pos,ypos)處寫數(shù)據(jù)delay(5);}}/******************************************************************************在LCD指定位置顯示一個(gè)ASIIC字符函數(shù)字符大小為8*8原型:voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr);功能:將一個(gè)字符數(shù)據(jù)寫入液晶的〔char_*pos,char_ypos〕的位置處此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)展定義,char_*pos為橫坐標(biāo)從左到右順序?yàn)?-15,char_ypos為縱坐標(biāo)從上到下順序?yàn)?-7。******************************************************************************/voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr){uchari=0;for(i=0;i<=7;i++){lcd_write_byte(char_*pos*8+i,char_ypos,char_source_addr+i);}}/******************************************************************************在LCD指定位置顯示一個(gè)漢字函數(shù)字符大小為16*16原型:voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr);功能:將一個(gè)漢字?jǐn)?shù)據(jù)寫入液晶的〔hanzi_*pos,hanzi_ypos〕的位置處,此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)展定義,hanzi_*pos為橫坐標(biāo)從左到右順序?yàn)?-14(以半個(gè)漢字符為單位),hanzi_ypos為縱坐標(biāo)從上到下順序?yàn)?-6(以半個(gè)漢字符為單位)。******************************************************************************/voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr){uchari=0;for(i=0;i<=15;i++)//寫漢字的上半局部{lcd_write_byte(hanzi_*pos*8+i,hanzi_ypos,hanzi_source_addr+i);}for(i=0;i<=15;i++)//寫漢字的下半局部{lcd_write_byte(hanzi_*pos*8+i,hanzi_ypos+1,hanzi_source_addr+16+i);}}/******************************************************************************LCD清屏原型:voidlcd_clear(void);功能:將LCD清屏******************************************************************************/voidlcd_clear(void){uchari,j;ucharbyte[1]={0*00};for(i=0;i<=127;i++){for(j=0;j<=7;j++){lcd_write_byte(i,j,byte);}}}/******************************************************************************LCD填充原型:voidlcd_fill(void);功能:將LCD填充為黑色******************************************************************************/voidlcd_fill(void){uchari,j;-.zucharbyte[1]={0*FF};for(i=0;i<=127;i++){for(j=0;j<=7;j++){lcd_write_byte(i,j,byte);}}}3.4單片機(jī)與D/A、A/D轉(zhuǎn)換電路制作A/D、D/A轉(zhuǎn)換器是單片機(jī)電路經(jīng)常要用到的器件。在電子設(shè)計(jì)中,很多時(shí)候需要處理模擬量,對(duì)模擬量進(jìn)展控制。這就要使用到A/D、D/A轉(zhuǎn)換器,將模擬量轉(zhuǎn)換成數(shù)字量,由單片計(jì)進(jìn)展處理,再將數(shù)字量轉(zhuǎn)換為模擬量,對(duì)外圍設(shè)備進(jìn)展控制。由于單片機(jī)本身工作速度慢,不能連接高速A/D、D/A轉(zhuǎn)換器,同時(shí)為了節(jié)省單片機(jī)IO口資源,本節(jié)僅就低速串行轉(zhuǎn)換器進(jìn)展介紹。如果需要使用高速A/D、D/A轉(zhuǎn)換器,請使用FPGA對(duì)其進(jìn)展控制。串行模數(shù)轉(zhuǎn)換器應(yīng)用串行輸出的A/D芯片由于節(jié)省單片機(jī)的I/O口線,越來越多地被采用。如具有SPI三線接口的TLC1549、TLC1543、TLC2543、MA*187等,具有2線IIC接口的MA*127、PCF8591〔4路8位A/D,還含1路8位D/A)等。本小節(jié)以串行A/D轉(zhuǎn)換器芯片TLC1549為例簡要介紹串行A/D轉(zhuǎn)換器的接口電路以及驅(qū)動(dòng)程序的設(shè)計(jì)。1、TLC1549的工作方式及時(shí)序TLC1549有6種工作方式,如表2所示。其中方式1和方式3屬同一類型,方式2和方式4屬同一類型。一般來說,時(shí)鐘頻率高于280kHz時(shí),可認(rèn)為是快速工作方式;低于280kHz時(shí),可認(rèn)為是慢速工作方式。因此,如果不考慮I/OCLOCK周期大小,方式5與方式3一樣,方式6與方式4一樣。表2TLC1549的工作方式工作方式1工作時(shí)序圖如圖3.10所示。圖中從EQ\*jc2\o\ad(\s\up17(————),CS)下跳到DATA輸出數(shù)據(jù)要有1.3μs的延時(shí);連續(xù)進(jìn)展A/D轉(zhuǎn)換時(shí),在上次轉(zhuǎn)換結(jié)果輸出的過程中,同時(shí)完本錢次轉(zhuǎn)換的采樣,這樣大大提高了A/D轉(zhuǎn)換的速率。如果I/OCLOCK的時(shí)鐘頻率為2.1MHz,則完成一次A/D轉(zhuǎn)換的時(shí)間大約為26μs。如果用連續(xù)模擬信號(hào)進(jìn)展采樣轉(zhuǎn)換,顯然其轉(zhuǎn)換速率是很高的。圖3.10方式1工作時(shí)序2、TLC1549與單片機(jī)最小系統(tǒng)的接口電路設(shè)計(jì)使用單片機(jī)小系統(tǒng)控制TLC1549,主要通過擴(kuò)展接口J4完成,J4各管腳信號(hào)定義請參見圖3.2小系統(tǒng)原理圖。需要控制的芯片管腳有三個(gè),分別為EQ\*jc2\o\ad(\s\up17(————),CS)、I/OCLOCK和DATAOUT,選用J4中的P10、P11和P12〔實(shí)際是單片機(jī)P1口中的三個(gè)I/O管腳〕分別控制TLC1549三個(gè)管腳。使用單片機(jī)的I/O模擬圖12中的操作時(shí)序,完成對(duì)TLC1549的控制。接口電路如圖3.11所示。在電路中使用VCC作為A/D的參考電平,由于VCC的不穩(wěn)定會(huì)降低轉(zhuǎn)換精度,因此可以選用專用的參考電壓芯片,提高轉(zhuǎn)換精度。圖3.11接口電路3、A/D轉(zhuǎn)換接口程序設(shè)計(jì)編寫驅(qū)動(dòng)TLC1549的程序,就是通過軟件的方法控制P10、P11和P12,產(chǎn)生如圖3.10中的操作時(shí)序,完成一次A/D轉(zhuǎn)換。使用C編寫的采樣函數(shù)如下:*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedintsbitAD_CS=P1^0;//TLC1549片選信號(hào)sbitAD_IOCLOCK=P1^1;//TLC1549時(shí)鐘信號(hào)sbitAD_DATAOUT=P1^2;//TLC1549數(shù)據(jù)輸出信號(hào)/*A/D轉(zhuǎn)換函數(shù)聲明*/uintad_convert(void);voiddelay(uchartime_nop);voidmain(void){uintad_data_10bit;//低10位為有效數(shù)據(jù)AD_CS=1;//初始化TLC1549AD_IOCLOCK=0;while(1){ad_data_10bit=ad_convert();delay(50);//完成一次采樣后要延時(shí)21us,等待下一次采樣結(jié)果轉(zhuǎn)換完成}}/*************************************************************AD轉(zhuǎn)換函數(shù)函數(shù)原型:uintad_convert(void);功能:驅(qū)動(dòng)TLC1549完成一次A/D采樣返回值為AD轉(zhuǎn)換結(jié)果,使用16bit的uint型數(shù)據(jù)表示,低10位有效.*************************************************************/uintad_convert(void){uchari;uintAD_DATA=0;AD_CS=0;for(i=0;i<=9;i++){AD_IOCLOCK=0;if(AD_DATAOUT==1){AD_DATA=AD_DATA*2+1;}else{AD_DATA=AD_DATA*2;}AD_IOCLOCK=1;}AD_IOCLOCK=0;AD_CS=0;return(AD_DATA);}/*******************************************************************延時(shí)函數(shù)函數(shù)原型:voiddelay(uchartime_nop);功能:延時(shí)time_nop個(gè)nop********************************************************************/voiddelay(uchartime_nop){uchari;for(i=0;i<time_nop;i++){_nop_();}}串行數(shù)模轉(zhuǎn)換器應(yīng)用單片機(jī)實(shí)現(xiàn)控制是以數(shù)字信號(hào)或模擬信號(hào)的形式通過I/O口送給被控對(duì)象的。模擬信號(hào)的產(chǎn)生通常需要D/A轉(zhuǎn)換器的參與。本小節(jié)以串行D/A轉(zhuǎn)換芯片T
溫馨提示
- 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)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度中式烤鴨技藝傳承學(xué)員收費(fèi)合作合同
- 2025年度花卉苗木種植與旅游觀光融合合同
- 2025年度教育培訓(xùn)行業(yè)數(shù)字化轉(zhuǎn)型咨詢與服務(wù)合同協(xié)議
- 2025年度智能機(jī)器人制造合作合同范本
- 2025年度人工智能教育與人才培養(yǎng)股權(quán)分配合同范本
- 2025年度職業(yè)培訓(xùn)基地共建與運(yùn)營管理合同書
- 2025年度腳手架工程安全監(jiān)督及驗(yàn)收合同
- 2025年度國際技術(shù)合同合同簽訂與審查
- 2025年度智能投顧個(gè)性化金融投資咨詢服務(wù)合同
- 2025年度廣告經(jīng)營資質(zhì)借用管理合同
- 體質(zhì)健康概論
- 檔案管理流程優(yōu)化與效率提升
- 顱腦損傷的生物標(biāo)志物
- 2023高考語文實(shí)用類文本閱讀-新聞、通訊、訪談(含答案)
- 人工智能在商場應(yīng)用
- (完整word版)大格子作文紙模板(帶字?jǐn)?shù)統(tǒng)計(jì))
- 高考語文復(fù)習(xí):小說閱讀主觀題題型探究-解讀《理水》
- 物流營銷(第四版) 課件 第一章 物流營銷概述
- 藍(lán)印花布鑒賞課件
- 血液灌流流程及注意事項(xiàng)詳細(xì)圖解
- 5A+Chapter+2+Turning+over+a+new+leaf 英語精講課件
評(píng)論
0/150
提交評(píng)論