DS18B20溫度采集并由lcd顯示_第1頁
DS18B20溫度采集并由lcd顯示_第2頁
DS18B20溫度采集并由lcd顯示_第3頁
DS18B20溫度采集并由lcd顯示_第4頁
DS18B20溫度采集并由lcd顯示_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 溫度采集與顯示系統(tǒng)學(xué)院名稱:光電與通信工程學(xué)院專業(yè)名稱:電子信息工程2班組員信息:蘇曉峰()、鄭元?jiǎng)P()、梁斌()指導(dǎo)老師:林峰日期:2014年6月 15 目錄 實(shí)驗(yàn)專題描述實(shí)驗(yàn)?zāi)康暮蛯?shí)驗(yàn)功能 系統(tǒng)硬件及軟件STC單片機(jī)介紹 實(shí)驗(yàn)原理與方法 DS18C20簡單原理介紹 LCD1602簡單原理介紹 AT24C02簡單原理介紹 實(shí)驗(yàn)結(jié)果與討論專題制作過程中所遇到的困難與解決方法 心得與體會(huì) 程序碼一、實(shí)驗(yàn)專題描述單片機(jī)綜合實(shí)驗(yàn)的目的是訓(xùn)練單片機(jī)應(yīng)用系統(tǒng)的編程及調(diào)試能力,通過對一個(gè)單片機(jī) 應(yīng)用系統(tǒng)進(jìn)行系統(tǒng)的編程和調(diào)試,掌握單片機(jī)應(yīng)用系統(tǒng)開發(fā)環(huán)境和仿真調(diào)試工具及儀器儀表的實(shí)用,掌握單片機(jī)應(yīng)用程序代碼

2、的編寫和編譯,掌握利用單片機(jī)硬件仿真調(diào)試工具進(jìn)行單片機(jī)程序的跟蹤調(diào)試和排錯(cuò)方法,掌握示波器和萬用表等桿塔工具在單片機(jī)系統(tǒng)調(diào)試中應(yīng)用。利用STC89C52、DS18B20、LCD1602、AT24C02等元器件設(shè)計(jì)溫度采集與顯示系統(tǒng)。系統(tǒng)具有以下功能:1、 能正確檢測溫度;2、 在1602上實(shí)時(shí)顯示溫度;3、 每隔10秒采集一次溫度數(shù)據(jù)并保存到AT24C024、 按鍵按下后,可逐個(gè)顯示之前采集到的數(shù)據(jù);5、 其他功能可根據(jù)系統(tǒng)上的資源自行設(shè)定。擴(kuò)展功能:溫度超過設(shè)定值,蜂鳴器報(bào)警;時(shí)間日期的顯示;按鍵按下,重新開始采集溫度等等 硬件組成:本系統(tǒng)所用的硬件有 如下圖 序號(hào)參數(shù)數(shù)量備注1STC89C

3、521單片機(jī)2DIP40針I(yè)C座138針排針44MAX232E1串口下載5DIP16針I(yè)C座16DB9公頭170.1u瓷片電容480.1u瓷片電容49DS18B201溫度傳感器103P圓孔座1185V有源蜂鳴器1蜂鳴器19100歐電阻120紅色LED8LED顯示211K排阻1228針排針123按鍵6中斷電路251K歐電阻32611.0592M晶振1時(shí)鐘電路2722p瓷片電容22810u瓷片電容1復(fù)位電路2910K歐電阻530按鍵131直流電源插座1穩(wěn)壓電源32LM7805穩(wěn)壓芯片1330.33u瓷片電容234導(dǎo)線,杜邦線若干35AT24C02(DIP封裝)1存儲(chǔ)電路 軟件組成軟件有:keil軟

4、件、windows操作系統(tǒng)和串口調(diào)試助手等軟件組成。STC單片機(jī)介紹 單片機(jī)是隨著大規(guī)模集成電路的出現(xiàn)極其發(fā)展,將計(jì)算機(jī)的CPU,RAM,ROM,定時(shí)/計(jì)數(shù)器和多種I/O接口集成在一片芯片上,形成了芯片級的計(jì)算機(jī),因此單片機(jī)早期的含義稱為單片微型計(jì)算機(jī)(single chipmicrocomputer).它擁有優(yōu)異的性價(jià)比、集成度高、體積小、可靠性高、控制功能強(qiáng)、低電壓、低功耗的顯著優(yōu)點(diǎn).主要應(yīng)用于智能儀器儀表、工業(yè)檢測控制、機(jī)電一體化等方面,并且取得了顯著的成果.圖2-1單片機(jī)封裝及引腳結(jié)構(gòu)DS18B20數(shù)字溫度傳感器介紹 DALLAS最新單線數(shù)字溫度傳感器DS18B20的“一線器件”體積更

