1602全程C語(yǔ)言編程顯示很全_第1頁(yè)
1602全程C語(yǔ)言編程顯示很全_第2頁(yè)
已閱讀5頁(yè),還剩72頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、輕松學(xué)51系列(作者:就抽精品)阿拉教你輕松學(xué) 51- 液晶篇(1602)1602 字符液晶在實(shí)際的產(chǎn)品中運(yùn)用的也比較多了,前幾天留意了一下,發(fā)現(xiàn)宿舍門(mén)前的自動(dòng)售水機(jī)就是采用的1602 液晶進(jìn)行顯示的。而且對(duì)于單片機(jī)的學(xué)習(xí)而言, 掌握 1602的用法是每一個(gè)學(xué)習(xí)者必然要經(jīng)歷的過(guò)程。在此,我將使用 1602 過(guò)程中遇到的問(wèn)題以及感受記錄下來(lái),希望能夠給初學(xué)者帶來(lái)一點(diǎn)指導(dǎo),少走一點(diǎn)彎路。所謂 1602 是指顯示的內(nèi)容為 16*2,即可以顯示兩行,每行 16 個(gè)字符。目前市面 上字符液晶絕大多數(shù)是基于HD44780 液晶芯片的,控制原理是完全相同的,因此基于HD44780 寫(xiě)的控制程序可以很方便地應(yīng)

2、用于市面上大部分的字符型液晶。背光,黑色字體)液晶的正面(綠色1602 液晶背面(綠色背光,黑色字體)背光白色字體字符型 LCD1602 通常有 14 條引腳線或 16 條引腳線的 LCD,多出來(lái)的 2 條線是背光電源線 VCC(15 腳)和地線 GND(16 腳),其控制原理與 14 腳的 LCD 完全一樣,弓 I 腳定義如下表所示:引腳號(hào)引醉電平輸入/輸岀作用1Uss電源地2Ucc電源(+5U)3對(duì)比調(diào)整電壓kRS10/1輸入錯(cuò)入數(shù)據(jù)5R/W0/1輸入向LCD寫(xiě)入垣今或數(shù)據(jù)從LCD涙取宿魚(yú)6E2 十輸入使能信號(hào),1吋諼取信息.1-0(下降沿)齡指令7DB0輸入/輸岀數(shù)據(jù)總線口呢肌最低位)D

3、B1r0/1輸入/輸岀數(shù)據(jù)總線Hne19tB20/1輸入/輸出數(shù)據(jù)總Une210DB30/1輸入#輸岀數(shù)據(jù)總線lines11DB40/1輸入/輸出數(shù)據(jù)總線12D跖|輸入瀚岀數(shù)據(jù)總線lines13DB60/1輸入f輸岀數(shù)據(jù)總線lnefiDB70/1輸入#輸岀數(shù)據(jù)總線lne7(最高位)15AI+UCC- -L3背光電源正極16K接地ILCD背光電源負(fù)極HD44780 內(nèi)置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是顯示數(shù)據(jù) RAM ,用來(lái)寄存待顯示的字符代碼。共 80 個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下表:顯示位置234567DDRAM第一行Q3HQ2H03H&SH27H地

4、址第二行40HU2H43H44HU5H67H也就是說(shuō)想要在 LCD1602 屏幕的第一行第一列顯示一個(gè) A字,就要向 DDRAM 的 00H 地址寫(xiě)入“ A 字的代碼就行了。但具體的寫(xiě)入是要按LCD 模塊的指令格式來(lái)進(jìn)行的,后面我會(huì)說(shuō)到的。那么一行可有 40 個(gè)地址呀?是的,在 1602 中我們就用前 16 個(gè)就行了。 第二行也一樣用前 16 個(gè)地址。對(duì)應(yīng)如下:DDRAM 地址與顯示位置的對(duì)應(yīng)關(guān)系(1:O0H 01H 02H 03H 64H眄H06H67H 08H餌H 6AH朋H 9CH ODH 0EH BFH:卻卻42H 43H屮45H46H7H 48H埠卯4AH 4BH4CH耳DHMEtf

5、 4FH:IJ(事實(shí)上我們往 DDRAM 里的 00H 地址處送一個(gè)數(shù)據(jù),譬如0 x31(數(shù)字 1 的代碼)并不能顯示 1 出來(lái)。這是一個(gè)令初學(xué)者很容易出錯(cuò)的地方,原因就是如果你要想在 DDRAM的 00H 地址處顯示數(shù)據(jù),則必 須將 00H 加上 80H,即 80H,若要在 DDRAM 的 01H 處顯示數(shù)據(jù),則必須將 01H 加上 80H 即 81H (從 80H 開(kāi)始到 9FH 開(kāi)始才是空余的自 己編寫(xiě)空間其余的空間都有液晶自己的庫(kù)文件。在CGRAM 中)。依次類(lèi)推。大家看一下控制指令的的 8 條:DDRAM 地址的設(shè)定,即可以明白是怎么樣的一回事了)1602 液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)

6、器( CGROM)已經(jīng)存儲(chǔ)了 160 個(gè)不同的點(diǎn)陣字 符圖形,如下表所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫(xiě)、常用的符號(hào)、和日文 假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫(xiě)的英文字母“A 的代碼是01000001B“A”(41H ),顯示時(shí)模塊把地址 41H 中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母上表中的字符代碼與我們 PC 中的字符代碼是基本一致的。因此我們?cè)谙駾DRAM寫(xiě) C51 字符代碼程序時(shí)甚至可以直接用P1 = A這樣的方法。PC 在編譯時(shí)就把 “A先轉(zhuǎn)為41H 代碼了。字符代碼 0 x00OxOF 為用戶自定義的字符圖形RAM(對(duì)于 5X8 點(diǎn)陣的字符,可以存放8 組

7、,5X10 點(diǎn)陣的字符,存放 4 組),就是 CGRAM 了。后面我會(huì)詳細(xì)說(shuō)的。0 x200 x7F 為標(biāo)準(zhǔn)的 ASCII 碼,0 xA00 xFF 為日文字符和希臘文字符,其M)41MIOM111OO1C141100111100410011010T51!HOCilOi11101111oxxOCOO0 3 PTXIPrcitfQGOl1 ITJTOIaH.|7|6|aXXXMOOIO砧MOO】noocOlDIQCCOItQ pi |icouiOCO M)WM1001忖)JKXK1011KKXKIIQQI (5)wxxlTOl苗)JOU-itiC汗)i訕I(yè)T(?)ri|2BR|b|r#|3|C|

