(玩電子(zi)) 電子(zi)技術學習(xi)與研xin)/div>
當(dang)前(qian)位置︰單片機教程網 >> 基礎教程 >> 瀏覽文章

福彩天下官网

作者:佚名   來源:本站原(yuan)創   點擊數:x  更新lv)奔洌007年07月(yue)14日   【字體︰大(da)

學習(xi)了條件(jian)語句(ju),用多個條件(jian)語句(ju)能實現多方向條件(jian)分支(zhi),但是(shi)能發現使用過多的 條件(jian)語句(ju)實現多方向分支(zhi)會(hui)使條件(jian)語句(ju)嵌套(tao)過多,程序冗(rong)長(chang),這樣讀起來也很不好(hao)讀。這個時候 使用開(kai)關語句(ju)同(tong)樣能達到處理多分支(zhi)選(xuan)擇(ze)的目的,又(you)能使程序結構清晰。它的語法為下︰

switch  (表達式)

{

case  常量表達式 1:  語句(ju) 1;  break; case  常量表達式 2:  語句(ju) 2;  break; case  常量表達式 3:  語句(ju) 3;  break; case  常量表達式 n:  語句(ju) n;  break; default:    語句(ju)

}

運行中 switch 後面的表達式的值將(jiang)會(hui)做為條件(jian),與 case 後面的各(ge)個常量表達式的值相 對比,如果相等(deng)時則(ze)執(zhi)行 case 後面的語句(ju),再執(zhi)行 break(間斷語句(ju))語句(ju),跳出 switch 語句(ju)。如果 case 後沒有和條件(jian)相等(deng)的值時就執(zhi)行 default 後的語句(ju)。當(dang)要求沒有符合xi)奶件(jian)時不做任何處理,則(ze)能不寫 default 語句(ju)。

在(zai)上面的章節中我們一直在(zai)用 printf 這個標準的 C 輸出函(han)數做字符的輸出,使用它當(dang) 然(ran)會(hui)很方便,但它的功能強(qiang)大(da),所(suo)佔jia)玫拇媧 佔渥勻ran)也很大(da),要 1K 左右字節空間,如果 再加(jia)上 scanf 輸入函(han)數就要達到 2K 左右的字節,這樣的話如果要求用 2K 存儲空間的芯(xin)片時 就無法再使用這兩個函(han)數,例如 AT89C2051。在(zai)這些小項目中,通常我們只是(shi)要求簡單的字 符輸入輸出,這里以筆(bi)shou)叻 碓zai)本人網站的一個簡單的串(chuan)行口應用實例為例,一來學習(xi)使用開(kai) 關語句(ju)的使用,二來簡單了解 51 芯(xin)片串(chuan)行口基本編程。這個實例是(shi)用 PC 串(chuan)行口通過上位機程序 與由 AT89c51 組成的下位機相通信,實現用 PC 軟件(jian)控制 AT89c51 芯(xin)片的 IO 口,這樣也就可(ke) 以再通過相關電路實現對設備的控制。為了方便實驗(yan),在(zai)此所(suo)使用的硬件(jian)還是(shi)用回(hui)以上課程 中做好(hao)的硬件(jian),以串(chuan)行口和  PC  連(lian)接,用  LED  查看實驗(yan)的結果。原(yuan)代碼請到在(zai)筆(bi)shou)叩耐下載,上面有  單片機c語言  下位機源碼、PC 上位機源碼、電路圖等(deng)資料。

代碼中有多處使用開(kai)關語句(ju)的,使用它對不一樣的條件(jian)做不一樣的處理,如在(zai) CSToOut 函(han)數 中根據 CN[1]來選(xuan)擇(ze)輸出到那(na)個 IO 口,CN[1]=0 則(ze)把 CN[2]的值送到 P0,CN[1]=1 則(ze)送到 P1, 這樣的寫法比起用 if (CN[1]==0)這樣的判斷語句(ju)來的na)邐髁恕5dang)然(ran)它們的效果沒有太大(da) 的差別(bie)(在(zai)不考慮(lv)編譯後的代碼執(zhi)行效率(lv)的na)榭kuang)下)。