5、小、適用電壓更寬、更經(jīng)濟(jì) Dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器DS1820是世界上第一片支持 “一線總線”接口的溫度傳感器。表2-1DS18B20內(nèi)部溫度表示形式 DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的E2PPRAM,后者存放高溫度和低溫度觸發(fā)器TH、T和結(jié)構(gòu)寄存器。暫存存儲(chǔ)器包含了8個(gè)連續(xù)字節(jié),前兩個(gè)字節(jié)是測得的溫度信息,第一個(gè)字節(jié)的內(nèi)容是溫度的低八位,第二個(gè)字節(jié)是溫度的高八位。第三個(gè)和第四個(gè)字節(jié)是TH、TL的易失性拷貝,第五個(gè)字節(jié)是結(jié)構(gòu)寄存器的易失性拷貝,這三個(gè)字節(jié)的內(nèi)容在每一次上電復(fù)位時(shí)被刷新。第六、七、八個(gè)字節(jié)用于內(nèi)部計(jì)算。第九個(gè)字節(jié)

6、是冗余檢驗(yàn)字節(jié),見表2-3。表2-3DS18B20暫存存儲(chǔ)器的8個(gè)連續(xù)字節(jié)寄存器內(nèi)容字節(jié)地址溫度最低數(shù)字位0溫度最高數(shù)字位1高溫限值2低溫限值3保留4保留5計(jì)數(shù)剩余值6每度計(jì)數(shù)值7CTR校驗(yàn)8 實(shí)驗(yàn)原理與方法一、通過DS18B20采集溫度數(shù)據(jù),經(jīng)I/O口傳給單片機(jī),單片機(jī)對接收到的數(shù)據(jù)進(jìn)行實(shí)時(shí)在lcd上顯示,并十秒采集通過I2C總線送到24c02進(jìn)行儲(chǔ)存,當(dāng)按鍵按下時(shí)進(jìn)入外部中斷,并在外部中斷中進(jìn)行讀取24c02所保存的值并在lcd上顯示;拓展功能部分:在lcd的第二行顯示時(shí)鐘,并配有按鍵進(jìn)行調(diào)時(shí);溫度報(bào)警電路,當(dāng)溫度上升到一定值時(shí)給蜂鳴器低信號(hào),使其響起。二、LCD顯示控制格式 實(shí)驗(yàn)結(jié)果與討

7、論一、原理圖2、 仿真結(jié)果3、 硬件結(jié)果軟件部分主要遇到的問題是溫度采集保存到24c02模塊,用一個(gè)字發(fā)送或者兩個(gè)字節(jié)發(fā)送都會(huì)出問題,最后用八個(gè)字節(jié)發(fā)送就解決了此問題;關(guān)于顯示部分,顯示放在中斷里執(zhí)行會(huì)出現(xiàn)亂碼,而放到主程序中則不會(huì)。硬件部分主要是復(fù)位電路沒焊好會(huì)使電路一直處于復(fù)位狀態(tài),反應(yīng)出來結(jié)果就是無法顯示任何內(nèi)容。由于老師給的原理圖是公頭,而發(fā)下來的器件是母頭,自己沒有注意檢查,到最后燒寫程序的時(shí)候才發(fā)現(xiàn),導(dǎo)致只能用開發(fā)板來燒寫,給程序調(diào)試工作增加了很多工作量,并且單片機(jī)在拆卸過程中很容易損壞。我們在調(diào)試過程一定要十分小心謹(jǐn)慎,因?yàn)橛行┬酒际呛苋菀谉龎牡模杂胁簧骶蜁?huì)導(dǎo)致某塊芯片燒壞而

8、導(dǎo)致實(shí)驗(yàn)結(jié)果出不來失敗。其中我們在檢查電路的時(shí)候一定要注意檢查電路板的短路和虛焊的問題,要經(jīng)過反復(fù)的用萬用表不停的檢測,由于電路連線比較復(fù)雜,所以在測試電路的問題上花了好多的時(shí)間。在本次實(shí)驗(yàn)中我們碰到的最大的問題就是LCD顯示不能讀取溫度并顯示,最終我們通過不斷的檢查電路和修改發(fā)現(xiàn)由于復(fù)位電路由一條線沒有接地的原因,解決了就可以了啦。心得與體會(huì)在本次實(shí)驗(yàn)中,我們小組分工合作,首先要對所用的芯片進(jìn)行了解和查找資料。在設(shè)計(jì)過程中protues仿真對設(shè)計(jì)來說也是很重要的,利用溫度傳感器和時(shí)鐘芯片進(jìn)行對溫度實(shí)踐的檢測,再將檢測到的數(shù)據(jù)傳送單片機(jī)經(jīng)過程序的處理給LCD顯示,在程序的調(diào)試過程中,主要注意的