8、S|c|sl$|4|D|T|d|t|5i|5|E!U|e|ul&|6|F|U|fMOTNJSIWIl9IIIVIi|y*|s|J|Z|J|z|+I5IKIC |k|(l丄klL|1111-|=|M|J|n| .|INIA|nWZfflH曰啊j|O|T|fe=?inizi3l|3|h|kPT*d亦|涯耳 引創(chuàng)神兩J| V|71B創(chuàng)余字符碼(0 x100 x1F 及 0 x80 0 x9F) 沒(méi)有定義。那么如何對(duì) DDRAM 的內(nèi)容和地址進(jìn)行具體操作呢,下面先說(shuō)說(shuō)HD44780 的指令集及其設(shè)置說(shuō)明,請(qǐng)瀏覽該指令集,并找出對(duì)DDRAM 的內(nèi)容和地址進(jìn)行操作的指令。共11 條指令:1.清屏指

9、令攜令功能指令編碼執(zhí)行:/RSRSDB7DB3D02DB1DUU清屏01 11e00011.64功能: 清除液晶顯示器,即將DDRAM 的內(nèi)容全部填入空白”的 ASCII 碼 20H; 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方; 將地址計(jì)數(shù)器(AC)的值設(shè)為 0。2.光標(biāo)歸位指令指令功能指令編碼RSDB7*DB5DB3DB10B05 沖/H5尤標(biāo)歸位0I#I*90Ct4X1,6*功能: 把光標(biāo)撤回到顯示器的左上方 把地址計(jì)數(shù)器(AC)的值設(shè)置為 0; 保持 DDRAM 的內(nèi)容不變3.進(jìn)入模式設(shè)置指令位名設(shè)置I/D0=寫(xiě)入新數(shù)據(jù)后光標(biāo)左移1=寫(xiě)入新數(shù)據(jù)后光標(biāo)右移0=寫(xiě)入新數(shù)據(jù)后顯示屏不移動(dòng)1=寫(xiě)

10、入新數(shù)據(jù)后顯示屏整體右移1 個(gè)字4.顯示開(kāi)關(guān)控制指令指令功能II令編瑪/USRSR/WDB7DB4DB5D8UDB1業(yè)示開(kāi)關(guān)控制000091CB功能:控制顯示器開(kāi)/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下:位名設(shè)置D0=顯示功能關(guān)1=顯示功能開(kāi)C0=無(wú)光標(biāo)1=有光標(biāo)B0=光標(biāo)閃爍1=光標(biāo)不閃爍5.設(shè)定顯示屏或光標(biāo)移動(dòng)方向指令設(shè)定情況光標(biāo)左移 1 格,且 AC 值減 1光標(biāo)右移 1 格,且 AC 值加 1顯示器上字符全部左移一格,但光標(biāo)不動(dòng)顯示器上字符全部右移一格,但光標(biāo)不動(dòng)6.功能設(shè)定指令S/CR/L0 0位名設(shè)置DL0=數(shù)據(jù)總線為 4 位1=數(shù)據(jù)總線為 8 位N0=顯示 1 行

11、1=顯示 2 行F0=5X點(diǎn)陣/每字符仁 510 點(diǎn)陣/每字符7.設(shè)定 CGRAM 地址指令指令功能指令編碼執(zhí)行/USB/WDBADB5D站DB3DB20B1設(shè)CGRfiM地址00D1地址(6)40功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM 的地址。8.設(shè)定 DDRAM 地址指令指令功能指令編碼執(zhí)行/U5RSR/WDB7DB6DB5DB4DEI30B1DB0|設(shè)定ADRfiH地址001CGRAMfit地址(7)U0功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM 的地址。(注意這里我們送地址的時(shí)候應(yīng)該是0 x80+Address,這也是前面說(shuō)到寫(xiě)地址命令的時(shí)候要加上 0 x80 的原因)9.讀取忙信號(hào)或 A

12、C 地址指令1抱令功能指令編碼時(shí)同/usFtSR/WDB7DB6DBS j D時(shí)DB3DB2 DB1Dbn疇雛號(hào)1M內(nèi)容燈m功能: 讀取忙碌信號(hào) BF 的內(nèi)容,BF=1 表示液晶顯示器忙,暫時(shí)無(wú)法接收單片機(jī)送 來(lái)的數(shù)據(jù)或指令;當(dāng) BF=O 時(shí),液晶顯示器可以接收單片機(jī)送來(lái)的數(shù)據(jù)或指令 讀取地址計(jì)數(shù)器(AC)的內(nèi)容。10.數(shù)據(jù)寫(xiě)入 DDRAM 或 CGRAM 指令一覽指令功能指令編碼I/USh/wDH70B6 I D65DB4DB30B2I站寫(xiě)入到1a共寫(xiě)入的數(shù)據(jù)tGRAM功能: 將字符碼寫(xiě)入 DDRAM,以使液晶顯示屏顯示出相對(duì)應(yīng)的字符 將使用者自己設(shè)計(jì)的圖形存入CGRAM。11.從 CGRA

13、M 或 DDRAM 讀出數(shù)據(jù)的指令一覽指令功能指令編碼/USwsR/UDEI 7tB6DBSDH4DB30H2&B1DK0出數(shù)據(jù)11要讀岀的數(shù)據(jù)功能:讀取 DDRAM 或 CGRAM 中的內(nèi)容。基本操作時(shí)序:讀狀態(tài)輸入:RS=L,RW=H ,E=H輸出:DB0DB7= 狀態(tài)字寫(xiě)指令輸入:RS=L , RW=L , E=下降沿脈沖,DB0DB7=指令碼輸出:無(wú)讀數(shù)據(jù)輸入:RS=H , RW=H , E=H輸出:DB0DB7=數(shù)據(jù)寫(xiě)數(shù)據(jù)輸入:RS=H , RW=L , E=下降沿脈沖,DBODB7=數(shù)據(jù)輸出:無(wú)呵呵,看到這么多的控制指令希望你沒(méi)有頭暈。其實(shí)這么多的指令剛開(kāi)始的時(shí)候沒(méi)有必要全

14、部掌握,隨著學(xué)習(xí)的深入可以再?lài)L試去用更復(fù)雜的控制指令。下面讓我們一起驅(qū)動(dòng)1602 的液晶吧。下面是我的液晶的連接圖,用的是那種藍(lán)底白字的液晶,其實(shí)藍(lán)底白字和 那種綠底黑字的液晶唯一的區(qū)別就是顏色的問(wèn)題,至于用哪種液晶,就看各位自己的喜好 咯。這就是我做測(cè)試用的最小系統(tǒng),單片機(jī)是STC89C516 ,晶振為 12M。液晶為藍(lán)底白字的那種 1602。/ / JrH當(dāng)我們硬件連接錯(cuò)誤, 或者程序錯(cuò)誤時(shí)就會(huì)出現(xiàn)下圖這種情況,就是上排顯示 16 的白色的塊(藍(lán)底黑字的液晶則顯示的是16 個(gè)黑塊)。P2=com;II 把命令字送入 P2下面我們來(lái)驅(qū)動(dòng) 1602 吧在 1602 的上排顯示 “ LCD160