在(zai)這段代碼主要的作用就是(shi)通過串(chuan)行口和上位機軟件(jian)進行通信,跟據上位機的命(ming)令(ling)字zhi)chuan), 對指(zhi)定的 IO 端口進行讀寫。InitCom 函(han)數,原(yuan)型為 void InitCom(unsigned char BaudRate), 其作用為初始化(hua)串(chuan)行口。它的輸入參數為一個字節,程序就是(shi)用這個參數做為開(kai)關語句(ju)的選(xuan)擇(ze) 參數。如調用 InitCom(6),函(han)數就會(hui)把波(bo)特率(lv)設置為 9600。當(dang)然(ran)這段代碼只使用了一種波(bo)特 率(lv),能用更高效率(lv)的語句(ju)去編寫,這里就不多討(tao)論(lun)了。

看到這里,你(ni)也許(xu)會(hui)問函(han)數中的 SCON,TCON,TMOD,SCOM 等(deng)是(shi)代表什(shi)麼?它們是(shi)特殊 功能寄存器。

SBUF    數據緩沖寄存器    這是(shi)一個能直接尋(xun)址的串(chuan)行口專(zhuan)用寄存器。有朋友這樣問起 過“為何在(zai)串(chuan)行口收(shou)發中,都只是(shi)使用到同(tong)一個寄存器 SBUF?而不是(shi)收(shou)發各(ge)用一個寄存器。” 實際上 SBUF 包(bao)含(han)了兩個獨立的寄存器,一個是(shi)發送寄存,另一個是(shi)接you)佔拇嫫鰨  嵌共同(tong)使用同(tong)一個尋(xun)址地址-99H。CPU 在(zai)讀 SBUF 時會(hui)指(zhi)到接you)佔拇嫫鰨 zai)寫時會(hui)指(zhi)到發送寄

存器,而且接you)佔拇嫫魘shi)雙緩沖寄存器,這樣能避(bi)免接you)罩卸廈揮屑笆鋇謀幌 Γ 菝/p>


 

有被取走,下一幀(zheng)數據已到來,而造成的數據重(zhong)疊問題(ti)。發送器則(ze)不需要用到雙緩沖,一般 情況(kuang)下我們在(zai)寫發送程序時也不必(bi)用到發送中斷xian)?飫矸?褪蕁2僮SBUF 寄存器的方法 則(ze)很簡單,只要把這個 99H 地址用關鍵字 sfr 定義為一個變量就能對其進行讀寫操作了,

如 sfr  SBUF  =  0x99;當(dang)然(ran)你(ni)也能用其它的名稱。通常在(zai)標準的 reg51.h 或 at89x51.h 等(deng) 頭(tou)文件(jian)中已對其做了定義,只要用#include 引用就能了。

SCON    串(chuan)行口控制寄存器    通常在(zai)芯(xin)片或設備中為了監(jian)視或控制接口狀態(tai),都會(hui)引用 到接口控制寄存器。SCON 就是(shi) 51 芯(xin)片的串(chuan)行口控制寄存器。它的尋(xun)址地址是(shi) 98H,是(shi)一個 能位尋(xun)址的寄存器,作用就是(shi)監(jian)視和控制 51 芯(xin)片串(chuan)行口的工作狀態(tai)。51 芯(xin)片的串(chuan)行口能 工作在(zai)幾(ji)個不一樣的工作模式下,其工作模式的設置就是(shi)使用 SCON 寄存器。它的各(ge)個位的具 體定義如下︰

(MSB)                                                                                                (LSB) SM0          SM1          SM2          REN          TB8          RB8           TI            RI

表 8-1    串(chuan)行口控制寄存器 SCON

SM0、SM1  為串(chuan)行口工作模式設置位,這樣兩位能對應進行四種模式的設置。看表  8

-2 串(chuan)行口工作模式設置。

SM0

SM1

模    式

功    能

波(bo)特率(lv)

0

0

0

同(tong)步移位寄存器

fosc/12

0

1

1

8 位 UART

可(ke)變

1

0

2

9 位 UART

fosc/32 或 fosc/64

1

1

3

9 位 UART

可(ke)變

表 8-2    串(chuan)行口工作模式設置

在(zai)這里只說de)髯畛S玫哪J1,其它的模式也就一一略過,有興趣的朋友能找相關的 硬件(jian)資料查看。表中的  fosc  代表振蕩器的頻率(lv),也就是(shi)晶體震蕩器的頻率(lv)。UART  為(Universal Asynchronous  Receiver)的英文縮寫。