9、就是時(shí)間延遲函數(shù)和中斷讀取的設(shè)置。通過這次對溫度采集和顯示的設(shè)計(jì)與制作,讓我們了解了設(shè)計(jì)電路的程序,也讓我們了解了關(guān)于單片機(jī)的原理與設(shè)計(jì)理念,要設(shè)計(jì)一個(gè)電路總要先用仿真仿真成功之后才實(shí)際接線的。但是最后的成品卻不一定與仿真時(shí)完全一樣,因?yàn)椋賹?shí)際接線中有著各種各樣的條件制約著。而且,在仿真中無法成功的電路接法,在實(shí)際中因?yàn)樾酒旧淼奶匦远軌虺晒?。所以,在設(shè)計(jì)時(shí)應(yīng)考慮兩者的差異,從中找出最適合的設(shè)計(jì)方法。 通過這次學(xué)習(xí),讓我對各種電路都有了大概的了解,所以說,坐而言不如立而行,對于這些電路還是應(yīng)該動(dòng)手實(shí)際操作才會(huì)有深刻理解。從這次的課程設(shè)計(jì)中,我真真正正的意識(shí)到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際

10、,把我們所學(xué)的理論知識(shí)用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計(jì)中的最大收獲。成員蘇曉峰記 在程序調(diào)試過程中,通過按鍵切換設(shè)置時(shí)間、當(dāng)前溫度和存儲(chǔ)的溫度一次顯示在LCD上,在如何讀取溫度上的程序有些困惑,不知道用什么方法來寫,自己上網(wǎng)查找各種資料,最后決定用中斷來寫,但調(diào)試過程而然碰到了LCD顯示出錯(cuò)了,而且并沒有按照存儲(chǔ)的數(shù)據(jù)順序顯示。通過幾個(gè)晚上的思考和不斷調(diào)試,不斷的修改,總算是成功了。成員鄭元?jiǎng)P記 在實(shí)驗(yàn)設(shè)計(jì)之前自己上網(wǎng)查找所用芯片的資料各種管腳接口和類似的一些這次實(shí)驗(yàn)作為參考,為設(shè)計(jì)過程中可能會(huì)產(chǎn)生的問題進(jìn)行分析,盡可能的避免錯(cuò)

11、誤。但理論和實(shí)踐還是有一定的差距的,不過在大家的努力下一一克服了。仿真后準(zhǔn)備開始焊接電路前要進(jìn)行電路的布局和線路的連接,最大化的減少交叉線和跑線,使電路板看上去簡單明了。成員梁斌記 負(fù)責(zé)焊接的工作有點(diǎn)難度,不止考驗(yàn)焊接的功力還要有足夠的耐心,根據(jù)已經(jīng)布局好的電路進(jìn)行焊接,省下了不少心力。每每焊接一部分,都要用萬用表檢查是否連接正確或者有存在虛焊的情況,盡可能的避免錯(cuò)誤。完成后將程序燒錄進(jìn)去結(jié)果不能讀取溫度,大家都很著急,一起重新的檢查,通過最后的補(bǔ)救總算是找到錯(cuò)誤修改之后成功了。程序碼主程序#include#include#define warn_35 350#define warn_11 1