15、2 check ok下排顯示“ study up 程序中沒(méi)有用到忙檢測(cè),而是用的是延時(shí)函數(shù)來(lái)替代忙檢測(cè)#include/包含頭文件,這個(gè)嘛,就不用多說(shuō)了-#defi ne uint un sig ned int /預(yù)定義一下ui nt x,y;for(x=n ;x0;x-)for(y=110;y0;y-);void lcd_wcom(uchar com) II1602rs=0;II 選擇指令寄存器rw=0;II 選擇寫(xiě)sbit rs=P3A5;II1602 的數(shù)據(jù) I 指令選擇控制線sbit rw=P3A6;II1602的讀寫(xiě)控制線sbit en=卩3人7;II1602的使能控制線I*P2 口

16、接 1602的 D0D7 ,注意不要接錯(cuò)了順序,我以前可在這上面吃過(guò)虧*Iuchar code table=LCD1602 check ok; /uchar code table1=study up;void delay(uint n)/ 延時(shí)函數(shù)II要顯示的內(nèi)容 2 放入數(shù)組 table1寫(xiě)命令函數(shù)#defi ne uchar un sig nedchar要顯示的內(nèi)容 1 放入數(shù)組 tableldelay(5);/ 延時(shí)一小會(huì)兒,讓 1602 準(zhǔn)備接收數(shù)據(jù)en=1;/ 使能線電平變化,命令送入 1602 的 8 位數(shù)據(jù)口en=0;void lcd_wdat(uchar dat)/1602 寫(xiě)

17、數(shù)據(jù)函數(shù)rs=1;/選擇數(shù)據(jù)寄存器rw=0;/選擇寫(xiě)P2=dat;/ 把要顯示的數(shù)據(jù)送入 P2delay(5);/ 延時(shí)一小會(huì)兒,讓 1602準(zhǔn)備接收數(shù)據(jù)en=1;/使能線電平變化,數(shù)據(jù)送入1602 的 8 位數(shù)據(jù)口en=0;/1602 初始化函數(shù)/8 位數(shù)據(jù),雙列, 5*7 字形/ 開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍/ 顯示地址遞增,即寫(xiě)一個(gè)數(shù)據(jù)后,顯示位置右移一位/ 清屏void main() / 主函數(shù)uchar n,m=0;lcd_init();/ 液晶初始化lcd_wcom(0 x80);/ 顯示地址設(shè)為 80H (即 00H ,)上排第一位for(m=0;m16;m+)/ 將 tabl

18、e 中的數(shù)據(jù)依次寫(xiě)入 1602 顯示lcd_wdat(tablem); delay(200);lcd_wcom(0 x80+0 x44); / 重新設(shè)定顯示地址為 0 xc4, 即下排第 5 位/ 將 table1 中的數(shù)據(jù)依次寫(xiě)入 1602 顯示void lcd_init()lcd_wcom(0 x38);lcd_wcom(0 x0c);lcd_wcom(0 x06);lcd_wcom(0 x01);for(n=0;n8;n+)Icd_wdat(table1 n);delay(200);while(1);/動(dòng)態(tài)停機(jī)程序?qū)懞煤鬅龑?xiě)進(jìn)單片機(jī),現(xiàn)在讓我們看看效果吧下面讓我們來(lái)看看如何顯示一個(gè)自定義

19、的字符吧我們從 CGROM 表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是 16 個(gè),實(shí)際只有 8 個(gè)字節(jié)可用。它的字符碼是00000000 00000111 這 8 個(gè)地址,表的下面還有 8 個(gè)字節(jié),但因?yàn)檫@個(gè) CGRAM 的字符碼規(guī)定 0 2 位為地址,3位無(wú)效,4 7 全為零。因此 CGRAM 的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為 0000X111, X 為無(wú)效位,最后三位為 000 111 共 8 個(gè)。如果我們要想顯示這 8 個(gè)用戶自定義的字符,操作方法和顯示CGROM 的一樣,先設(shè)置 DDRAM 位置,再向 DDRAM 寫(xiě)入字符碼,例如“A

20、就是 41H?,F(xiàn)在我們要顯示 CGRAM 的第一個(gè)自定義字符,就向DDRAM 寫(xiě)入 00000000B(00H),如果要顯示第 8 個(gè)就寫(xiě)入00000111(08H),簡(jiǎn)單吧!好!現(xiàn)在我們來(lái)看怎么向這八個(gè)自定義字符寫(xiě)入字模。有個(gè)設(shè)置CGRAM 地址的指這就是顯示的效果,你做成功了嗎?令大家還記得嗎?趕快再找出來(lái)看看。拾令功能指令編碼/USRSDO7DBADBSOB4DB3DB2- i-DB-fIBSWa1CRRftHffi地址W位)40地址從這個(gè)指令可以看出指令數(shù)據(jù)的高2 位已固定是 01,只有后面的 6 位是地址數(shù)據(jù),而這 6 位中的高 3 位就表示這八個(gè)自定義字符,最后的3 位就是字模數(shù)據(jù)

