![講稿《嵌入式系統(tǒng)應(yīng)用技術(shù)》“三”_第1頁](http://file4.renrendoc.com/view/138eb341fc4adadf6a04fd318dca9e18/138eb341fc4adadf6a04fd318dca9e181.gif)
![講稿《嵌入式系統(tǒng)應(yīng)用技術(shù)》“三”_第2頁](http://file4.renrendoc.com/view/138eb341fc4adadf6a04fd318dca9e18/138eb341fc4adadf6a04fd318dca9e182.gif)
![講稿《嵌入式系統(tǒng)應(yīng)用技術(shù)》“三”_第3頁](http://file4.renrendoc.com/view/138eb341fc4adadf6a04fd318dca9e18/138eb341fc4adadf6a04fd318dca9e183.gif)
![講稿《嵌入式系統(tǒng)應(yīng)用技術(shù)》“三”_第4頁](http://file4.renrendoc.com/view/138eb341fc4adadf6a04fd318dca9e18/138eb341fc4adadf6a04fd318dca9e184.gif)
![講稿《嵌入式系統(tǒng)應(yīng)用技術(shù)》“三”_第5頁](http://file4.renrendoc.com/view/138eb341fc4adadf6a04fd318dca9e18/138eb341fc4adadf6a04fd318dca9e185.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)應(yīng)用技術(shù)三、C8051F310+C511實(shí)例實(shí)例1 通用I/O端口實(shí)例2 A/D轉(zhuǎn)換實(shí)例3 溫度測量實(shí)例4 定時器及中斷實(shí)例5 UART應(yīng)用實(shí)例6 SMBus應(yīng)用(24C0X)實(shí)例7 I2C應(yīng)用(ZLG7290)實(shí)例8 I2C應(yīng)用(PCF8563T)2實(shí)例1 通用I/O端口1.1 C8051F310端口的特殊性1.2 通用I/O端口實(shí)例1.3 提高題31.1 C8051F310端口的特殊性C8051F310有29個 I/O 引腳(P0、P1、P2、P3-5腳)通過交叉開關(guān)可以使引腳分配給數(shù)字外設(shè)、模擬外設(shè)未分配給的管腳作為通用 I/O(GPIO)(1)端口相關(guān)寄存器(2)I/O 端口
2、初始化(3)I/O 端口初始化舉例4(1)端口相關(guān)寄存器Pn:端口寄存器PnMDIN:輸入方式1=數(shù)字輸入,0=模擬輸入PnMDOUT:輸出方式0=開漏輸出,1=推挽輸出PnSKIP:端口跳過0=不跳過,1=跳過XBR0、XBR1:交叉開關(guān)0=不分配,1=分配數(shù)字外設(shè)其中n=03 為復(fù)位值5(2)交叉開關(guān)P0.0P2.3管腳,通過交叉開關(guān),分配給GPIO或數(shù)字外設(shè)P2.4P3.4管腳,不通過交叉開關(guān),不分配給數(shù)字外設(shè)。UARTSMBus等P0.07P1.07P2.03交叉開關(guān)P0.0腳P2.4腳P3.4腳P2.47P3.04。P2.3腳.XBR0,XBR1,PnSKIP.6(3)I/O 端口初
3、始化端口 I/O 初始化(教科書P47)1 輸入方式(PnMDIN),端口引腳的輸入方式(模擬或數(shù)字)。2 輸出方式(PnMDOUT),端口引腳的輸出方式(開漏或推挽)。3 端口跳過寄存器(PnSKIP),交叉開關(guān)跳過的引腳。4 將引腳分配給要使用的外設(shè)。(XBR0、XBR1)5 使能交叉開關(guān)(XBARE =1)。說明:通用I/O端口(P0.0-P2.3)的初始化要做第1、2、5步。 通用I/O端口(P2.4-P3.4)的初始化只要做第1、2步。輸入PnMDIN數(shù)字模擬10輸出PnMDOUT開漏推挽0017(3)I/O 端口初始化舉例例如:C8051F310目標(biāo)板上的發(fā)光管D2接到了P3.3腳
4、,按鈕S2接到了P0.7腳,模擬量接到了P2.4腳。P3.3做數(shù)字輸出、 P0.7做數(shù)字輸入、 P2.4做模擬輸入P3MDIN = 0 xff;/P3.3做數(shù)字輸入(默認(rèn))P3MDOUT = 0 x08;/P3.3推挽輸出P0MDIN = 0 xff;/P0.7做數(shù)字輸入(默認(rèn))P2MDIN = 0 xef;/P2.4做模擬輸入81.2 通用 I/O 端口應(yīng)用實(shí)例例題:C8051F310目標(biāo)板上的發(fā)光管D2接到了P3.3腳,按鈕S2接到了P0.7腳,模擬量接到了P2.4腳。要求:松開S2則D2慢閃,按住S2則D2快閃。91.2 通用 I/O 端口應(yīng)用實(shí)例(續(xù))#include / C8051F
5、310的SFR定義sbitLED=P33;/ LED位定義sbitSW=P07;/ SW位定義/- 延時 -void delay(unsigned long v)while(-v);/- 主程序 -void main(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P3MDIN = 0 xff;/P3.3做數(shù)字輸入(默認(rèn))P3MDOUT = 0 x08;/P3.3推挽輸出P0MDIN = 0 xff;/P0.7做數(shù)字輸入(默認(rèn))while(1)LED = !LED;/LED閃爍delay(SW ? 20000 : 5000);/SW按下則快閃,否則慢閃101.3
6、提高題(1)按一下S2,D2亮,再按一下S2,D2滅,依此類推。(2)按下S2,D2閃亮3次,松開S2,D2閃亮2次,依此類推。(3)用C8051F310帶動DP-51實(shí)驗(yàn)箱,使8個LED左向、右向流水點(diǎn)亮。11實(shí)例2 A/D轉(zhuǎn)換2.1 C8051F310的AD轉(zhuǎn)換器簡介2.2 左右對齊的例子2.3 ADC相關(guān)寄存器2.4 ADC 輸入引腳配置2.5 A/D轉(zhuǎn)換實(shí)例2.6 提高題1210位ADC原理框圖 除P0口132.1 C8051F310的AD轉(zhuǎn)換器簡介10 位逐次逼近型 ADC, 最高采樣率200kspsAMX0P:正輸入:23 選 1:P1.0P3.4、溫度傳感 器、VDDAMX0N:
7、負(fù)輸入:22 選 1:P1.0P3.4、GND單端方式:GND作為負(fù)輸入,其余為差分方式 (略)。ADC0H、ADC0L:轉(zhuǎn)換結(jié)果AD0LJST 位:決定轉(zhuǎn)換結(jié)果左對齊或右對齊Justified輸入范圍: 0 VREF*1023/1024AD值與輸入電壓( VIN)的關(guān)系:VINVREFAD值 = ( ) * 1024142.2 左右對齊的例子單端方式時左、右對齊的例子152.3 電壓基準(zhǔn)VREFREF0CN: 電壓基準(zhǔn)控制寄存器REFSL:0=選擇外部電壓基準(zhǔn)(來自P0.0腳) 1=或內(nèi)部電壓基準(zhǔn)(VDD)TEMPE:1=允許內(nèi)部溫度傳感器工作BIASE:1=內(nèi)部偏壓發(fā)生器工作(使用 ADC
8、 時該位必須為1) 162.3 ADC相關(guān)寄存器AMUX0P:ADC 正輸入通道選擇寄存器AMX0P(正端選擇):可選P1.0P3.4、溫度傳感 器、VDDAMUX0N:ADC 負(fù)輸入通道選擇寄存器AMX0N(負(fù)端選擇):可選P1.0P3.4、GND172.3 ADC相關(guān)寄存器(續(xù)1)ADC0CF:配置寄存器每次AD轉(zhuǎn)換約需11個AD時鐘脈沖AD0SC(選擇AD時鐘):復(fù)位后,AD時鐘=系統(tǒng)時鐘/32AD0LJST(左對齊) :0=右對齊最低采樣率 = 24.5MHz / 32 / 11 = 70ksps最高采樣率200ksps,此時AD0SC = ?11系統(tǒng)時鐘頻率AD0SC + 1AD時鐘
9、頻率=D7D6D5D4D3D2D1D0復(fù)位值A(chǔ)D0SCAD0LJST -11111000182.3 ADC相關(guān)寄存器(續(xù)2)ADC0CN:控制寄存器 地址=0 xE8,可位尋址AD0EN(ADC允許):1=允許ADCAD0TM(跟蹤方式) :0=正常方式,一直跟蹤 AD0INT(結(jié)束標(biāo)志) :1=AD轉(zhuǎn)換結(jié)束AD0BUSY(忙標(biāo)志):若 AD0CM000,AD0BUSY置1則啟動AD轉(zhuǎn)換AD0CM(啟動方式):000=向AD0BUSY 寫1時啟動AD轉(zhuǎn)換 寫入1AD0BUSY轉(zhuǎn)換結(jié)束啟動方式0:192.4 ADC 輸入引腳配置注意:作為 ADC 輸入的引腳應(yīng):配置為模擬輸入( PnMDIN對應(yīng)
10、位置 0 ),使交叉開關(guān)跳過(如果是P0.0-P2.3,PnSKIP對應(yīng)位置 1 ) 。202.5 A/D轉(zhuǎn)換實(shí)例例題:按圖在C8051F310目標(biāo)板的J6上接一個電位器,要求:向P2.5輸出高電平(=VDD),從P2.4讀入模擬電壓。當(dāng)輸入電壓小于VDD一半時,發(fā)光管D2慢閃,否則快閃。C8051F310目標(biāo)板J6: P2.4P2.5P0.0212.5 A/D轉(zhuǎn)換實(shí)例(續(xù)1)#include / C8051F310的SFR定義sbitLED=P33;/ LED位定義sbitP25=P25;/ P2.5位定義bitbKuai;/ 快慢標(biāo)志/- 延時 -void delay(unsigned l
11、ong v)while(-v);/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P3MDOUT = 0 x08;/ LED=P3.3推挽輸出P2MDOUT = 0 x20;/ P2.5推挽輸出,給電位器供電P2MDIN = 0 x10;/ P2.4模擬輸入AMX0P = 0 x0c;/ 正輸入=P2.4AMX0N = 0 x1f;/ 負(fù)輸入=GNDADC0CF = 0 xf8;/ 右對齊(默認(rèn))ADC0CN = 0 x00;/ 向 AD0BUSY 寫 1 時啟動 ADC0 轉(zhuǎn)換(默認(rèn))REF0CN = 0 x0a;/ VDD作
12、VREF,開偏壓AD0EN = 1;/ 允許 ADC0222.5 A/D轉(zhuǎn)換實(shí)例(續(xù)2)/- 主程序 -void main(void)unsigned int ad;/ AD轉(zhuǎn)換結(jié)果First ();/ 初始化P25 = 1;/ 向電位器送出+3.3V電壓while(1)AD0BUSY = 1;/ 啟動 ADC0while(!AD0INT);/ 等待AD轉(zhuǎn)換結(jié)束AD0INT = 0;/ 清除AD轉(zhuǎn)換結(jié)束標(biāo)志LED = !LED;/ LED閃爍delay(bKuai ? 5000 : 20000);/ 快慢閃ad = ADC0H*256 + ADC0L;/ 讀取AD值bKuai = (ad 51
13、2);/ 決定快慢232.6 提高題(1)用電位器改變輸入電壓,電壓越高,D2閃爍越快,直至全亮;電壓越低,D2閃爍越慢,直至全暗。(2)用C8051F310帶動DP-51實(shí)驗(yàn)箱,使8個LED流水點(diǎn)亮。當(dāng)電壓大于2/3滿量程,LED左向流動,當(dāng)電壓1/32/3滿量程,LED閃爍,當(dāng)電壓小于1/3滿量程,LED右向流動。24實(shí)例3 溫度測量3.1 片內(nèi)溫度傳感器簡介3.2 溫度測量實(shí)例3.3 提高題253.1 片內(nèi)溫度傳感器簡介要使用內(nèi)部溫度傳感器,REF0CN.2(TEMPE)必須置1。正端輸入 AMX0P=0 x1E,選擇溫度傳感器負(fù)端輸入 AMX0N=0 x1F,選擇GND溫度傳感器的傳輸
14、函數(shù) :mV溫度=3.35*(溫度)+897mVVINVREFAD值 = ( ) * 1024當(dāng)Vref = VDD = 3.3V時,1 - 3.35mV- 3.35/3300*1024=1.04 AD值263.2 溫度測量實(shí)例例題:利用C8051F310目標(biāo)板,編程測量環(huán)境溫度。當(dāng)溫度較低(如低于20)時,發(fā)光管D2慢閃,否則快閃。解:Vref = VDD = 3.3V20的mV溫度=3.35*20+897=964mV20的AD值=964/3300*1024=351C8051F310目標(biāo)板C8051F310片內(nèi)溫度傳感器273.2 溫度測量實(shí)例(續(xù)1)#include / C8051F310
15、的SFR定義sbitLED=P33;/ LED位定義bitbKuai;/ 快慢標(biāo)志/- 延時 -void delay(unsigned long v)while(-v);/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P3MDOUT = 0 x08;/ LED=P3.3推挽輸出P2MDOUT = 0 x20;/ P2.5推挽輸出,給電位器供電P2MDIN = 0 x10;/ P2.4模擬輸入AMX0P = 0 x1e;/ 正輸入=溫度傳感器AMX0N = 0 x1f;/ 負(fù)輸入=GNDADC0CF = 0 xf8;/ 右對齊(
16、默認(rèn))ADC0CN = 0 x00;/ 向 AD0BUSY 寫 1 時啟動 ADC0 轉(zhuǎn)換(默認(rèn))REF0CN = 0 x0e;/ Vref=VDD,允許溫度傳感器,開偏壓AD0EN = 1;/ 允許 ADC0283.2 溫度測量實(shí)例(續(xù)2)/- 主程序 -void main(void)unsigned int ad;/ AD轉(zhuǎn)換結(jié)果First ();/ 初始化while(1)AD0BUSY = 1;/ 啟動 ADC0while(!AD0INT);/ 等待AD轉(zhuǎn)換結(jié)束AD0INT = 0;/ 清除AD轉(zhuǎn)換結(jié)束標(biāo)志LED = !LED;/ LED閃爍delay(bKuai ? 5000 : 20
17、000);/ 快慢閃ad = ADC0H*256 + ADC0L;/ 讀取AD值bKuai = (ad 351);/ 決定快慢,根據(jù)實(shí)際情況修改293.3 提高題(1)用手指給C8051F310加溫,溫度越高D2閃爍越快。(2)用C8051F310帶動DP-51實(shí)驗(yàn)箱,使8個LED流水點(diǎn)亮。溫度越高,流動越快。30實(shí)例4 定時器及中斷4.1 定時器的時鐘4.2 定時器的相關(guān)寄存器4.3 定時器的初值4.4 定時器中斷實(shí)例4.5 提高題314.1定時器的時鐘內(nèi)部振蕩頻率=24.5MHz,系統(tǒng)時鐘=24.5MHz / 振蕩器分頻T0時鐘=系統(tǒng)時鐘 / 定時器分頻內(nèi)部振蕩24.5MHzOSCICN:
18、IFCN振蕩器分頻定時器分頻CKCON :T0M、SCAT0時鐘系統(tǒng)時鐘324.2 定時器的相關(guān)寄存器內(nèi)部振蕩頻率=24.5MHz,系統(tǒng)時鐘=24.5MHz / 振蕩器分頻OSCICN:內(nèi)部振蕩器控制寄存器IOSCEN:1=內(nèi)部振蕩器使能。IFRDY:內(nèi)部振蕩器就緒標(biāo)志。1=就緒IFCN :內(nèi)部振蕩器到SYSCLK的分頻位缺省分頻數(shù)為8。系統(tǒng)時鐘=24.5/8=3.0625MHzIFCNSYSCLK=0024.5MHz/80124.5MHz/41024.5MHz/21124.5MHz/1334.2 定時器相關(guān)的寄存器(續(xù)1)T0時鐘=系統(tǒng)時鐘 / 定時器分頻CKCON :時鐘控制寄存器T1M:
19、類似于T0M。T0M:0=T0時鐘由分頻位(SCA)決定。 1=T0時鐘為系統(tǒng)時鐘SCA:T0、T1 分頻位SCAT0、T1時鐘00系統(tǒng)時鐘/1201系統(tǒng)時鐘/410系統(tǒng)時鐘/4811外部時鐘/8344.3定時器的初值例如:振蕩器分頻=1,T0分頻=12,求定時10ms的初值=?振蕩器分頻=1:OSCICN |= 0 x03;SYSCLK=24.5MHzT0分頻=12(默認(rèn)):CKCON = 0 x00;T0時鐘=24.5/12=2.0417MHz10ms計數(shù)=10000(us) * 2.0417(次/us)= 20417T0初值=65536 - 20417內(nèi)部振蕩24.5MHzOSCICN:
20、IFCN振蕩器分頻定時器分頻CKCON :T0M、SCAT0時鐘354.4 定時器中斷實(shí)例例題:用定時器及中斷功能,構(gòu)造C8051F310應(yīng)用程序框架,具有1ms、10ms、100ms、1s函數(shù)調(diào)用。利用程序框架,編制發(fā)光管D2每秒亮100ms的程序。100ms1s364.4 定時器中斷實(shí)例(續(xù)1)#include / C8051F310的SFR定義/ T0時鐘=24.5/12=2.0417MHz,10ms計數(shù)=10000(us)*2.0417(次/us)=20417#defineT0_VAL(65536-20417)/ T0初值sbitLED=P33;/ LED位定義bitb10ms;/ 1
21、0ms標(biāo)志unsigned char Cnt10ms;/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P3MDOUT = 0 x08;/ LED=P3.3推挽輸出OSCICN |= 0 x03;/ SYSCLK=24.5MHzCKCON = 0 x00;/ 默認(rèn)值:T0=系統(tǒng)時鐘/12TMOD = 0 x01;/ T0方式1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;TR0 = 1;/ 啟動T0ET0 = 1;EA = 1;374.4 定時器中斷實(shí)例(續(xù)2)/- 10ms處理 -void do_
22、10ms(void)/- 100ms處理 -void do_100ms(void)/- 1s處理 -void do_1s(void)LED = !LED;/ LED 亮1秒、暗1秒384.4 定時器中斷實(shí)例(續(xù)3)/- 主程序 -void main(void)First ();/ 初始化while(1)if(b10ms)b10ms = 0;do_10ms();if(Cnt10ms % 10 = 0)do_100ms();if(+Cnt10ms = 100)Cnt10ms=0;do_1s();394.4 定時器中斷實(shí)例(續(xù)4)/- 定時中斷 10ms -void T0_Int(void)inte
23、rrupt 1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;b10ms = 1;注意:中斷函數(shù)定義函數(shù)名任意,加上 interrpt n修飾,n為中斷號,T0中斷為1號中斷。中斷函數(shù)的入口參數(shù)、出口參數(shù)均為void。404.4 定時器中斷實(shí)例(續(xù)5)要實(shí)現(xiàn)LED每秒亮100ms的效果,只要每秒點(diǎn)亮LED,每100ms熄滅LED即可。/- 100ms處理 -void do_100ms(void)LED = 0;/ 熄滅LED/- 1s處理 -void do_1s(void)LED = 1;/ 點(diǎn)亮LED414.5 提高題(1)用DP-51實(shí)驗(yàn)箱,使LED1以1秒閃爍
24、, LED2以2秒閃爍, LED2LED8流水點(diǎn)亮。42實(shí)例5 UART應(yīng)用5.1 交叉開關(guān)5.2 交叉開關(guān)相關(guān)的寄存器5.3 波特率5.4 UART應(yīng)用實(shí)例5.5 UART應(yīng)用實(shí)例b5.6 提高題43數(shù)字交叉開關(guān)原理框圖445.1 交叉開關(guān)P0.0P2.3管腳,通過交叉開關(guān),分配給GPIO或數(shù)字外設(shè)UARTSMBus等P0.07P1.07P2.03交叉開關(guān)P0.0腳P2.4腳P3.4腳P2.47P3.04。P2.3腳.XBR0,XBR1,PnSKIP.455.1 交叉開關(guān)(續(xù)1)交叉開關(guān):優(yōu)先權(quán)交叉開關(guān)譯碼器某些數(shù)字資源(如UART、SMBus等)需要引腳,交叉開關(guān)為其分配引腳。從P0.0到
25、P2.3按順序分配(UART0總是使用P0.4和P0.5)。PnSKIP中被置1的那些位,將被跳過。如用于VREF、模擬輸入、晶振或 GPIO 的引腳。465.1 交叉開關(guān)(續(xù)2)沒有引腳被跳過(PnSKIP=0 x00)的交叉開關(guān)優(yōu)先權(quán)譯碼表 475.1 交叉開關(guān)(續(xù)3)晶體引腳被跳過的交叉開關(guān)優(yōu)先權(quán)譯碼表 485.2 交叉開關(guān)相關(guān)的寄存器XBR0:交叉開關(guān)寄存器0SMB0E :SMBus I/O 使能位,1=連到端口引腳。URT0E :UART I/O 使能位,1=連到端口引腳。其他省略位:其他數(shù)字外設(shè)使能。XBR1:交叉開關(guān)寄存器1XBARE :交叉開關(guān)使能位。要使用交叉開關(guān),應(yīng)使XBA
26、RE=1。其他省略位:其他數(shù)字外設(shè)使能。495.3 波特率使用內(nèi)部振蕩器時的波特率內(nèi)部振蕩24.5MHzOSCICN:IFCN振蕩器分頻定時器分頻CKCON :T1M、SCAT1時鐘系統(tǒng)時鐘T1定時溢出溢出T1:方式2波特率2T1時鐘505.3 波特率(續(xù)1)UART0 波特率公式:波特率 = 2例:振蕩器分頻=1,T1分頻=12,波特率=9600,求T1的初值=?解:振蕩器分頻=1:OSCICN |= 0 x03;SYSCLK=24.5MHzT1分頻=12 (默認(rèn)) :CKCON = 0 x00;T1時鐘=24.5/12=2.0417MHz波特率 = 9600T1計數(shù)值 = 2041700
27、/ 9600 / 2 = 106T1初值 = 256 106 = 150T1CLK(256-T1H)51RS-2325.4 UART應(yīng)用實(shí)例例題:C8051F310通過串口發(fā)送一些信息。通過電腦運(yùn)行的串口調(diào)試軟件顯示這些信息。C8051F310目標(biāo)板C8051F310525.4 UART應(yīng)用實(shí)例(續(xù)1)#include / C8051F310的SFR定義#include / 可以使用printf等函數(shù)#defineT0_VAL(65536-20417)/ T0初值sbitLED=P33;/ LED位定義bitb10ms;/ 10ms標(biāo)志unsigned char Cnt10ms;/- 初始化
28、-void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P3MDOUT = 0 x08;/ LED=P3.3推挽輸出CKCON = 0 x00;/ 默認(rèn)值:T0=系統(tǒng)時鐘/12TMOD = 0 x21;/ T1方式2,T0方式1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;TR0 = 1;/ 啟動T0ET0 = 1;EA = 1;535.4 UART應(yīng)用實(shí)例(續(xù)2)/- UART初始化 -void UART_init(void)OSCICN |= 0 x03;/ SYSCLK=24.5MhzXBR0 = 0 x01;/
29、 交叉開關(guān)0:允許UARTXBR1 = 0 x40;/ 交叉開關(guān)1:允許XBARSCON0 = 0 x10;/ SCON0: 8位,允許接收,TH1 = (256-106);/ 波特率=9600TL1 = TH1; TR1 = 1;/ 啟動 Timer1TI0 = 1;/ TI 發(fā)送完成545.4 UART應(yīng)用實(shí)例(續(xù)3)/- 10ms處理 -void do_10ms(void)/- 100ms處理 -void do_100ms(void)/- 1s處理 -void do_1s(void)LED = !LED;/ LED閃爍printf(“rnHello”);/ 向串口輸出字符串555.4 U
30、ART應(yīng)用實(shí)例(續(xù)4)/- 主程序 -void main(void)UART_init();/ UART初始化First ();/ 初始化while(1)if(b10ms)b10ms = 0;do_10ms();if(Cnt10ms % 10 = 0)do_100ms();if(+Cnt10ms = 100)Cnt10ms=0;do_1s();565.4 UART應(yīng)用實(shí)例(續(xù)5)/- 定時中斷 10ms -void T0_Int(void)interrupt 1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;b10ms = 1;由于系統(tǒng)函數(shù)printf()占用資源比
31、較多,建議自己編寫簡單的字符串輸出函數(shù)Fs_Str()。575.5 UART應(yīng)用實(shí)例b不使用printf函數(shù),自己構(gòu)建Fs_Str函數(shù):/- 串口發(fā)送1字節(jié) -void Fs_1Byte(unsigned char v)SBUF0 = v;while(!TI0);TI0 = 0;/- 串口發(fā)送code字符串 -void Fs_Str(unsigned char code *Str)while(*Str)Fs_1Byte(*Str+);去掉頭文件#include 在使用printf(“rnHello);的地方,改為Fs_Str(rnHello);585.4 UART應(yīng)用實(shí)例(續(xù)5)無printf
32、、Fs_Str函數(shù)時,資源占用:Program Size: data=20.1 xdata=0 code=125用printf函數(shù)時,資源占用:Program Size: data=41.2 xdata=0 code=1183推算,printf需要資源:data=41.2-20.1=21.1,code=1183-125=1058用自建Fs_Str函數(shù),資源占用:Program Size: data=23.1 xdata=0 code=194推算, Fs_Str函數(shù)需要資源:data=23.1-20.1=3,code=194-125=69595.6 提高題(1)試將上述例題中的波特率改為4800
33、。(2)通過串口,將溫度值每秒一次發(fā)送到電腦。(3)通過串口,發(fā)送以下信息:按一次S2,將C8051F310內(nèi)部RAM的00H7FH單元的內(nèi)容發(fā)送到電腦顯示。60實(shí)例6 SMBus應(yīng)用(24C0X)6.1 SMBus規(guī)范6.2 24C0X簡介6.3 I2C底層程序6.4 I2C測試程序(24C0X)6.5 提高題(24C0X)616.1 SMBus規(guī)范SMBus與I2C兼容用2根導(dǎo)線傳遞雙向信號:SDA:串行數(shù)據(jù)SCL:串行時鐘典型SMBus 連接:626.1 SMBus規(guī)范(續(xù)1)SMBus規(guī)定:SCL=0時,SDA可以變化;SCL=1時,SDA的變化有特殊定義。開始位:SCL=1時,SDA
34、的下跳變。停止位:SCL=1時,SDA的上跳變。數(shù)據(jù)1:SCL=1時,SDA的1。數(shù)據(jù)0:SCL=1時,SDA的0。應(yīng)答ACK:即數(shù)據(jù)0。應(yīng)答NACK:即數(shù)據(jù)1。SCLSDA開始位停止位SCLSDA數(shù)據(jù)1數(shù)據(jù)0ACKNACK636.1 SMBus規(guī)范(續(xù)2)主器件:發(fā)開始位、停止位,發(fā)SCL。通常由MCU擔(dān)任。從器件:聽從主器件指揮。通常為各種外圍功能芯片??梢杂?個主器件,多個從器件。每個從器件有從地址SLA,最低位為讀寫位,0=寫,1=讀。例如:I2C接口E2PROM芯片24C0X的從地址為1010000X,(0 xA0)I2C接口鍵盤及LED驅(qū)動ZLG7290的從地址為0111000X,
35、(0 x70)I2C接口日歷芯片PCF8563的從地址為1010001X,(0 xA2)主、從器件都可以發(fā)送、接收。接收者負(fù)責(zé)返回應(yīng)答信號ACK或NACK一次通訊過程由1個開始位、若干數(shù)據(jù)字節(jié)+應(yīng)答、1個停止位組成646.2 24C0X簡介24C01A/02A/04A1K/2K/4K位的電擦除PROM。使用標(biāo)準(zhǔn)2線串行接口I2C。同一總線中最多可連接8個24C01/02或4個24C04。有硬件寫保護(hù)功能。656.3 I2C底層程序例題:以F310為主器件,24C02為從器件為例,編制I2C底層程序和測試程序。1KVCCF310P0.1 SCLP0.0 SDAGND24C02SCL A0SDA
36、A1 A2GND WP666.3 I2C底層程序(續(xù)1)/-口位地址定義-sbitSDA= P00;sbitSCK= P01;/-發(fā)送1個開始位-void Start(void)SDA=1; SCK=1;SDA=0;SCK=0;SDA=1;/ 釋放SDA/-發(fā)送1個停止位-void Stop(void)SDA=0;SCK=1;SDA=1;SCLSDA起始位結(jié)束位676.3 I2C底層程序(續(xù)2)bit bACK;/-發(fā)出1個NACK,也用于讀入ACK -bit TestACK()SDA=1;SCK=1;bACK=SDA;SCK=0;return(bACK);/-發(fā)出1個ACK-void I2C
37、_ACK(void)SDA=0;SCK=1;SCK=0;SDA=1;SCLSDANACKACK686.3 I2C底層程序(續(xù)3)/-輸出8位。入口 v=發(fā)送的數(shù)據(jù)-void Out8Bit(uchar v)uchar i;for(i=0;i8;i+)SDA=(bit)(v & 0 x80);/ 高位移到SDASCK=1;/ 發(fā)1個時鐘SCK=0;v=v1;TestACK();/ 發(fā)送SDA=1,以接收ACKSCLSDA寫出數(shù)據(jù)1寫出數(shù)據(jù)0696.3 I2C底層程序(續(xù)4)/- 輸入8位。入口:fACK=發(fā)送的ACK,返回:接收的數(shù)據(jù) -uchar In8Bit(bit fACK)uchar i
38、,v=0;for(i=0;i8;i+)SCK=1;/ 發(fā)1個時鐘v=v1;v=v | (uchar)(SDA);/ 讀SDASCK=0;if(fACK)I2C_ACK();/ 發(fā)ACKelseTestACK();/ 發(fā)NACKreturn(v);SCLSDA讀到數(shù)據(jù)1讀到數(shù)據(jù)0706.3 I2C底層程序(續(xù)5)MCU寫出1字節(jié)到E2PROM:從應(yīng)答主發(fā)送0=Wr1 0 1 0 0 0 0 0716.3 I2C底層程序(續(xù)6)/-寫出1個字節(jié)。入口 Addr=8位地址,v=數(shù)據(jù) -void I2C_Wr1By(uchar Addr,uchar v)Start();/ 發(fā)送1個開始位Out8Bit
39、(0 xa0);/ 發(fā)出器件slave地址,24系列為1010XXX0寫Out8Bit(Addr);/ 發(fā)送存儲單元地址Out8Bit(v);/ 發(fā)送寫數(shù)據(jù)Stop();/ 發(fā)送1個停止位ACKPol();/ ACK輪詢,檢查寫完成/- ACK輪詢,等待寫完成。-void ACKPol(void)bACK=1;while(bACK)/ 取EE的ACKStart();/ 發(fā)送1個開始位Out8Bit(0 xa0);/ 發(fā)寫命令,如果器件忙,bACK=1Stop();/ 發(fā)送1個停止位726.3 I2C底層程序(續(xù)7)MCU從E2PROM讀入1字節(jié):從應(yīng)答主應(yīng)答主發(fā)送從發(fā)送0=Wr1=Rd1 0
40、1 0 0 0 0 01 0 1 0 0 0 0 1736.3 I2C底層程序(續(xù)8)/-讀入1個字節(jié)。入口 Addr=8位地址,返回讀入數(shù)據(jù)-uchar I2C_Rd1By(uchar Addr)uchar v;Start();/ 發(fā)送1個開始位Out8Bit(0 xa0);/發(fā)出器件slave地址,24系列為1010XXX0寫Out8Bit(Addr);/ 發(fā)送存儲單元地址Start();/ 再發(fā)送1個重啟動命令Out8Bit(0 xa1);/ 發(fā)出器件slave地址,24系列為1010XXX1讀v=In8Bit(0);/ 讀入1字節(jié)數(shù)據(jù),發(fā)NACK,告訴器件要結(jié)束了Stop();/ 發(fā)送
41、1個停止位return(v);746.4 I2C測試程序(24C0X)#include / C8051F310的SFR定義/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看門狗)P0MDOUT = 0 x00;/ P0.0=SDA,P0.1=SCK,OC輸出XBR1 = 0 x40;/ 交叉開關(guān)1:允許XBAR/- 主程序(測試I2C函數(shù)) -void main(void)uchar Addr=0 x02,Wr_v=0 x40,Rd_v;First ();/ 初始化while(1)I2C_Wr1By(Addr,Wr_v);/ 將Wr_
42、v的值寫出到Addr地址Rd_v = I2C_Rd1By(Addr);/ 讀入Addr地址的值到Rd_vAddr+;Wr_v+;756.5 提高題(24C0X)(1)通過串口讀取24C0X:鍵入“D0”,顯示24C0X的00H0FH單元的內(nèi)容,鍵入“D1”,顯示24C0X的10H1FH單元的內(nèi)容,依此類推。(2)通過串口讀寫24C0X:鍵入一個字符串,以回車結(jié)束,保存到24C0X。斷電重新啟動后,顯示一次24C0X中保存的字符串。76實(shí)例7 I2C應(yīng)用(ZLG7290)7.1 ZLG7290簡介7.2 F310與ZLG7290的連接7.3 ZLG7290的驅(qū)動7.4 ZLG7290測試程序7.
43、5 提高題(ZLG7290)777.1 ZLG7290簡介特點(diǎn)LED/鍵盤驅(qū)動芯片I2C串行接口,寫:0 x70;讀:0 x71可驅(qū)動8位共陰數(shù)碼管和64個按鍵。可控掃描位數(shù),可控任一數(shù)碼管閃爍。無需外接元件驅(qū)動LED。提供鍵盤中斷??蓹z測鍵的連擊次數(shù)。787.2 F310與ZLG7290的連接C8051F310與ZLG7290連接示意圖ZLG7290SDASCLINTRSTF310P10P11P12P13VCC1K位置0797.3 ZLG7290的驅(qū)動ZLG7290速度較慢,I2C驅(qū)動中要加延時例如:void nop(uchar n)for( ;n!=-1;n-);/*發(fā)送1個啟動命令*/v
44、oid Start(void)SDA=1;nop(1);SCK=1;nop(1);SDA=0;nop(1);SCK=0;nop(1);SDA=1;nop(1);807.3 ZLG7290的驅(qū)動(續(xù)1)ZLG7290顯示通訊接口:從地址=0 x70內(nèi)部有寄存器0 x000 x17,7、8號是命令接口在第w個位置處顯示v的方法是,連續(xù)向7、8號寄存器寫入:DP=1:小數(shù)點(diǎn)亮Flash=1:閃爍最右邊數(shù)碼管的位置w=0顯示值v=0F例如:在第7個位置處顯示3:向7、8號送0 x67、0 x03寄存器D7D6D5D4D3D2D1D070110顯示位w8DPFlash0顯示值v817.3 ZLG7290
45、的驅(qū)動(續(xù)2)連續(xù)寫出n個字節(jié)的函數(shù):/入口 sla=從地址,Addr=8位地址,*s=指向數(shù)據(jù),n=數(shù)據(jù)個數(shù)void I2C_WrnBy(uchar sla,uchar Addr,uchar data *s,uchar n)uchar i;Start();/ 發(fā)送1個開始位Out8Bit(sla);/ 發(fā)出器件slave地址,ZLG7290為0 x70Out8Bit(Addr);/ 發(fā)送存儲單元地址for(i=0;in;i+)/ 連續(xù)n次Out8Bit(*s+);/ 發(fā)送寫數(shù)據(jù) Stop();/ 發(fā)送1個停止位827.3 ZLG7290的驅(qū)動(續(xù)3)zlg7290 顯示命令(在第w位,顯示v
46、):#define ZLG7290_sla 0 x70/ZLG7290的從地址=0 x70void ZLG7290_Disp(uchar w,uchar v)uchar Data2;Data0=0 x60+w;Data1=v;I2C_WrnBy(ZLG7290_sla,0 x07,Data,2);Delay(10);例如:在第7個位置處顯示3:ZLG7290_Disp(7, 3);837.3 ZLG7290的驅(qū)動(續(xù)4)ZLG7290鍵盤通訊接口:當(dāng)有按鍵時,ZLG7290發(fā)出INT=01號寄存器為鍵值寄存器,0=無鍵,116=鍵值。讀鍵程序:sbit KEY_INT =P12;uchar k
47、ey;if(KEY_INT=0)key=I2C_Rd1By(ZLG7290_sla,1);/ 從1號寄存器讀入鍵值ZLG7290_Disp(0,key);/ 在第0位處,顯示鍵值847.3 ZLG7290的驅(qū)動(續(xù)4)ZLG7290的復(fù)位:初始化時做一次,向RST發(fā)出一個負(fù)脈沖,延時一段時間,等待ZLG7290完成復(fù)位。復(fù)位函數(shù):sbit ZLG_RST =P13;/ ZLG_RST管腳要上拉1K電阻,抗干擾/- zlg7290 復(fù)位 -void ZLG7290_reset(void)ZLG_RST=0;Delay(1);ZLG_RST=1;Delay(200);857.4 ZLG7290測試
48、程序先在數(shù)碼管上顯示“76543210”,然后,每按一鍵,在第0位置處顯示鍵值。void main(void)uchar i,key;First ();/ 初始化ZLG7290_reset();for(i=0;i8;i+)ZLG7290_Disp(i,i);/ 在第i位處,顯示i值while(1)if(KEY_INT=0)key=I2C_Rd1By(ZLG7290_sla,1);/ 從1號寄存器讀入鍵值ZLG7290_Disp(0,key);/ 在第0位處,顯示鍵值867.5 提高題(ZLG7290)(1)在右邊3個數(shù)碼管上顯示一個0255的計數(shù)值,每0.1秒增1。(2)在上題基礎(chǔ)上,增加以下功能:當(dāng)按過1號鍵,每0.1秒增1 ;按過2號鍵,每0.1秒減1 。87實(shí)例8 I2C應(yīng)用(PCF8563T)8.1 PCF8563T簡介8.2 F310與PCF8563T的連接8.3 PCF8563T的驅(qū)動8.4 PCF8563T測試程序8.5 提高題(PCF8563T)888.1 PCF8563T簡介特點(diǎn)實(shí)時時鐘日歷芯片,I2C串行接口,寫:0 xA2;讀:0 xA3 可編程時鐘輸出,報警和定時器.898.2 F310與PCF8563T的連接C8051F310與PCF8563T連接示意圖
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《溝通中外文明的“絲綢之路”》聽課評課記錄3(新部編人教版七年級上冊歷史)
- 人教版部編歷史九年級下冊《第5課 第二次工業(yè)革命》聽課評課記錄
- 湘教版數(shù)學(xué)九年級上冊3.4.1《相似三角的判定》(第1課時)聽評課記錄
- 人教部編版九年級歷史下冊聽課評課記錄:第4課《日本明治維新》
- 北師大版歷史八年級上冊第2課《第二次鴉片戰(zhàn)爭》聽課評課記錄
- 蘇教版四年級數(shù)學(xué)上冊期末復(fù)習(xí)口算練習(xí)題一
- 蘇教版二年級數(shù)學(xué)下冊《兩位數(shù)減兩位數(shù)的口算》教學(xué)設(shè)計
- 上市或擬上市公司獨(dú)立董事聘任合同范本
- 孵化器委托運(yùn)營協(xié)議書范本
- 企業(yè)承包合同范本
- 2023年菏澤醫(yī)學(xué)專科學(xué)校單招綜合素質(zhì)模擬試題及答案解析
- 鋁合金門窗設(shè)計說明
- 常見食物的嘌呤含量表匯總
- 小學(xué)數(shù)學(xué)-三角形面積計算公式的推導(dǎo)教學(xué)設(shè)計學(xué)情分析教材分析課后反思
- 人教版數(shù)學(xué)八年級下冊同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語)試題庫含答案解析
- 秦暉社會主義思想史課件
- 積累運(yùn)用表示動作的詞語課件
- 機(jī)動車登記證書英文證書模板
- 質(zhì)量管理體系基礎(chǔ)知識培訓(xùn)-2016
評論
0/150
提交評論