12、10char miao,shi,fen,flag;uint s1num;uchar count,m,n;uint su,tt,mm;/uchar buff4;unsigned char pDat7,pDat17;sbit s1=P23;sbit s2=P24;sbit s3=P25;sbit beep=P10;/蜂鳴器void deal(uint tem)if(temwarn_35)|(temwarn_11)beep=0;else beep=1;void main()m=0;n=0;init();EX0=1;/init_com();/包含了對定時(shí)器0的設(shè)定while(1)tempchange(

13、);tt=get_temp();if(flag=1)EA=0;flag=0; IRcvStr(0xa0,n,&pDat10,8); mm=pDat10*100+pDat11*10+pDat12; /pDat17=0; n=n+0x08;if(n=0xf8) n=0; EA=1;deal(tt);write_sfm(12,miao);write_sfm(9,fen);/write_sfm(6,shi);dis_temp1(mm);delay(5); dis_temp(tt);keyscan();void int_0() interrupt 0 flag=1;void keyscan()if(s1

14、=0)delay(5);if(s1=0)s1num+;while(!s1);if(s1num=1)TR0=0;write_com(0x80+0x40+12);/write_com(0x0f); if(s1num=2)write_com(0x80+0x40+9);if(s1num=3)write_com(0x80+0x40+6);if(s1num=4)s1num=0;write_com(0x0c);TR0=1; if(s1num!=0)if(s2=0)delay(5);if(s2=0)while(!s2);if(s1num=1)miao+;if(miao=60)miao=0;write_sfm(

15、12,miao);write_com(0x80+0x40+12);/指針回原位if(s1num=2)fen+;if(fen=60)fen=0;write_sfm(9,fen);write_com(0x80+0x40+9);/指針回原位if(s1num=3)shi+;if(shi=24)shi=0;write_sfm(6,shi);write_com(0x80+0x40+6);/指針回原位if(s3=0)delay(5);if(s3=0)while(!s3);if(s1num=1)/*if(miao=0)miao=59;write_sfm(10,miao);write_com(0x80+0x40

16、+10);*/miao-;if(miao=-1)miao=59;write_sfm(12,miao);write_com(0x80+0x40+12);if(s1num=2)fen-;if(fen=-1)fen=59;write_sfm(9,fen);write_com(0x80+0x40+9);if(s1num=3)shi-;if(shi=-1)shi=23;write_sfm(6,shi);write_com(0x80+0x40+6); void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256; su+; if(

17、su=100) su=0;pDat0=tt/100;pDat1=(tt%100)/10;pDat2=tt%10;ISendStr(0xa0,m,&pDat0,8);/存溫度/pDat7=0;m=m+0x08;if(m=0xf8)m=0; count+; if(count=20)count=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;/write_sfm(4,shi);/write_sfm(7,fen);/write_sfm(10,miao); 溫感部分#include #include #include

18、sbit ds=P11; /溫度傳感器信號(hào)線/sbit beep=P23; /蜂鳴器uint temp;float f_temp;void dsreset(void) /18B20復(fù)位,初始化函數(shù) uint i; ds=0; i=103; while(i0)i-; ds=1; i=4; while(i0)i-;bit tempreadbit(void) /讀1位函數(shù) uint i; bit dat; ds=0;i+; /i+ 起延時(shí)作用 ds=1;i+;i+; dat=ds; i=8;while(i0)i-; return (dat);uchar tempread(void) /讀1個(gè)字節(jié) u

19、char i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里 return(dat);void tempwritebyte(uchar dat) /向18B20寫一個(gè)字節(jié)數(shù)據(jù) uint i; uchar j; bit testb; for(j=1;j1; if(testb) /寫 1 ds=0; i+;i+; ds=1; i=8;while(i0)i-; else ds=0; /寫 0 i=8;while(i0)i-; ds=1; i+;i+; void tempchang

20、e(void) /DS18B20 開始獲取溫度并轉(zhuǎn)換 dsreset(); delay(1); tempwritebyte(0xcc); / 寫跳過讀ROM指令 tempwritebyte(0x44); / 寫溫度轉(zhuǎn)換指令uint get_temp() /讀取寄存器中存儲(chǔ)的溫度數(shù)據(jù) uchar a,b; dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); /讀低8位 b=tempread(); /讀高8位 temp=b; tempwarn_l2)&(t=warn_l1) /大于25度小于27度

21、 warn(40,0x01); else if(t=warn_l2) /小于25度 warn(10,0x03); else if(t=warn_h1) /小于32度大于30度 warn(40,0x04); else if(t=warn_h2) /大于32度 warn(10,0x0c); else i=40; while(i-) dis_temp(get_temp(); */Lcd顯示部分#includesbit rs=P26;sbit lcden=P27;/sbit rw=P25;uchar code tablenum= ;uchar code table= 00.0C Temp:00.0C;

22、uchar code table1=Time: 00:00:00;uchar code table2=XIAOFENG YUANKAI;uchar code table3= LIANGBIN ;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar dat)rs=1;lcden=0;P0=dat;delay(5);lcden=1;del

23、ay(5);lcden=0;void init()uchar num;lcden=0;/rw=0;/fen=59;/miao=53;/shi=23;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num16;num+)write_date(table2num);delay(5);write_com(0x80+0x40);for(num=0;num10;num+)write_date(table3num);delay(5); delay(2000);write_co