21、的八個(gè)地址了。下面我們寫(xiě)一段程序讓這8 個(gè)自定義字符顯示出一個(gè)心的圖案:(由于上面那個(gè)顯示程序已經(jīng)有很詳細(xì)的注釋了,因此這個(gè)程序只對(duì)與上個(gè)程序不同的地方寫(xiě)注釋?zhuān)?in clude#defi ne uint un sig ned int#defi ne uchar un sig ned charsbit rs=P3A5;sbit rw=P3A6;sbit en=卩3人7;uchar code table=0 x03,0 x07,0 x0f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x18,0 x1E,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0

22、 x07,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x10,0 x18,0 x1c,0 x1E,0 x1E,0 x1E,0 x1E,0 x1E,節(jié)寫(xiě)入字模數(shù)據(jù),讓它能顯示出地址:01000000數(shù)據(jù):00010000010000010000011001000010000010010100001100001000010001000000100001000101000010010100011000000110010001110000000001000111 八個(gè)地址。我們向這 8 個(gè)字圖示:OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

23、OOOOOOOOOOOOOOOO例如第一個(gè)自定義字符的字模地址為010000000 x0f,0 x07,0 x03,0 x01,0 x00,0 x00,0 x00,0 x00,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x0f,0 x07,0 x01,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1c,0 x18,0 x00,0 x1c,0 x18,0 x10,0 x00,0 x00,0 x00,0 x00,0 x00;/*uchar code table1=0 x10,0 x06,0 x09,0 x08,0 x08,0 x09,0 x06,0 x00;

24、/符c*/void delay(uint n)uint x,y;for(x=n;x0;x-)for(y=110;y0;y-);void lcd_wcom(uchar com)rs=0;rw=0;P2=com;delay(5);en=1;en=0;void lcd_wdat(uchar dat)rs=1;rw=0;P2=dat;delay(5);en=1;en=0;void lcd_init()心圖案字lcd_wcom(0 x38);lcd_wcom(0 x0c);lcd_wcom(0 x06);lcd_wcom(0 x01);void main()char m=0;lcd_init();lcd

25、_wcom(0 x40);for(m=0;m64;m+)lcd_wdat(tablem);lcd_wcom(0 x85); /for(m=0;m4;m+)lcd_wdat(m);lcd_wcom(0 xc5); /for(m=4;m KeyOverTime )/按鍵時(shí)間要/不是第一KeyCount = 0 ;KeyOverTime = KEY_QUICK_TIME ;return NOKEY ;else /是第一次按下則保存鍵值,以便下次執(zhí)行此函數(shù)時(shí)與讀到的鍵值作比較LastKey = KeyTemp ; /保存第一次讀到的鍵值KeyCount = 0 ; /延時(shí)計(jì)數(shù)器清零KeyOverTim

26、e = KEY_OVER_TIME ;return NOKEY ;下面是我測(cè)試用的主程序(相關(guān)頭文件未列出,僅僅作測(cè)試演示用)void main(void)uint8 KeyValue ;int16 Count ;v_LcdInit_f() ;v_KeyInit_f() ;CLSLOCATE(3, 1)PRINT(Key Test)LOCATE(6, 2)SHOW_ICONwhile(1)KeyValue = u8_ReadKey_f() ;if( KeyValue != NOKEY )LOCATE(1, 2)if( KeyValue = 0 x0e )Count+ ;if( KeyValue

27、 = 0 x0d )Count- ;if( KeyValue = 0 x0b )Count = 0 ;if( KeyValue = 0 x07 )Count = 0 ;HIDE_ICONPRINTD(Count, 5)LOCATE(6, 2)else/SHOW_ICON每次執(zhí)行讀鍵盤(pán)函數(shù)時(shí),只是對(duì)一些標(biāo)志進(jìn)行判斷,然后退出。因此能夠充分的利用CPU的資源。同時(shí)可 以處理連發(fā)按鍵。此按鍵掃描按鍵函數(shù)可以直接放在主函數(shù)中。如果感覺(jué)按鍵太過(guò)靈敏或者遲鈍則改一下 相關(guān)消抖動(dòng)的宏定義即可。此函數(shù)也可以通過(guò)中斷標(biāo)志位進(jìn)行定時(shí)的掃描。此時(shí),需要添加一個(gè)定時(shí)標(biāo)志 位,并將相關(guān)消抖動(dòng)的和連擊時(shí)間的宏定義改小即可

28、。然后在主程序類(lèi)似下面這樣寫(xiě)即可if( KeyTime ) /定時(shí)掃描時(shí)間到KeyValue = u8_ReadKey_f() ;具體的工作就交給您去完成啦??纯葱Ч喊存I單擊連發(fā)時(shí)候的截圖至此,關(guān)于單個(gè)按鍵的學(xué)習(xí)就告一段落了,您是否已經(jīng)明白了。如果您還不明白,那么把這個(gè)程序好好的 看看,并畫(huà)下流程圖,分析分析。估計(jì)您就會(huì)恍然大悟。關(guān)鍵是思路要轉(zhuǎn)換過(guò)來(lái)。下面我們來(lái)看看多個(gè)按鍵的情況吧一般情況下,如果多個(gè)按鍵每個(gè)都直接接在單片機(jī)的I/O上的話會(huì)占用很多的I/O資源。比較合理的一種 做法是, 按照行列接成矩陣的形式。 按鍵接在每一個(gè)的行列的相交處。 這樣對(duì)于m行n列的矩陣, 可以接 的按鍵總數(shù)是m