SM2 在(zai)模式 2、模式 3 中為多處理機通信使能位。在(zai)模式 0 中要求該位為 0。

REM 為允許(xu)接you)瘴唬EM 置 1 時串(chuan)行口允許(xu)接you)眨 0 時禁止接you)鍘EM 是(shi)由軟件(jian)置位或 清零。如果在(zai)一個電路中接you)蘸頭(tou)?鴕P3.0,P3.1 都和上位機相連(lian),在(zai)軟件(jian)上有串(chuan)行口中斷 處理程序,當(dang)要求在(zai)處理某個子(zi)程序時不允許(xu)串(chuan)行口被上位機來的控制字符產生中斷,那(na)麼可(ke) 以在(zai)這個子(zi)程序的開(kai)始處加(jia)入 REM=0 來禁止接you)眨 zai)子(zi)程序結束(shu)處加(jia)入 REM=1 再次打開(kai)串(chuan)行口 接you)鍘4da)家也能用上面的實際源碼加(jia)入 REM=0 來進行實驗(yan)。

TB8 發送數據位 8,在(zai)模式 2 和 3 是(shi)要發送的第 9 位。該位能用軟件(jian)根據需要置位或 清除(chu),通常這位在(zai)通信協議中做奇(qi)偶位,在(zai)多處理機通信中這一位則(ze)用于表示(shi)是(shi)地址幀(zheng)還是(shi) 數據幀(zheng)。

RB8 接you)帳菸8,在(zai)模式 2 和 3 是(shi)已接you)帳蕕牡9 位。該位可(ke)能是(shi)奇(qi)偶位,地址/ 數據標識位。在(zai)模式 0 中,RB8 為保留位沒有被使用。在(zai)模式 1 中,當(dang) SM2=0,RB8 是(shi)已接 收(shou)數據的停止位。

TI 發送中斷標識位。在(zai)模式 0,發送完第 8 位數據時,由硬件(jian)置位。其它模式中則(ze)是(shi)在(zai) 發送停止位之初,由硬件(jian)置位。TI 置位後,申請中斷,CPU 響應中斷後,發送下一幀(zheng)數據。 在(zai)任何模式下,TI 都必(bi)須由軟件(jian)來清除(chu),也就是(shi)說在(zai)數據寫入到 SBUF 後,硬件(jian)發送數據,

中斷響應(如中斷打開(kai)),這個時候 TI=1,表明發送已完成,TI 不會(hui)由硬件(jian)清除(chu),所(suo)以這個時候必(bi)須


 

用軟件(jian)對其清零。

RI 接you)罩卸媳曄段弧Tzai)模式 0,接you)盞8 位結束(shu)時,由硬件(jian)置位。其它模式中則(ze)是(shi)在(zai)接 收(shou)停止位的半中間,由硬件(jian)置位。RI=1,申請中斷,要求 CPU 取走數據。但在(zai)模式 1 中,SM2=1 時,當(dang)未收(shou)到有效的停止位,則(ze)不會(hui)對 RI 置位。同(tong)樣 RI 也必(bi)須要靠軟件(jian)清除(chu)。

常用的串(chuan)行口模式 1 是(shi)傳輸 10 個位的,1 位起始位為 0,8 位數據位,低位在(zai)先(xian),1 位停止 位為 1。它的波(bo)特率(lv)是(shi)可(ke)變的,其速率(lv)是(shi)取決于定時器 1 或定時器 2 的定時值(溢(yi)出速率(lv))。 AT89c51 和 AT89C2051 等(deng) 51 系(xi)列芯(xin)片只有兩個定時器,定時器 0 和定時器 1,而定時器 2

是(shi) 89C52 系(xi)列芯(xin)片才有的。