24、m(0x80);for(num=0;num16;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num12;num+)write_date(table1num);delay(5); TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;void write_sfm(uchar add,uchar dat)/寫地址和自動(dòng)顯示兩位數(shù)時(shí)間uchar s,g;s=dat/10;g=dat%10;write_com(0x80+0x40

25、+add);write_date(tablenums);write_date(tablenumg); void write_sfm1(uchar add,uchar dat)/寫溫度值十位地址寫4 個(gè)位為5 小數(shù)為7write_com(0x80+add);write_date(tablenumdat);I2C部分 /*此部分為I2C總線的驅(qū)動(dòng)程序*/#include#include #include#define NOP() _nop_() /* 定義空指令 */#define _Nop() _nop_() /*定義空指令*/sbit SCL=P21; /I2C 時(shí)鐘 sbit SDA=P20

26、; /I2C 數(shù)據(jù) bit ack; /*應(yīng)答標(biāo)志位*/ /* 起動(dòng)總線函數(shù) 函數(shù)原型: void Start_I2c(); 功能: 啟動(dòng)I2C總線,即發(fā)送I2C起始條件. */void Start_I2c() SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/ _Nop(); SCL=1; _Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*發(fā)送起始信號(hào)*/ _Nop(); /* 起始條件鎖定時(shí)間大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*鉗住I2C總線,

27、準(zhǔn)備發(fā)送或接收數(shù)據(jù) */ _Nop(); _Nop();/* 結(jié)束總線函數(shù) 函數(shù)原型: void Stop_I2c(); 功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件. */void Stop_I2c() SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/ _Nop(); /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/ SCL=1; /*結(jié)束條件建立時(shí)間大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/ _Nop(); _Nop(); _Nop(); _Nop();/* 字節(jié)數(shù)據(jù)發(fā)送函數(shù) 函數(shù)原型: void SendByte(

28、UCHAR c);功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0) 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要傳送的數(shù)據(jù)長度為8位*/ if(cBitCnt)&0x80) SDA=1; /*判斷發(fā)送位*/ else SDA=0; _Nop(); SCL=1; /*置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位*/ _Nop(); _N

29、op(); /*保證時(shí)鐘高電平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /*判斷是否接收到應(yīng)答信號(hào)*/ SCL=0; _Nop(); _Nop();/* 字節(jié)數(shù)據(jù)接收函數(shù) 函數(shù)原型: UCHAR RcvByte();功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)), 發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。 */

30、 unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /*置數(shù)據(jù)線為輸入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/ _Nop(); _Nop(); /*時(shí)鐘低電平周期大于4.7s*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/ _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /*讀數(shù)據(jù)

31、位,接收的數(shù)據(jù)位放入retc中 */ _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);/* 應(yīng)答子函數(shù)函數(shù)原型: void Ack_I2c(bit a);功能: 主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)*/void Ack_I2c(bit a) if(a=0) SDA=0; /*在此發(fā)出應(yīng)答或非應(yīng)答信號(hào) */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*時(shí)鐘低電平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0;

32、/*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/ _Nop(); _Nop(); 24c02部分 /*此部分為AT2402的驅(qū)動(dòng)程序使用I2C總線連接*/#include/AT2402的功能函數(shù)/* 向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù) 函數(shù)原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 從啟動(dòng)總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件 地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個(gè)字節(jié)。 如果返回1表示操作成功,否則操作有誤。注意: 使用前必須已結(jié)束總線。*/bit ISendStr(unsign

33、ed char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; Start_I2c(); /*啟動(dòng)總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack=0) return(0); SendByte(suba); /*發(fā)送器件子地址*/ if(ack=0)return(0); for(i=0;ino;i+) SendByte(*s); /*發(fā)送數(shù)據(jù)*/ if(ack=0)return(0); s+; Stop_I2c(); /*結(jié)束總線*/ return(1);/* 向有子

34、地址器件讀取多字節(jié)數(shù)據(jù)函數(shù) 函數(shù)原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 從啟動(dòng)總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件 地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲(chǔ)區(qū),讀no個(gè)字節(jié)。 如果返回1表示操作成功,否則操作有誤。注意: 使用前必須已結(jié)束總線。*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; Start_I2c(); /*啟

35、動(dòng)總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack=0)return(0); SendByte(suba); /*發(fā)送器件子地址*/ if(ack=0)return(0); Start_I2c(); /*重新啟動(dòng)總線*/ SendByte(sla+1); if(ack=0)return(0); for(i=0;ino-1;i+) *s=RcvByte(); /*發(fā)送數(shù)據(jù)*/ Ack_I2c(0); /*發(fā)送就答位*/ s+; *s=RcvByte(); Ack_I2c(1); /*發(fā)送非應(yīng)位*/ Stop_I2c(); /*結(jié)束總線*/ return(1);Function.h部分 #define uchar unsigned char #define uint unsigned intextern void write_sfm(uchar add,uchar dat);externvoid delay(uint z);

溫馨提示

  • 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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論