29、*n。這里我們以常見(jiàn)的4*4矩陣鍵盤(pán)來(lái)講解矩陣鍵盤(pán)的編程。上圖就是矩陣鍵盤(pán)的一般接法*此函數(shù)需要定時(shí)器的支持(去抖)*51單片機(jī)特性決定的)/* *模塊內(nèi)相關(guān)的宏定義及常數(shù)宏*/*此模塊所需的全局或者外部變量*/bit bdata StartScan = 0 ;/此變量需放在定時(shí)中斷中置位/*按鍵掃描函數(shù),按下去后經(jīng)去抖,確定按下*則返回鍵值015;無(wú)鍵按下則返回0 xff ;*這里我們要介紹一種快速的鍵盤(pán)掃描法:線反轉(zhuǎn)法(或者稱(chēng)為行列翻轉(zhuǎn)法)。具體流程如下。首先,讓單片機(jī)的行全部輸出0,列全部輸出1,讀取列的值(假設(shè)行接P3口的高四位,列接低四位)。即P3= OxOf ;此時(shí)讀列的值,如果有

30、鍵按下,則相應(yīng)的列讀回來(lái)的值應(yīng)該為低。譬如此時(shí)讀回來(lái)的值為0 x0e ;即按鍵列的位置已經(jīng)確定。這時(shí)反過(guò)來(lái),把行作為輸入,列作為輸出,即P0 = 0 xf0 ;此時(shí)再讀行的值,如果按鍵仍然被按下,則相應(yīng)的行的值應(yīng)該為低,如果此時(shí)讀回來(lái)的值為0 xe0,則確定了行的位置 。說(shuō)到這里,您應(yīng)該笑了,知道了一個(gè)按鍵被按下的行和列的位置,那么就可以肯定確定它的位置了。我們把讀回來(lái)的行值和列值進(jìn)行或運(yùn)算。即0 xe0 | 0 x 0e即0 xee。那么0 xee就是我們按下的按鍵的鍵值了。怎么樣。只需幾步就可以判斷所有的鍵值,簡(jiǎn)單吧。下面再結(jié)合一個(gè)例子具體看看。/*此模塊所需相關(guān)支持庫(kù)*/#include

31、regx52.h#define uint8 unsigned char#define uint16 unsigned int/*與硬件連接相關(guān)的定義及宏定義和操作宏*/#define KEYBOARDP3/鍵盤(pán)連接到單片機(jī)上的端口位置#define READ_ROW_ENLABLEKEYBOARD = 0 x0f ;/讀端口之前先把相應(yīng)口置位(由基本#define READ_COL_ENLABLEKEYBOARD = 0 xf0 ;/根據(jù)實(shí)際硬件連接情況修改#define NOKEY0 xff /定義無(wú)鍵按下時(shí)的返回值#define DELAY_COUNT 2/消抖時(shí)間常數(shù)*uint8 u8_

32、KeyBoardScan_f()static uint8 DelayCount = 0 ;uint8 KeyValueRow = 0 ;uint8 KeyValueCol = 0 ;uint8 KeyValue = 0 ;if( StartScan ) /開(kāi)始掃描,StartScan在定時(shí)中斷中置位StartScan = 0 ;/清除開(kāi)始掃描標(biāo)志位,避免多次重復(fù)執(zhí)行掃描程序/讀入按鍵狀態(tài)前先向相應(yīng)端口寫(xiě)1(由基本51單片機(jī)硬件結(jié)構(gòu)決定) READ_ROW_ENLABLEif( ( KEYBOARD & 0 x0f ) != 0 x0f ) /判斷是否有鍵按下/有鍵按下則判斷延時(shí)去抖的時(shí)

33、間是否達(dá)到/再次判斷是否按鍵真的按下/確定按下后,延時(shí)去抖計(jì)時(shí)器清0KeyValueRow = KEYBOARD & 0 x0f ; /取得行碼/準(zhǔn)備讀列,先向相應(yīng)端口寫(xiě)1(由基本51單片機(jī)硬件結(jié)構(gòu)決定)READ_COL_ENLABLEif ( (KEYBOARD & 0 xf0) != 0 xf0 ) /KeyValueCol = KEYBOARD & 0 xf0 ;/取得列碼/合并取得的行碼和列碼,即是相應(yīng)按鍵的鍵值switch( KeyValueCol | KeyValueRow)case 0 x77 : KeyValue = 0 ; break ;case 0

34、xb7 : KeyValue = 1 ; break ;case 0 xd7 : KeyValue = 2 ; break ;case 0 xe7 : KeyValue = 3 ; break ;case 0 x7b : KeyValue = 4 ; break ;case 0 xbb : KeyValue = 5 ; break ;DelayCount+;if( DelayCount KeyOverTime )KeyCount = 0 ;KeyOverTime = KEY_QUICK_TIME ;return NOKEY ;else /是第一次按下則保存鍵值,以便下次執(zhí)行此函數(shù)時(shí)與讀到的鍵值

35、作比較LastKey = KeyTemp ;/保存第一次讀到的鍵值KeyCount = 0 ; /延時(shí)計(jì)數(shù)器清零KeyOverTime = KEY_OVER_TIME ;return NOKEY ;下面是我測(cè)試用的主程序(相關(guān)頭文件未列出,僅僅作測(cè)試演示用) void main(void)uint8 KeyValue ;int16 Count ;v_LcdInit_f() ;v_KeyInit_f() ;CLSLOCATE(3, 1)PRINT(Key Test)LOCATE(6, 2)/不是第一SHOW_ICONwhile(1)KeyValue = u8_ReadKey_f() ;if( K

36、eyValue != NOKEY )LOCATE(1, 2)if( KeyValue = 0 x0e )Count+ ;if( KeyValue = 0 x0d )Count- ;if( KeyValue = 0 x0b )Count = 0 ; if( KeyValue = 0 x07 )Count = 0 ;HIDE_ICONPRINTD(Count, 5)LOCATE(6, 2)else/SHOW_ICON每次執(zhí)行讀鍵盤(pán)函數(shù)時(shí),只是對(duì)一些標(biāo)志進(jìn)行判斷,然后退出。因此能夠充分的利用CPU的資源。同時(shí)可以處理連發(fā)按鍵。此按鍵掃描按鍵函數(shù)可以直接放在主函數(shù)中。如果感覺(jué)按鍵太過(guò)靈敏或者遲鈍則改一

