![單片機(jī)最小系統(tǒng)設(shè)計(jì)制作訓(xùn)練_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/af67750c-482b-4b27-9258-289c4128198c/af67750c-482b-4b27-9258-289c4128198c1.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)制作訓(xùn)練_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/af67750c-482b-4b27-9258-289c4128198c/af67750c-482b-4b27-9258-289c4128198c2.gif)
![單片機(jī)最小系統(tǒng)設(shè)計(jì)制作訓(xùn)練_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/af67750c-482b-4b27-9258-289c4128198c/af67750c-482b-4b27-9258-289c4128198c3.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、8位7段碼數(shù)碼管89S51單片機(jī)32K靜態(tài)RAMEEPROM單片機(jī)最小系統(tǒng)設(shè)計(jì)制作訓(xùn)練3.1單片機(jī)最小系統(tǒng)設(shè)計(jì)制作3.1.1單片機(jī)最小系統(tǒng)電路板硬件設(shè)計(jì)單片機(jī)的主要功能是負(fù)責(zé)整個(gè)系統(tǒng)的控制,不承擔(dān)復(fù)雜的數(shù)據(jù)處理任務(wù),因此在設(shè)計(jì)單片機(jī)最小系統(tǒng)時(shí)通常選用 AT89C5I、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)的結(jié)構(gòu)框圖、原理圖。地址、數(shù)抓中斷.片選擴(kuò)展接I 1圖3
2、.1單片機(jī)最小系統(tǒng)的結(jié)構(gòu)框圖I144TLEDtUWV Ms丁*:& 二1 號(hào)2<*莒復(fù)E自 一soov 1E3MKMV 首o(hù)n§-ndJaJ. £ UMml 一 J* gd£»ni 事旦 G a圖3.2原理圖單片機(jī)最小系統(tǒng)時(shí)鐘、復(fù)位、譯碼電路簡(jiǎn)介單片機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開(kāi)關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換成為電氣上的邏輯關(guān)系。也就是說(shuō),它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便與通用數(shù)字系統(tǒng)的邏輯電平相容。小系統(tǒng)上設(shè)置了一個(gè)2行乘8列的陣列式鍵盤,系統(tǒng)硬件電路如圖4所示。電路結(jié)構(gòu)采用總線擴(kuò)展方式進(jìn)行設(shè)計(jì),同時(shí)使用P13和P14進(jìn)行行選擇,按
3、鍵信號(hào)通過(guò)一片74LS245掛接到數(shù)據(jù)總線上,片選信號(hào)為KEY_CS, 為其分配的物理地址為OxAlOO。圖3.3鍵盤接口電路由于系統(tǒng)的鍵盤接口采用的是總線方式,因此讀取按鍵數(shù)值變得相當(dāng)方便,下面是使用C編寫的讀取鍵盤程序:#define KEY XBYTE OxAlOO / 鍵盤地址sbit first_row = P1A4; II 鍵盤第一行控制sbit sec on d_row = P"3; II 鍵盤第二行控制uchar M_key ; II鍵盤數(shù)值暫存單元 first_row = 0 ; II讀取第一行鍵盤數(shù)值 sec on d_row = 1 ;M_key = KEY;f
4、irst_row = 1 ; II讀取第二行鍵盤數(shù)值sec on d_row = 0 ;M_key = KEY;系統(tǒng)采用定時(shí)掃描的方式(掃描間隔為 4ms,內(nèi)部定時(shí)器定時(shí)中斷間隔為2ms,每?jī)纱味〞r(shí)中斷進(jìn)行一次鍵盤掃描)進(jìn)行鍵盤識(shí)別,設(shè)計(jì)程序時(shí)通常要進(jìn)行以下四個(gè)方面的處理:(1) 每隔4ms讀取一次鍵盤的數(shù)值, 判斷有無(wú)按鍵按下。 具體方法是令first_row = 0,second_row = 0,M_key = KEY,判斷M_key的值是否為OxFF,如果等于OxFF說(shuō)明沒(méi)有按鍵按下,如果不等于 OxFF說(shuō) 明有按鍵按下。(2) 去除按鍵的機(jī)械抖動(dòng)影響。通過(guò)設(shè)置狀態(tài)標(biāo)志位first_ge
5、tkey來(lái)判斷連續(xù)兩次掃描鍵盤是否都 檢測(cè)到有按鍵按下。如果沒(méi)有連續(xù)兩次都檢測(cè)到按鍵按下則按照鍵抖動(dòng)處理;否則,認(rèn)為確實(shí)有按鍵按下。(3) 準(zhǔn)確輸出按鍵值key num,并提供獲得有效按鍵標(biāo)志getkey。(4) 防止按鍵沖突。在獲得有效按鍵以后設(shè)定狀態(tài)標(biāo)志位keyon來(lái)實(shí)現(xiàn)每次只處理一個(gè)按鍵,且 無(wú)論一次按鍵時(shí)間有多長(zhǎng),系統(tǒng)僅執(zhí)行一次按鍵功能程序。鍵盤識(shí)別程序流程如圖3.4所示。程序代碼將在介紹完數(shù)碼管顯示器以后統(tǒng)一給出?;鹪?sw=O. M_KEY; 掃搏二療出鼻1>&Ml飛7nyK-lmunr*eynmr*K.?1unr L-3231-圖3.4鍵盤識(shí)別程序流程本系統(tǒng)共設(shè)置了
6、 8個(gè)7段碼數(shù)碼管顯示器,電路結(jié)構(gòu)如圖3.5所示。'一K |r-6 a 0 6 6 o o cL QQlJ_-2KT=:lIKLB3 口 =CT工_1T3 :4t S 1/匚3 d ©倉(cāng)K<ICi*L1D:ILEiILED50Hii-2AB匚DEF R22ICOTl S3!CDZF9圖3.58個(gè)7段碼數(shù)碼管顯示器電路電路結(jié)構(gòu)同樣采用總線擴(kuò)展方式進(jìn)行設(shè)計(jì),其中使用的數(shù)碼管為連4位的共陽(yáng)型數(shù)碼管。通過(guò)芯片U15( 74HC573)鎖存,為數(shù)碼管提供段碼數(shù)據(jù)。通過(guò)芯片U14( 74HC573 )、U13( 74HC138 )以及三極管Q1 Q8將低三位地址 A2.0進(jìn)行硬件譯
7、碼,為每個(gè)數(shù)碼管提供一個(gè)唯一的物理地址,具體地址為OxAOOO 0XA007。此外本電路結(jié)構(gòu)還考慮了不同數(shù)碼管進(jìn)行顯示切換時(shí)的消隱問(wèn)題,在編寫程序時(shí)不用通過(guò)額外的處理進(jìn)行消隱。由于為每個(gè)數(shù)碼管都分配了一個(gè)固定的物理地址,在編寫程序時(shí)只要將相應(yīng)的段碼數(shù)據(jù)寫入到對(duì)應(yīng)的地址當(dāng)中便可以完成顯示,例如要在第二個(gè)數(shù)碼管上顯示“ 1,使用C語(yǔ)言辦成實(shí)現(xiàn)如下:#define 7SEG_LED2 XBYTE OxAOOl / 第二個(gè)數(shù)碼管的地址定義 7SEG_LED2 = 0xF9 ;將1”的段碼數(shù)據(jù) 0xF9 ”輸出到段碼鎖存器U15上,同時(shí)低三位地址 A2.0 001 ”/經(jīng)過(guò)硬件譯碼使位碼 LED2為高。
8、通過(guò)上面一條語(yǔ)句便可以實(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ù)碼管來(lái)說(shuō)其顯示的周期為16ms,由于顯示頻率足夠 高人眼感覺(jué)不到閃爍的存在。數(shù)碼管顯示程序流程如下:圖3.6數(shù)碼管顯示程序流程在編寫程序時(shí)考慮到單片機(jī)的資源利用情況,使用一個(gè)定時(shí)器為鍵盤掃描和數(shù)碼管顯示更新提供 定時(shí)服務(wù),定時(shí)中斷函數(shù)流程如圖3.7所示。定時(shí)器定時(shí)間隔為2ms,每次進(jìn)入中斷調(diào)用一次顯示更新函 數(shù)
9、,每?jī)纱芜M(jìn)入中斷調(diào)用一次掃描鍵盤函數(shù)。圖3.8給出了利用以上給出的鍵盤掃描和數(shù)碼管顯示以及中斷函數(shù)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單系統(tǒng)的主程序流程圖。在主程序中通過(guò)查詢方式判斷getkey (獲得有效按鍵標(biāo)志位,當(dāng)獲得一個(gè)有效按鍵后鍵盤掃描函數(shù)講其置為1),當(dāng)獲得有效按鍵后令所有的數(shù)碼管顯示按鍵的數(shù)值。intTO()圖3.7定時(shí)中斷函數(shù)流程main圖3.8主程序流程圖C程序代碼如下:#in elude <absacc.h>#in elude <reg51.h>#in clude< intrin s.h>#defi ne uchar un sig ned char/*數(shù)碼管物理
10、地址*/#defi ne LED1 XBYTE OxAOOO#defi ne LED2 XBYTE 0xA001#defi ne LED3 XBYTE 0xA002#defi ne LED4 XBYTE 0xA003#defi ne LED5 XBYTE 0xA004#defi ne LED6 XBYTE 0xA005#defi ne LED7 XBYTE 0xA006#defi ne LED8 XBYTE 0xA007/*鍵盤物理地址*/#defi ne KEY XBYTE 0xA100/*掃描鍵盤使用的變量*/sbit first_row = P1A4; / 鍵盤第一行控制sbit sec
11、ond_row = PU3; / 鍵盤第二行控制bit first_getkey = 0,control_readkey = 0; / 讀鍵盤過(guò)程中的標(biāo)志位bit getkey = 0; /獲得有效鍵值標(biāo)志位,等于1時(shí)代表得到一個(gè)有效鍵值bit keyon = 0; /防止按鍵沖突標(biāo)志位uchar key num = 0; /獲得的有效按鍵值寄存器/*數(shù)碼管顯示使用的變量和常量*/uchar lednum = 0; / 數(shù)碼管顯示位控制寄存器uchar led8 = 0,0,0,0,0,0,0,0; / 數(shù)碼管顯示內(nèi)容寄存器uchar code segtab18 = 0xc0,0xf9,0xa
12、4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0x8c,0xff; / 七段碼段碼表/ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", &
13、quot;E", "F", "P" ,"black"/* 函數(shù)聲明 */void leddisp(void); / 數(shù)碼管顯示更新函數(shù)void readkey(void); / 鍵盤掃描函數(shù)/ *T0 定時(shí)中斷處理函數(shù) */void intT0() interrupt 1TH0 = -4230/256; / 定時(shí)器中斷時(shí)間間隔 2msTL0 = -4230%256;leddisp(); / 每次定時(shí)中斷顯示更新一次if(control_readkey = 1) / 每?jī)纱味〞r(shí)中斷掃描一次鍵盤readkey();control
14、_readkey = !control_readkey;/* 主函數(shù) */void main(void)TMOD = 0x01; /設(shè)定定時(shí)器TO工作模式為模式1TH0 = -4230/256; /定時(shí)器中斷時(shí)間間隔 2msTL0 = -4230%256;TCON = 0x10;ET0 = 1;EA = 1;while(1) /等待獲得有效按鍵if(getkey = 1) / 判斷是否獲得有效按鍵getkey = 0; / 當(dāng)獲得有效按鍵時(shí),清除標(biāo)志位。led0 = keynum; / 令全部數(shù)碼管顯示按鍵值led1 = keynum;led2 = keynum;led3 = keynum;l
15、ed4 = keynum;led5 = keynum;led6=keynum;led7=keynum;/* 鍵盤掃描函數(shù) 原型 : void readkey(void);功能:當(dāng)獲得有效按鍵時(shí),令getkey=1, key num為按鍵值*/void readkey(void)uchar M_key = 0; / 鍵盤數(shù)值暫存單元 first_row = 0;second_row = 0;M_key = KEY;if(M_key != 0xff) / 如果有連續(xù)兩次按鍵按下,認(rèn)為有有效按鍵按下。消除按鍵抖動(dòng) if(first_getkey = 0)first_getkey = 1;else /
16、當(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 != 0xff)switch(M_key)case 0xfe:keynum = 0x00;break;case 0xfd:keynum = 0x01;break;case 0xfb:keynum = 0x02;break;case 0xf7:keynum = 0x03;break;case 0xef:keynum = 0x04;break;case
17、 0xdf:keynum = 0x05;break;case 0xbf:keynum = 0x06;break;case 0x7f:keynum = 0x07;break;else second_row = 0; / 掃描第二行按鍵 first_row = 1;M_key = KEY; switch(M_key) case 0xfe: keynum = 0x08; break; case 0xfd: keynum = 0x09; break; case 0xfb: keynum = 0x0a; break; case 0xf7: keynum = 0x0b; break; case 0xef:
18、 keynum = 0x0c; break; case 0xdf: keynum = 0x0d; break; case 0xbf: keynum = 0x0e; break; case 0x7f: keynum = 0x0f; break;getkey = 1; / 獲得有效按鍵數(shù)值keyon = 1; / 防止按鍵沖突,當(dāng)獲得有效按鍵時(shí)將其置 1 else first_getkey = 0; keyon = 0; / 防止按鍵沖突,當(dāng)所有的按鍵都釋放時(shí)將其清 0 /* 數(shù)碼管顯示函數(shù) 原型 : void leddisp(void);功能 : 每次調(diào)用輪流顯示一位數(shù)碼管 */ void le
19、ddisp(void) switch(lednum) / 選擇需要顯示的數(shù)碼位case 0:LED1 = segtabled0;break;case 1:LED2 = segtabled1;break;case 2:LED3 = segtabled2; break;case 3:LED4 = segtabled3; break;case 4:LED5 = segtabled4;break;case 5:LED6 = segtabled 5; break;case 6:LED7 = segtabled 6; break;case 7:LED8 = segtabled7; break;if(led
20、num = 0) /更新需要顯示的數(shù)碼管位置 lednum = 7;elselednum = led nu m-1;傳統(tǒng)的顯示器件數(shù)碼管已經(jīng)不能滿足顯示復(fù)雜操作界面的要求。因此最小系統(tǒng)中除了數(shù)碼管顯示器以外,還接入了一個(gè)液晶顯示模塊, 其型號(hào)為SGM12864C,可以顯示64行128列的點(diǎn)陣數(shù)據(jù), 通過(guò)編寫相應(yīng)的程序可以顯示英文、 漢字或圖形,可以實(shí)現(xiàn)比較復(fù)雜的用戶操作界面。 硬件接口電 路如圖3.9所示。液晶模塊的結(jié)構(gòu)及操作控制請(qǐng)參閱 SMG12864C.PDF 。U1LCDE 6 頁(yè)T5TDE 101£»ELVO偃ESIcscslwisKDIVSBSRW EDODID2
21、D31R17LOK E9LCD R CS、LCD LCS、LCD_E為液晶模塊提供片選及使Ao控制向液晶寫入的是命令字還是數(shù)據(jù)字。此外將液晶的讀寫控制端圖3.9硬件接口電路 在硬件設(shè)計(jì)中使用譯碼電路提供的 能信號(hào)。使用系統(tǒng)的地址信號(hào)接地,禁止從液晶中讀數(shù)據(jù),在向液晶中寫入一個(gè)數(shù)據(jù)或命令后延時(shí)一段時(shí)間再向其中寫入新的數(shù)據(jù),避免由于液晶處在忙狀態(tài)導(dǎo)致寫入錯(cuò)誤的情況發(fā)生。根據(jù)地址譯碼器提供的地址以及信號(hào)A0,可以得出向液晶左右兩個(gè)控制器中寫入命令和數(shù)據(jù)的物理地址,下面給出在C語(yǔ)言中的具體定義:#define LCD_L_DATA XBYTE 0xA201 / 左半邊液晶數(shù)據(jù)地址#define LCD
22、_R_DATA XBYTE 0xA301 /右半邊液晶數(shù)據(jù)地址#define LCD_L_Comma nd XBYTE 0xA200 左半邊液晶命令地址#define LCD_R_Comma nd XBYTE 0xA300 / 右半邊液晶命令地址為了使液晶能夠顯示字符、漢字以及圖形,需要對(duì)其進(jìn)行正確的設(shè)置,具體過(guò)程如下:(1)在系統(tǒng)上電后對(duì)其進(jìn)行初始化設(shè)置。向左右兩部分控制器寫入控制字OxCO,設(shè)置顯示的初始行。向左右兩部分控制器寫入控制字 0x3F ,將液晶的左右兩部分顯示開(kāi)啟。 此部分功能由后面給出 程序中的 lcd_initial() 函數(shù)完成。(2)在液晶指定位置顯示給定的數(shù)據(jù)。完成液
23、晶的初始化以后,通過(guò)寫入命令字確定顯示的列地 址和頁(yè)地址,然后寫入需要顯示的數(shù)據(jù)。以下給出了在液晶指定位置顯示大小為 8*8 字符、 16*16 漢字以及 128*64 圖形的 C 語(yǔ)言程序,用 戶可以根據(jù)需要利用函數(shù) lcd_write_byte() 編寫顯示任意大小圖形和文字的函數(shù)。#include <absacc.h>#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define LCD_L_DATA XBYTE 0xA201 / 左半邊液晶數(shù)據(jù)地址#define LCD_
24、R_DATA XBYTE 0xA301 / 右半邊液晶數(shù)據(jù)地址#define LCD_L_Command XBYTE 0xA200/ 左半邊液晶命令地址#define LCD_R_Command XBYTE 0xA300/ 右半邊液晶命令地址 uchar code G8 = 0x00,0x00,0x3e,0x41,0x49,0x49,0x7a,0x00; /*G*/ uchar code U8 = 0x00,0x00,0x3f,0x40,0x40,0x40,0x3f,0x00; /*U*/ uchar code O8 = 0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0
25、x00; /*O*/*-宋體12;此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/*- 文字 : 國(guó) -*/uchar code guo32 = 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00;/*- 文字 : 防 -*/uchar code fang32 = 0x00,0xFE,0x22,0x5A,0x86,0x02,0x
26、08,0x08,0xF9,0x8E,0x88,0x88,0x88,0x08,0x08,0x00,0x00, 0xFF,0x04,0x08,0x47,0x20,0x18,0x07,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00;/*- 文字 : 科 -*/uchar code ke32 = 0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x04, 0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x0
27、2,0xFF,0x01,0x01,0x00;/*- 文字 : 技 -*/ uchar code ji32 = 0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,0x01, 0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00;/*- 文字 : 大 -*/uchar code da32 = 0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x
28、20,0x20,0x20,0x20,0x20,0x00,0x00, 0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00;/*- 文字 : 學(xué) -*/ uchar code xue32 = 0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0
29、x00;/*液晶驅(qū)動(dòng)函數(shù)聲明*/void lcd_initial(void);void lcd_write_byte(uchar xpos,uchar ypos,uchar *byte);void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr);void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr);void lcd_clear(void);void lcd_fill(void);void de
30、lay(uchar time_nop);void main(void)lcd_initial();/ 初始化液晶 lcd_clear(); / 液晶清屏 lcd_write_char(0,0,G); / 顯示 "A" 不得用于商業(yè)用途lcd_write_char(1,0,U); / 顯示 "B" lcd_write_char(2,0,O); / 顯示 "C" lcd_write_hanzi(2,2,guo); / 顯示 "國(guó) " lcd_write_hanzi(4,2,fang); / 顯示 "防 &qu
31、ot; lcd_write_hanzi(6,2,ke); / 顯示 " 科" lcd_write_hanzi(8,2,ji); / 顯示 " 技" lcd_write_hanzi(10,2,da); / 顯示 " 大 " lcd_write_hanzi(12,2,xue); / 顯示 "學(xué)" while(1) /* 延時(shí)函數(shù) 函數(shù)原型 : void delay(uchar time_nop);功能: 延時(shí)time_nop個(gè)nop */ void delay(uchar time_nop) uchar i;for(i
32、=0;i<time_nop;i+)_nop_(); /* LCD 初始化 原型 : void lcd_initial(void);功能: 將 LCD 進(jìn)行初始化,設(shè)置初始行并開(kāi)顯示 */ void lcd_initial(void) delay(5); LCD_L_Command = 0xC0; / 設(shè)置顯示初始行 delay(5);LCD_R_Command = 0xC0; delay(5);LCD_L_Command = 0x3F; / 開(kāi)顯示 delay(5);LCD_R_Command = 0x3F; delay(5); /* 向 LCD 中寫入一個(gè)字節(jié)數(shù)據(jù)函數(shù) 原型 : voi
33、d lcd_write_byte(uchar xpos,uchar ypos,uchar byte);功能:將一個(gè)字節(jié)數(shù)據(jù)byte寫入液晶的(xpos, ypos)的位置處0-127,此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)行定義,xpos為橫坐標(biāo)從左到右順序?yàn)閥pos為縱坐標(biāo)從上到下順序?yàn)?-7。*/ void lcd_write_byte(uchar xpos,uchar ypos,uchar *byte) if(xpos <= 63) / 坐標(biāo)位置處在液晶的左半部分 delay(5);LCD_L_Command = xpos + 0x40; / 設(shè)定寫入數(shù)據(jù)的列地址 delay(5);LC
34、D_L_Command = ypos + 0xB8; / 設(shè)定寫入數(shù)據(jù)的行地址 delay(5);LCD_L_DATA = *byte; / 向(xpos, ypos)處寫數(shù)據(jù)delay(5);else /坐標(biāo)位置處在液晶的右半部分delay(5);LCD_R_Command = (xpos - 64) + 0x40; / 設(shè)定寫入數(shù)據(jù)的列地址delay(5);LCD_R_Command = ypos + 0xB8; / 設(shè)定寫入數(shù)據(jù)的行地址delay(5);LCD_R_DATA = *byte; / 向(xpos, ypos)處寫數(shù)據(jù)delay(5);/*在 LCD 指定位置顯示一個(gè) ASI
35、IC 字符函數(shù) 字符大小為 8*8原型 : void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr);功能:將一個(gè)字符數(shù)據(jù)寫入液晶的(char_xpos, char_ypos)的位置處此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)行定義,char_xpos為橫坐標(biāo)從左到右順序?yàn)?0-15, char_ypos為縱坐標(biāo)從上到下順序?yàn)?0-7。*/void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr)uchar i =
36、0;for(i=0;i<=7;i+)lcd_write_byte(char_xpos * 8 + i, char_ypos, char_source_addr + i);/*在LCD指定位置顯示一個(gè)漢字函數(shù)字符大小為16*16原型 : void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr);功能:將一個(gè)漢字?jǐn)?shù)據(jù)寫入液晶的(hanzi_xpos, hanzi_ypos)的位置處,此處將液晶的顯示區(qū)按照二維坐標(biāo)進(jìn)行定義,han zi_xpos為橫坐標(biāo)從左到右順序?yàn)?-14(以半個(gè)漢字符為
37、單位),hanzi_ypos為縱坐標(biāo)從上到下順序?yàn)?-6(以半個(gè)漢字符為單位)。*/void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr)uchar i = 0;for(i=0;i<=15;i+) / 寫漢字的上半部分lcd_write_byte(hanzi_xpos * 8 + i, hanzi_ypos, hanzi_source_addr + i);for(i=0;i<=15;i+) / 寫漢字的下半部分lcd_write_byte(hanzi_xpos * 8 + i,
38、 hanzi_ypos + 1, hanzi_source_addr + 16 + i);/*LCD 清屏原型 : void lcd_clear(void);功能:將LCD清屏*void lcd_clear(void)uchar i,j;uchar byte1 = 0x00;for(i=0;i<=127;i+) for(j=0;j<=7;j+) lcd_write_byte(i,j,byte);/* LCD 填充原型 : void lcd_fill(void); 功能: 將 LCD 填充為黑色 */ void lcd_fill(void) uchar i,j;uchar byte1
39、 = OxFF;for(i=0;i<=127;i+)for(j=0;j<=7;j+)For pers onal use only in study and research; not for commercial use 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ī)本身工作 速度慢,不能連接高速
40、A/D、D/A轉(zhuǎn)換器,同時(shí)為了節(jié)省單片機(jī) 10 口資源,本節(jié)僅就低速 串行轉(zhuǎn)換器進(jìn)行介紹。如果需要使用高速A/D、D/A轉(zhuǎn)換器,請(qǐng)使用FPGA對(duì)其進(jìn)行控制。串行輸出的A/D芯片由于節(jié)省單片機(jī)的I/O 口線,越來(lái)越多地被采用。如具有SPI三線 接口的 TLC1549、TLC1543、TLC2543、MAX187 等,具有 2 線 IIC 接口的 MAX127、PCF8591 (4路8位A/D,還含1路8位D/A)等。本小節(jié)以串行 A/D轉(zhuǎn)換器芯片TLC1549為例簡(jiǎn)要 介紹串行A/D轉(zhuǎn)換器的接口電路以及驅(qū)動(dòng)程序的設(shè)計(jì)。1、TLC1549的工作方式及時(shí)序TLC1549有6種工作方式,如表2所示。其
41、中方式1和方式3屬同一類型,方式2和方式4屬同一類型。一般來(lái)說(shuō),時(shí)鐘頻率高于 280 kHz時(shí),可認(rèn)為是快速工作方式; 低于280 kHz時(shí),可認(rèn)為是慢速工作方式。因此,如果不考慮I/O CLOCK周期大小,方式5與方式3相同,方式6與方式4相同。表2 TLC1549的工作方式方CS'I/O時(shí)鉀十引W fl MHI MSB的時(shí)劃快蛙力或方式1鬢第周期之闔擁商電平10|西T*厝方式2電平10方式孑輔換間期之訶為窩電平1115下降厝方式*注聯(lián)低赳平14龕£1嚴(yán)內(nèi)方式5平第1肓牛時(shí)鐘序降粘工作方式1工作時(shí)序圖如圖3.10所示。圖中從C S下跳到DATA輸出數(shù)據(jù)要有1.3卩s的延時(shí);
42、連續(xù)進(jìn)行 A/D轉(zhuǎn)換時(shí),在上次轉(zhuǎn)換結(jié)果輸出的過(guò)程中,同時(shí)完成本次轉(zhuǎn)換的采樣, 這樣大大提高了 A/D轉(zhuǎn)換的速率。如果I/O CLOCK的時(shí)鐘頻率為2.1 MHz,則完成一次A/D轉(zhuǎn)換的時(shí)間大約為 26卩s。如果用連續(xù)模擬信號(hào)進(jìn)行采樣轉(zhuǎn)換,顯然其轉(zhuǎn)換速率是很高的。I/O CLOCKCS采樣周期轉(zhuǎn)換間隔DATA OUT上次轉(zhuǎn)換的數(shù)據(jù)圖3.10方式1工作時(shí)序2、TLC1549與單片機(jī)最小系統(tǒng)的接口電路設(shè)計(jì)使用單片機(jī)小系統(tǒng)控制 TLC1549,主要通過(guò)擴(kuò)展接口 J4完成,J4各管腳信號(hào)定義請(qǐng)參見(jiàn)圖3.2小系統(tǒng)原理圖。需要控制的芯片管腳有三個(gè),分別為 C S、I/O CLOCK和DATAOUT,選用J4
43、中的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的程序,就是通過(guò)軟件的方法控制P10、P11和P12,產(chǎn)生如圖3. 10中的操作時(shí)序,完成一次A/D轉(zhuǎn)換。使用C編寫的采樣函數(shù)如下:#in elude <absacc.h>#in elude &l
44、t;reg51.h>#in clude< intrin s.h>#defi ne uchar un sig ned char#defi ne uint un sig ned intsbit AD_CS = P1A0; /TLC1549 片選信號(hào)sbit AD_IOCLOCK = P"1; /TLC1549時(shí)鐘信號(hào)sbit AD_DATAOUT = P"2; /TLC1549數(shù)據(jù)輸出信號(hào)/*A/D轉(zhuǎn)換函數(shù)聲明*/uint ad_c on vert(void);void delay(uchar time_nop);void main(void)uint ad_
45、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ù)原型 : uint ad_convert(void);功能:驅(qū)動(dòng)TLC1549完成一次A/D采樣返回值為AD轉(zhuǎn)換結(jié)果,使用16bit的uint型數(shù)據(jù)表示 低10位有效.*/uint ad_convert(void)uchar i;uint AD_DATA = 0;AD_CS = 0;for(i
46、=0;i<=9;i+)AD_IOCLOCK = 0;if(AD_DATAOUT = 1)AD_DATA = AD_DATA * 2 + 1;elseAD_DATA = AD_DATA * 2;AD_IOCLOCK = 1;AD_IOCLOCK = 0;AD_CS = 0;return(AD_DATA);/*延時(shí)函數(shù)函數(shù)原型 : void delay(uchar time_nop);功能:延時(shí)time_nop個(gè)nop*void delay(uchar time_ nop)uchar i;for(i=0;i<time_ nop;i+)_n op_();單片機(jī)實(shí)現(xiàn)控制是以數(shù)字信號(hào)或模擬信
47、號(hào)的形式通過(guò)I/O口送給被控對(duì)象的。模擬信號(hào)的產(chǎn)生通常需要 D/A轉(zhuǎn)換器的參與。本小節(jié)以串行D/A轉(zhuǎn)換芯片TLC5615為例簡(jiǎn)要介紹 串行D /A轉(zhuǎn)換器的接口電路以及驅(qū)動(dòng)程序的設(shè)計(jì)。1、芯片性能10位CMOS電壓輸出;5 V單電源工作; 與微處理器3線串行接口( SPI);最大輸出電壓是基準(zhǔn)電壓的 2倍; 輸出電壓具有和基準(zhǔn)電壓相同的極性; 建立時(shí)間12.5卩s; 內(nèi)部上電復(fù)位;低功耗,最高為1.75 mW ;更具體的性能參數(shù)請(qǐng)參閱 TLC5615.PDF2、管腳及其功能TLC5615的引腳排列及功能說(shuō)明分別見(jiàn)圖3.12及表3。封裝形式請(qǐng)參閱 TLC5615.PDF 。DIN 81 VDDSC
48、LK 27OUTCS 36RE FINDOUT 45AGND圖3.12 TLC5615管腳圖表3 TLC5615管腳功能引腳I/O說(shuō)明名稱序號(hào)DIN1I串行數(shù)據(jù)輸入SCLK2I串行時(shí)鐘輸入/CS3I芯片選擇低有效DOJI40用丁菊花鏈(daisy chaining)的串行數(shù)據(jù)輸出AGND5模擬地REHN6I基準(zhǔn)電圧輸入OUT70DAC模擬電壓輸出VDD8正屯源(4.5-5+5V)3、TLC5615的工作時(shí)序TLC5615使用3線串行SPI接口與外界連接,其中DIN、SCLK、CS為輸入控制。DOUT 用于多片D/A級(jí)聯(lián)使用(菊花鏈結(jié)構(gòu)),在僅使用一個(gè)芯片時(shí),此腳懸空。(CSHO)/ MCS)WS1)UCH) rw(CL)Z/CSHI)SCLKtDOUT)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)背景音樂(lè)廣播語(yǔ)音系統(tǒng)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年電渦流緩速器控制器項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)熱熔膠噴槍行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)帶燈熒光筆行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年對(duì)焊加強(qiáng)管座項(xiàng)目可行性研究報(bào)告
- 2025年臺(tái)式移印打碼機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年八針鏈?zhǔn)娇p紉機(jī)項(xiàng)目可行性研究報(bào)告
- 2025至2030年中國(guó)面粉機(jī)磨輥數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年速溶乳化輕質(zhì)硅酸鈉項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年納豆激酶項(xiàng)目投資價(jià)值分析報(bào)告
- 區(qū)域經(jīng)理年終工作總結(jié)匯報(bào)
- (完整版)語(yǔ)文寫作方格紙模板
- 勞動(dòng)防護(hù)用品培訓(xùn)試卷帶答案
- 二年級(jí)上冊(cè)加減混合計(jì)算400題及答案
- 《字體設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 初中八年級(jí)音樂(lè)-勞動(dòng)號(hào)子《軍民大生產(chǎn)》
- 站樁的知識(shí)講座
- 革命文物主題陳列展覽導(dǎo)則(試行)
- 醫(yī)學(xué)遺傳學(xué)第三版課件
- 四川家庭農(nóng)場(chǎng)補(bǔ)貼標(biāo)準(zhǔn)2023年
- 五年級(jí)下冊(cè)字帖
評(píng)論
0/150
提交評(píng)論