波(bo)特率(lv)    在(zai)使用串(chuan)行口做通信時,一個很重(zhong)要的參數就是(shi)波(bo)特率(lv),只有上下位機的波(bo)特率(lv) 一樣時才能進行正常通信。波(bo)特率(lv)是(shi)指(zhi)串(chuan)行端口每秒內能傳輸的波(bo)特位數。有一些開(kai)始學習(xi) 的朋友認為波(bo)特率(lv)是(shi)指(zhi)每秒傳輸的字節數,如標準  9600  會(hui)被誤認為每秒種能傳送  9600 個字節,而實際上它是(shi)指(zhi)每秒能傳送 9600 個二進位,而一個字節要 8 個二進位,如用串(chuan) 口模式 1 來傳輸那(na)麼加(jia)上起始位和停止位,每個數據字節就要佔jia)10 個二進位,9600 波(bo)特 率(lv)用模式 1 傳輸時,每秒傳輸的字節數是(shi) 9600÷10=960 字節。51 芯(xin)片的串(chuan)行口工作模式 0 的波(bo)特率(lv)是(shi)固定的,為 fosc/12,以一個 12M 的晶體震蕩器來計算(suan),那(na)麼它的波(bo)特率(lv)能達到 1M。 模式 2 的波(bo)特率(lv)是(shi)固定在(zai) fosc/64 或 fosc/32,具體用那(na)一種就取決于 PCON 寄存器中的 SMOD 位,如 SMOD 為 0,波(bo)特率(lv)為 focs/64,SMOD 為 1,波(bo)特率(lv)為 focs/32。模式 1 和模式 3 的波(bo) 特率(lv)是(shi)可(ke)變的,取決于定時器 1 或 2(52 芯(xin)片)的溢(yi)出速率(lv)。那(na)麼我們怎麼去計算(suan)這兩個模 式的波(bo)特率(lv)設置時相關的寄存器的值呢?能用以下的公式去計算(suan)。

波(bo)特率(lv)=(2SMOD÷32)×定時器 1 溢(yi)出速率(lv)

上式中如設置了 PCON 寄存器中的 SMOD 位為 1 時就能把波(bo)特率(lv)提(ti)升 2 倍(bei)。通常會(hui)使用 定時器 1 工作在(zai)定時器工作模式 2 下,這個時候定時值中的 TL1 做為計數,TH1 做為自動(dong)重(zhong)裝值    , 這個定時模式下,定時器溢(yi)出後,TH1 的值會(hui)自動(dong)裝載到 TL1,再次開(kai)始計數,這樣能不 用軟件(jian)去干預,使得(de)定時更準確。在(zai)這個定時模式 2 下定時器 1 溢(yi)出速率(lv)的計算(suan)公式如下︰

溢(yi)出速率(lv)=(計數速率(lv))/(256-TH1) 上式中的“計數速率(lv)”與所(suo)使用的晶體振蕩器頻率(lv)有關,在(zai) 51 芯(xin)片中定時器啟動(dong)後會(hui)

在(zai)每一個機器周期使定時寄存器 TH 的值增加(jia)一,一個機器周期等(deng)于十二個振蕩周期,所(suo)以

能得(de)知 51 芯(xin)片的計數速率(lv)為晶體振蕩器頻率(lv)的 1/12,一個 12M 的晶體震蕩器用在(zai) 51 芯(xin)片上, 那(na)麼 51 的計數速率(lv)就為 1M。通常用 11.0592M 晶體是(shi)為了得(de)到標準的無誤差的波(bo)特率(lv),那(na) 麼為何呢?計算(suan)一下就知道了。如我們要得(de)到 9600 的波(bo)特率(lv),晶體震蕩器為 11.0592M 和 12M,定 時器 1 為模式 2,SMOD 設為 1,分別(bie)看看那(na)所(suo)要求的 TH1 為何值。代入公式︰

11.0592M

9600=(2÷32)×((11.0592M/12)/(256-TH1))

TH1=250    //看看是(shi)不是(shi)和上面實例中的使用的數值一樣?

12M

9600=(2÷32)×((12M/12)/(256-TH1)) TH1 249.49

上面的計算(suan)能看出使用 12M 晶體的時候計算(suan)出來的 TH1 不為整數,而 TH1 的值只能取


 

整數,這樣它就會(hui)有一定的誤差存在(zai)不能產生精確的 9600 波(bo)特率(lv)。當(dang)然(ran)一定的誤差是(shi)能 在(zai)使用中被接you)艿模 退suan)使用 11.0592M 的晶體振蕩器也會(hui)因晶體本身所(suo)存在(zai)的誤差使波(bo)特

率(lv)產生誤差,但晶體本身的誤差對波(bo)特率(lv)的影(ying)響是(shi)十分之小的,能忽略不計。

福彩天下官网

福彩天下官网

福彩天下官网 | 下一页