37、下相關(guān)消抖動(dòng)的宏定義即可。此函數(shù)也可以通過(guò)中斷標(biāo)志位進(jìn)行定時(shí)的掃描。此時(shí),需要添加一個(gè)定時(shí)標(biāo)志位,并將相關(guān)消抖動(dòng)的和連擊時(shí)間的宏定義改小即可。然后在主程序類(lèi)似下面這樣寫(xiě)即可KeyValue = u8_ReadKey_f();具體的工作就交給您去完成啦??纯葱Ч?按鍵單擊至此,關(guān)于單個(gè)按鍵的學(xué)習(xí)就告一段落了,您是否已經(jīng)明白了。如果您還不明白,那么把這個(gè)程序好好的看看,并畫(huà)下流程圖,分析分析。估計(jì)您就會(huì)恍然大悟。關(guān)鍵是思路要轉(zhuǎn)換過(guò)來(lái)。下面我們來(lái)看看多個(gè)按鍵的情況吧一般情況下,如果多個(gè)按鍵每個(gè)都直接接在單片機(jī)的I/O上的話會(huì)占用很多的I/O資源。比較合理的一種if( KeyTime )/定時(shí)掃描時(shí)間

38、到做法是,按照行列接成矩陣的形式。 按鍵接在每一個(gè)的行列的相交處。這樣對(duì)于m行n列的矩陣,可以接的按鍵總數(shù)是m*n。這里我們以常見(jiàn)的4*4矩陣鍵盤(pán)來(lái)講解矩陣鍵盤(pán)的編程。上圖就是矩陣鍵盤(pán)的一般接法。這里我們要介紹一種快速的鍵盤(pán)掃描法:線反轉(zhuǎn)法(或者稱(chēng)為行列翻轉(zhuǎn)法)。具體流程如下。首先,讓單片機(jī)的行全部輸出0,列全部輸出1,讀取列的值(假設(shè)行接P3口的高四位,列接低四位)。即P3= OxOf ;此 時(shí)讀列的值,如果有鍵按下,則相應(yīng)的列讀回來(lái)的值應(yīng)該為低。譬如此時(shí)讀回來(lái)的值為OxOe ;即按鍵列的位置已經(jīng)確定。這時(shí)反過(guò)來(lái),把行作為輸入,列作為輸出,即P0 = OxfO ;此時(shí)再讀行的值,如果按鍵仍然

39、被按下,則相應(yīng)的行的值應(yīng)該為低,如果此時(shí)讀回來(lái)的值為OxeO,則確定了行的位置。說(shuō)到這里,您應(yīng)該笑了,知道了一個(gè)按鍵被按下的行和列的位置,那么就可以肯定確定它的位置了。我們把讀回來(lái)的行值和列值進(jìn)行或運(yùn)算。即OxeO | Ox Oe即Oxee。那么Oxee就是我們按下的按鍵的鍵值了。怎么樣。只需幾步就可以判斷所有的鍵值,簡(jiǎn)單吧。下面再結(jié)合一個(gè)例子具體看看。/*此模塊所需相關(guān)支持庫(kù)*/#includeregx52.h#define uint8 unsigned char#define uint16 unsigned int/*與硬件連接相關(guān)的定義及宏定義和操作宏*/鍵盤(pán)連接到單片機(jī)上的端口位置KE

40、YBOARD = 0 x0f ;/讀端口之前先把相應(yīng)口置位(由基本KEYBOARD = 0 xf0 ;/根據(jù)實(shí)際硬件連接情況修改/*模塊內(nèi)相關(guān)的宏定義及常數(shù)宏*/#define NOKEY 0 xff /定義無(wú)鍵按下時(shí)的返回值#define DELAY_COUNT 2 /消抖時(shí)間常數(shù)*此模塊所需的全局或者外部變量*/*按鍵掃描函數(shù),按下去后經(jīng)去抖,確定按下*則返回鍵值015;無(wú)鍵按下則返回0 xff ; *此函數(shù)需要定時(shí)器的支持(去抖 .) */uint8 u8_KeyBoardScan_f()static uint8 DelayCount = 0 ;uint8 KeyValueRow = 0

41、 ;uint8 KeyValueCol = 0 ;uint8 KeyValue = 0 ;if( StartScan ) /開(kāi)始掃描,StartScan在定時(shí)中斷中置位StartScan = 0 ;/清除開(kāi)始掃描標(biāo)志位,避免多次重復(fù)執(zhí)行掃描程序/讀入按鍵狀態(tài)前先向相應(yīng)端口寫(xiě)1(由基本51單片機(jī)硬件結(jié)構(gòu)決定)READ_ROW_ENLABLEif( ( KEYBOARD & 0 x0f ) != 0 x0f ) /判斷是否有鍵按下DelayCount+;if( DelayCount = DELAY_COUNT )/有鍵按下則判斷延時(shí)去抖的時(shí)間是否達(dá)到returnNOKEY ;#define

42、 KEYBOARD P3#define READ_ROW_ENLABLE51單片機(jī)特性決定的)#define READ_COL_ENLABLEbit bdata StartScan = 0 ;/此變量需放在定時(shí)中斷中置位else /消除了抖動(dòng)if( ( KEYBOARD & 0 x0f ) != 0 x0f )/再次判斷是否按鍵真的按下DelayCount = 0 ;/確定按下后,延時(shí)去抖計(jì)時(shí)器清0KeyValueRow = KEYBOARD & 0 x0f ; /取得行碼/準(zhǔn)備讀列,先向相應(yīng)端口寫(xiě)1(由基本51單片機(jī)硬件結(jié)構(gòu)決定) READ_COL_ENLABL Eif (

43、(KEYBOARD & 0 xf0) != 0 xf0 ) /反轉(zhuǎn),讀列碼KeyValueCol = KEYBOARD & 0 xf0 ;/取得列碼/合并取得的行碼和列碼,即是相應(yīng)按鍵的鍵值switch( KeyValueCol | KeyValueRow)case 0 x77 : KeyValue = 0 ; break ;case 0 xb7 : KeyValue = 1 ; break ;case 0 xd7 : KeyValue = 2 ; break ;case 0 xe7 : KeyValue = 3 ; break ;case 0 x7b : KeyValue =

44、 4 ; break ;case 0 xbb : KeyValue = 5 ; break ;case 0 xdb : KeyValue = 6 ; break ;case 0 xeb : KeyValue = 7 ; break ;case 0 x7d : KeyValue = 8 ; break ;case 0 xbd : KeyValue = 9 ; break ;case 0 xdd : KeyValue = 10 ;break ;case 0 xed : KeyValue = 11 ;break ;case 0 x7e : KeyValue = 12 ;break ;case 0 x

45、be : KeyValue = 13 ;break ;case 0 xde : KeyValue = 14 ;break ;case 0 xee : KeyValue = 15 ;break ; default : return NOKEY ; return KeyValue ;else DelayCount = 0 ; return NOKEY ; elseDelayCount = 0 ; return NOKEY ;elseDelayCount = 0 ; return NOKEY ;void v_T0_Isr_f( void ) interrupt INTERRUPT_TIMER2_OV

46、ERFLOWStartScan = 1 ;*模塊調(diào)試*/主函數(shù)僅作演示用,主函數(shù)除按鍵掃描外的函數(shù)并沒(méi)在這里給出voidv_Init_T2_f( void )T2CON = 0 x04 ;T2MOD= 0 x00 ;TH2 = 0 xd8 ;RCAP2H= 0 xd8 ;TL2 = 0 xf0 ;RCAP2L = 0 xf0 ;ET2 = 1 ;TR2= 1 ;void main( void )uint8 readkey = 0 ; v_Init_T2_f( ) ; v_LcdInit_f( );LOCATE( 1, 1)PRINT(4*4KeyBoard Test)EA = 1 ;LOCAT

47、E( 3, 2)while( 1 )SHOW_ICONreadkey = u8_KeyBoardScan_f() if( readkey != NOKEY)PRINTN( readkey , 2)LOCATE( 3, 2)continue ;elsecontinue ;呵呵,按鍵掃描程序已經(jīng)注釋的很詳細(xì)了。我就不多費(fèi)嘴舌了。如果有不清楚的地方,歡迎跟帖討論。 下面是按鍵測(cè)試的截圖我的自己搭建的實(shí)驗(yàn)板OK,Enioy it !自此按鍵檢測(cè)告一段落。下次如果再講按鍵。將會(huì)討論另外一種按鍵的寫(xiě)法:基于狀態(tài)機(jī) 的按鍵程序設(shè)計(jì)。歡迎討論。tiankai (2010-2-05 16:39:19)晨輝教你輕

48、松學(xué)51-外圍芯片之ds1302和ds18b20對(duì)于市面上的大多數(shù)51單片機(jī)開(kāi)發(fā)板來(lái)說(shuō)。ds1302和ds18b20應(yīng)該是比較常見(jiàn)的兩種外圍芯片。ds1302是具有SPI總線接口的時(shí)鐘芯片。ds18b20則是具有單總線接口的數(shù)字溫度傳感器。下面讓我們分別來(lái)認(rèn)識(shí)并學(xué)會(huì)應(yīng)用這兩種芯片。首先依舊是看DS1302的datasheet中的相關(guān)介紹。DS1302是 HALLOS 公司推出怖灣熬充電時(shí)悴芽片.內(nèi)含有一 6 實(shí)時(shí)時(shí)日歷W 31 7 9 RAM,逮罐勵(lì) 單的串柝擅口與單片 HI進(jìn)柑通 f 雷時(shí)時(shí)忡舊冊(cè)電路提供 X、汁、時(shí)、& H 期、小年的佶超冃的天 貌側(cè)的的天熬可自動(dòng)調(diào)烙 川嚇卄1 A

49、MPM梧:心吃* I: 24 JSL 12小潸咯式 DS13O2 與單丿;機(jī)上 閭縫電空采用同步申行的冇式iStrjttft*僅需用到三個(gè)匚 I域;llRESfH 柱人(DSCLK 時(shí)丼 h 時(shí)神 RAM 的讀/斗敵 Helf 字棊或莠達(dá) 31 牛字前的字符畑方成通DS1302 TfW 功輕根 低*風(fēng)曲數(shù)據(jù)和時(shí)抻值息時(shí)功率小DSB02魁由 DS1302 進(jìn)廚來(lái).堆加了以卜的特性 t農(nóng)電 F主電觀備愉電灌供卜心 Vecl AW 輦程涓逾克電電譚.IHM七牛爭(zhēng)首存緒宅它湮應(yīng)用于電話、梶摘式 USU 及電池供電的快餐岐表甘 產(chǎn)呂務(wù) 4U下麗將主聲的性施指算件一尊含實(shí)耐時(shí)建貝”誕計(jì)悴川 00干 2 削

50、的秒,爪時(shí)、H.日輒用期、”、年的龍 b 還有國(guó)年鍛 U的能”世哲存數(shù)撇存 6BRAM率抒 1門(mén)方成他妙胃躺紡常誠(chéng)少嵐褲消丁作電用:20-5 WT#電逵:2 0V時(shí).小于 30WRAMi育背禪傳送方式*單字持 14和多了関傳送 0 ; i- )if( Content & 0 x01 )DS1302_IO_HIGHelseDS1302_IO_LOWContent = 1 ;DS1302_SCLK_HIGHDS1302_SCLK_LOW* * Function: static uint8 v_DS1302Read_f( void )* Description:從DS1302當(dāng)前設(shè)定的地址讀

51、取一個(gè)字節(jié)的內(nèi)容* Parameter: * Return:返回讀出來(lái)的值(uint8) */static uint8 v_DS1302Read_f( void )uint8 i, ReadValue ;DS1302_IO_HIGHfor( i = 8 ; i 0 ; i- )ReadValue = 1 ;if( DS1302_IO_READ )ReadValue |= 0 x80 ;elseReadValue &= 0 x7f ;DS1302_SCLK_HIGHDS1302_SCLK_LOWreturn ReadValue ;* * Function: void v_DS1302Wr

52、iteByte_f( uint8 Address, uint8 Content )* Description:從DS1302指定的地址寫(xiě)入一個(gè)字節(jié)的內(nèi)容* Parameter: Address:要寫(xiě)入數(shù)據(jù)的地址* Content:寫(xiě)入數(shù)據(jù)的具體值*Return:*/void v_DS1302WriteByte_f( uint8 Address, uint8 Content )DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ; v_DS1302Write_f( Content ) ;DS1302_RST

53、_LOWDS1302_SCLK_HIGH* * Function: uint8 v_DS1302ReadByte_f( uint8 Address )* Description:從DS1302指定的地址讀出一個(gè)字節(jié)的內(nèi)容* Parameter:Address:要讀出數(shù)據(jù)的地址* * Return:指定地址讀出的值(uint8) */uint8 v_DS1302ReadByte_f( uint8 Address )uint8 ReadValue ;DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ; Re

54、adValue = v_DS1302Read_f() ;DS1302_RST_LOWDS1302_SCLK_HIGHreturn ReadValue ;/* Function: void v_ClockInit_f( void ) * Description:初始化寫(xiě)入DS1302時(shí)鐘寄存器的值(主程序中只需調(diào)用一次即可) *Parameter:* Return: */void v_ClockInit_f( void )if( v_DS1302ReadByte_f( 0 xc1) != 0 xf0 )v_DS1302WriteByte_f( 0 x8e, 0 x00 ) ;v_DS1302Wr

55、iteByte_f( DS1302_YEAR_WRITE, 0 x08 ) ;/年v_DS1302WriteByte_f( DS1302_WEEK_WRITE, 0 x04 ) ;/星期v_DS1302WriteByte_f( DS1302_MONTH_WRITE, 0 x12 ) ;/月v_DS1302WriteByte_f( DS1302_DAY_WRITE, 0 x11 ) ;/日/允許寫(xiě)操作v_DS1302WriteByte_f( DS1302_HOUR_WRITE, 0 x13 ) ;/小時(shí)v_DS1302WriteByte_f( DS1302_MINUTE_WRITE, 0 x06

56、 ) ;/分鐘v_DS1302WriteByte_f( DS1302_SECOND_WRITE, 0 x40 ) ;/秒v_DS1302WriteByte_f( 0 x90, 0 xa5 ) ;/充電DS1302WriteByte_f( 0 xc0, 0 xf0 ) ;/判斷是否初始化一次標(biāo)識(shí)寫(xiě)入v_DS1302WriteByte_f( 0 x8e, 0 x80 ) ;/禁止寫(xiě)操作* Function: void v_ClockUpdata_f( void ) * Description:讀取時(shí)間數(shù)據(jù),并保存在結(jié)構(gòu)體CurrentTime中Parameter:Return:*/void v_C

57、lockUpdata_f( void )CurrentTime.Second = v_DS1302ReadByte_f( DS1302_SECOND_READ ) ;CurrentTime.Minute = v_DS1302ReadByte_f( DS1302_MINUTE_READ ) ;CurrentTime.Hour = v_DS1302ReadByte_f( DS1302_HOUR_READ ) ; CurrentTime.Day =v_DS1302ReadByte_f( DS1302_DAY_READ ) ;CurrentTime.Month = v_DS1302ReadByte_f

58、( DS1302_MONTH_READ ) ;CurrentTime.Week= v_DS1302ReadByte_f( DS1302_WEEK_READ ) ;CurrentTime.Year= v_DS1302ReadByte_f( DS1302_YEAR_READ ) ;有了上面的這些函數(shù)我們就可以對(duì)DS1302進(jìn)行操作了。當(dāng)我們想要獲取當(dāng)前時(shí)間時(shí),只需要調(diào)用v_ClockUpdata_f( void )這個(gè)函數(shù)即可。讀取到的時(shí)間數(shù)據(jù)保存在CurrentTime這個(gè)結(jié)構(gòu)體中。至于如何把時(shí)間數(shù)據(jù)在數(shù)碼管或者是液晶屏上顯示岀來(lái)我相信大家應(yīng)該都會(huì)了吧A A看看顯示效果如何下面再讓我們看看DS1

59、8B20吧。DS18B20是單總線的數(shù)字溫度傳感器。其與單片機(jī)的接口只需要一根數(shù)據(jù)線即可。當(dāng)然連線簡(jiǎn)單意味著 軟件處理上可能要麻煩一點(diǎn)。下面來(lái)看看它的優(yōu)點(diǎn):全數(shù)字溫度轉(zhuǎn)換及輸岀先進(jìn)的單總線數(shù)據(jù)通信。最高12位分辨率.精度可達(dá)土0.5攝氏度一12位分藕率時(shí)的最大丄作周期為了50毫秒 可選擇寄生工作方式。檢測(cè)溫度范圍為 -55 C -+125 C( - 67 F-+257 F)內(nèi)置EEPR0M,限溫報(bào)警功能。64位光刻ROM,內(nèi)舊產(chǎn)品序列號(hào)*方便多機(jī)掛接 多樣封裝形式再適應(yīng)不同硬件系統(tǒng).看看它的靚照。外形和我們常用的三極管沒(méi)有什么兩樣哦。DALLAS 18B20a:、;DS18B20的內(nèi)部存儲(chǔ)器分

60、為以下幾部分ROM:存放該器件的編碼。前8位為單線系列的編碼(DS18B20的編碼是19H)后面48位為芯片的唯一 序列號(hào)。在出場(chǎng)的時(shí)候就已經(jīng)設(shè)置好,用戶無(wú)法更改。最后8位是以上56位的CRC碼。RAM:DS18B20的內(nèi)部暫存器共9個(gè)字節(jié)。其中第一個(gè)和第二個(gè)字節(jié)存放轉(zhuǎn)換后的溫度值。第二個(gè)和第 三個(gè)字節(jié)分別存放高溫和低溫告警值。(可以用RAM指令將其拷貝到EEPROM中)第四個(gè)字節(jié)為配置寄存器。第57個(gè)字節(jié)保留。第9個(gè)字節(jié)為前8個(gè)字節(jié)的CRC碼。2322212212-232-4MSb(milt = C)LSbSsSS2625LSBMSBDS18B20的溫度存放如上圖所示。其中S位符號(hào)位。當(dāng)溫度值為負(fù)值時(shí),S = 1,反之則S = 0。我們把得到的溫度數(shù)據(jù)乘上對(duì)應(yīng)的分辨率即可以得到轉(zhuǎn)換后的溫度值。DS18B20的通訊

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論