?? 平凡單片機工作室.htm
字號:
src="平凡單片機工作室.files/c18.png"></IMG><BR> 圖16 用定時器實現LED閃爍<BR> 參考圖16輸入源程序,建立并設置工程,本例使用實驗仿真板難以得到理想的結果,應使用硬件進行練習。<BR> 分析:要使用單片機的定時器,首先要設置定時器的工作方式,然后給定時器賦初值,即進行定時器的初始化。這里選擇定時器0,工作于定時方式,工作方式1,即16位定時/計數的工作方式,不使用門控位。由此可以確定定時器的工作方式字TMOD應為00000001B,即0x01。定時初值應為65536-60000=5536,由于不能直接給T0賦值,必須將5536轉化為十六進制即為0x15a0,這樣可以寫出初始化程序:<BR>TMOD=0x01;<BR>TH0=0x15;<BR>TL0=0xa0;<BR> 初始化定時器后,要定時器工作,必須將TR0置1,程序中用“TR0=1;”來實現。<BR> 可以用中斷或查詢的方式來使用定時器,本例使用查詢方式,中斷方式稍后介紹。<BR> 由定時時間到后,TF0被置為1,因此,只需要查詢TF0是否等于1即可得知定時時間是否到達,程序中用“if(TF0){…}”來判斷,如果TF0=0,則條件不滿足,大括號中的程序行不會被執行到,當定時時間到TF1=1后,條件滿足,即執行大括號中的程序行,首先將TF0清零,然后重置定時初值,最后是執行規定動作――取反P1.0的狀態。<BR> 2.中斷編程<BR> C51編譯器支持在C源程序中直接開發中斷過程,使用該擴展屬性的函數定義語法如下:<BR> 返回值 函數名 interrupt n<BR> 其中n對應中斷源的編號,其值從0開始,以80C51單片機為例,編號從0~4,分別對應外中斷0、定時器0中斷、外中斷1、定時器1中斷和串行口中斷。<BR> 2.1 中斷應用實例<BR> 下面我們同樣通過一個例子來說明中斷編程的應用。<BR> 例2 用中斷法實現定時器控制P1.0所接LED以60ms閃爍。<BR><IMG
src="平凡單片機工作室.files/c19.png"></IMG><BR> 圖17 用中斷法使用定時器<BR> 參考圖17輸入源程序,設置工程,同樣,本例用實驗仿真板難以看到真實的效果,應使用硬件來完成這一實驗。<BR> 分析:本例與例1的要求相同,唯一的區別是必須用中斷方式來實現。這里仍選用定時器T0,工作于方式1,無門控,因此,定時器的初始化操作與上例相同。要開啟中斷,必須將EA(總中斷允許)和ET0(定時器T0中斷允許)置1,程序中用“EA=1;”和“ET0=1;”來實現。在做完這些工作以后,就用for(;;){;}讓主程序進入無限循環中,所有工作均由中斷程序實現。<BR>由于定時器0的中斷編號為1,所以中斷程序中這樣寫:<BR>void timer0() interrupt 1<BR>{…}<BR> 可見,用C51語言寫中斷程序是非常簡單的,只要簡單地在函數名后加上interrupt 關鍵字和中斷編號就成了。<BR> 2.2 寄存器組切換<BR> 為進行中斷的現場保護,80C51單片機除采用堆棧技術外,還獨特地采用寄存器組的方式,80C51中有4組名稱均為R0~R7的工作寄存器,通過設置RS0、RS1來切換工作寄存器組,這使得中斷保護工作非常簡單和快速。使用匯編語言編程時,內存使用均由編程者控制,編程時可直接設置RS0、RS1,但用C語言編程,內存由編譯器分配和使用,因此,不能自行設置RS0、RS1,否則會造成內存使用的沖突。<BR> 在C51中,寄存器組選擇取決于特定的編譯器指令,即使用using n指定,其中n的值是0~3,對應使用四組工作寄存器。<BR>例如上述例子中可以這么樣來寫:<BR>void timer0() interrupt 1 using 2<BR>{…}<BR>表示在該中斷程序中使用第2組工作寄存器。<BR> 3.串行口編程<BR> 80C51系列單片機片上有UART用于串行通信,80C51中有兩個SBUF,一個用作發送緩沖器,一個用作接收緩沖器,在完成串口的初始化后,只要將數據送入發送SBUF,即可按設定好的波特率將數據發送出去,而在接收到數據后,可以從接收BUF中讀到接收到的數據。下面通過一個例子來了解串行口編程的方法。<BR> 例3 單片機P1口接8只發光二極管,P3.2~P3.5接有K1~K4共四個按鍵,使用串行口編程,1)由PC機控制單片機的P1口,將PC機送出的數以二進制形式顯示在發光二極管上;2)按下K1向主機發送數字0x55,按下K2向主機發送數字0xAA,使顯示轉下一行。<BR> <BR>#define uchar unsigned char<BR>#include "string.h"<BR>#include "reg51.h"<BR>void SendData(uchar Dat)<BR>{
uchar i=0;<BR>SBUF=Dat;<BR>while(1){ if(TI)<BR>{
TI=0;<BR>break;}}<BR>}<BR>void mDelay(unsigned int DelayTime)<BR>{
unsigned char j=0;<BR>for(;DelayTime>0;DelayTime--)<BR>{
for(j=0;j<125;j++) <BR>{;} <BR>}<BR>}<BR>uchar Key()<BR>{
uchar KValue;<BR>P3|=0x3e;
//中間4位置高電平<BR>if((KValue=P3|0xe3)!=0xff)<BR>{
mDelay(10);<BR>if((KValue=P3|0xe3)!=0xff)<BR>{
for(;;)<BR>if((P3|0xe3)==0xff)<BR>return(KValue);<BR>}<BR>}<BR>return(0);<BR>}
<BR><BR>void main()<BR>{ uchar KeyValue;<BR>P1=0xff;
//關閉P1口接的所有燈<BR>TMOD=0x20; //確定定時器工作模式<BR>TH1=0xFD;<BR>TL0=0xFD;
//定時初值<BR>PCON&=0x80; //SMOD=1<BR>TR1=1; //開啟定時器1<BR>SCON=0x40;
//串口工作方式1<BR>REN=1; //允許接收<BR>for(;;)<BR>{ if(KeyValue=Key())<BR>{
if((KeyValue|0xfb)!=0xff)
//K1按下<BR>SendData(0x55);<BR>if((KeyValue|0xf7)!=0xff)<BR>SendData(0xaa);<BR>}<BR>if(RI)<BR>{
P1=SBUF;<BR>RI=0;<BR>}<BR>}<BR>}<BR> <BR> 實現過程:輸入程序,命名為exam53.c,建立名為exam53的工程,將文件加入,設置工程,使用實驗仿真板進行調試。正確編譯連接后進入調試,打開實驗仿真板,然后再點擊viewserial #1打開串行窗口,在窗口空白處點右鍵,在彈出式菜單中選擇“Hex Mode”如圖18所示。<BR> <IMG
src="平凡單片機工作室.files/c20.png"></IMG><BR> 圖18 選擇顯示模式<BR> 單擊實驗仿真板的K1鍵和K2鍵,即可看到串行窗口中分別出現55和AA;單擊串行窗口的空白處,使其變為活動窗口,可接收鍵盤輸入,按下鍵盤上不同的字符鍵,可見實驗仿真板上的LED產生相應的變化。在實驗仿真板上按下K1一次、K2連續兩次、再按一次K1后,串行窗口中的狀態如圖19上部所示;在計算機鍵盤上按下“1”后實驗仿真板顯示的狀態如圖19下部所示?!?”使燈亮,“1”使燈滅,因此P1口的值為00110001,即0x31,這正是字符1的ASCII碼值。<BR> <IMG
src="平凡單片機工作室.files/c21.png"></IMG><BR> 圖19 使用實驗仿真板演示串行口操作<BR> 程序分析:本程序使用T1作為波特率發生器,工作于方式2(8位自動重裝入方式),波特率為19200,串行口工作于方式1,根據以上條件算出T1的定時初值為0xfd,TMOD應初始化為0x20,SMOD初始化為0x30,PCON中的SMOD位置1,主程序main的開頭對這些初值進行了設置。設置好初值后,用“TR1=1;”開啟定時器1,用“REN=1;”允許接收數據,然后進入無限循環中開始正常工作。在這個無限循環中首先調用鍵盤程序,檢測是否有鍵按下,及哪一個鍵被按下,如果K1被按下,則調用發送數據程序,將數0x55送出,如果K2被按下,則將數0xAA送出。接著檢測RI是否等于1,如果RI等于1,說明接收到字符,清RI,準備下一次接收,并將接收到的數據送往P1口顯示。一次循環結束,繼續開始下一次循環。<BR>發送函數SendData中有只有一個參數Dat,即待發送的字符,函數將該待發送的字符送入SBUF后,使用一個無限循環等待發送的結束,在循環中通過檢測TI來判斷數據是否發送完畢,發送完畢使用break語句退出循環。<BR> 該實驗同樣可用硬件實現,下面介紹使用前面課程中介紹的仿真型實驗板做實驗的方法。由于該板占用了串口作為仿真機與PC機的通訊,因此做串口通訊類實驗只能用下載后全速運行的方法,具體步驟如下: <BR> 1.設置工程,在Debug頁中選擇“Use Keil Monitor Drive”,點擊Setting按鈕,將通訊的波特率設置為19200;<BR> 2.進入調試后全速運行程序,然后按Debug->Stop Runing,按提示退出調試狀態,實際上這不并會中斷硬件電路的工作;<BR> 3.在PC機上運行一個串口調試軟件,這里以“串口調試助手”軟件為例,按圖20設置串口參數。按下實驗板上的K1、口,串口調試助手的接收窗口即可接收到0x55和0xAA,在串口調試助手的輸出窗口中鍵入數據,即可由實驗板接收并由P1顯示出來。<BR><IMG
src="平凡單片機工作室.files/c22.png"></IMG><BR> 圖20 設置串口參數<BR> 通過本課學習,我們了解了單片機內部資源編程的方法,下一課將通過一些綜合性的例子的介紹,繼續學習采用C語言編程的有關技術。<BR></FONT></TD></TR></TBODY></TABLE></TD>
<TD></TD></TR>
<TR>
<TD></TD>
<TD align=right vAlign=top>
<HR color=#006600 noShade SIZE=1>
【<A href="http://www.mcustudio.com/addreview.asp?id=單片機內部資源編程">發表評論</A>】
【<A href="http://www.mcustudio.com/review.asp?title=單片機內部資源編程">查看評論</A>】
【<A href="http://www.mcustudio.com/sendmail.asp?num=單片機內部資源編程">發給好友</A>】
【<A href="javascript:window.close()">關閉窗口</A>】</TD>
<TD></TD></TR>
<TR>
<TD></TD>
<TD vAlign=top>
<SCRIPT language=javascript src=""></SCRIPT>
</TD>
<TD></TD></TR></TBODY></TABLE><LINK href="css.css" rel=stylesheet type=text/css>
<DIV align=center style="WIDTH: 768px">
<DIV align=center>
<TABLE align=center border=1 borderColor=#6687ba cellPadding=0 cellSpacing=1
width=777>
<TBODY>
<TR bgColor=#fafbfc>
<TD align=middle height=52 width=771>
<DIV align=left>
<P><FONT face=" _GB2312"><B><A href="http://www.gw160.com/"><IMG border=0
height=31 src="平凡單片機工作室.files/gwdz.gif" width=88></A><A
href="http://hqele.51.net/"> <IMG border=0 height=30
src="平凡單片機工作室.files/hqdzw.gif" width=100></A> <IMG height=31
src="平凡單片機工作室.files/logo140.jpg" width=88> <A
href="http://www.ccelec.com/" target=_blank><IMG border=0 height=32
src="平凡單片機工作室.files/zonyandz.gif" width=88></A> <A
href="http://www.21io.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/21iologo.gif" width=89></A><A
href="http://www.21ele.com/main.asp"> <IMG border=0 height=31
src="平凡單片機工作室.files/hclogo.gif" width=88></A> <A
href="http://half.nease.net/"><IMG border=0 height=31
src="平凡單片機工作室.files/freewind.gif" width=88> </A><A
href="http://www.longtoo.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/longtoo.gif" width=88></A></B></FONT></P>
<P><FONT face=" _GB2312"><B><A href="http://bes.8u8.com/"><IMG border=0
height=31 src="平凡單片機工作室.files/zydh.gif" width=88></A><A
href="http://www.xch-dz.com/"> <IMG border=0 height=31
src="平凡單片機工作室.files/xch2.gif" width=88> </A><A
href="http://bbs.cnelc.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/cnelc.gif" width=88></A> <IMG height=31
src="平凡單片機工作室.files/logo1.gif" width=88></B></FONT> <FONT
face=" _GB2312"><B><A href="http://www.cvtech.com.cn/"><IMG border=0
height=31 src="平凡單片機工作室.files/cwt.gif" width=88></A></B></FONT> <A
href="http://www.51-lab.com/"><IMG border=0 height=30
src="平凡單片機工作室.files/51-lab.gif" width=100></A> <STRONG><FONT
face=??_GB2312><A href="http://gktd.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/looo.gif" width=88></A></FONT></STRONG> <FONT
face=" _GB2312"><B><A href="http://5is.net/"><IMG border=0 height=32
src="平凡單片機工作室.files/5is.gif" width=88></A></B></FONT> </P>
<P><FONT face=" _GB2312"><B><A
href="http://www.mcustudio.com/learnc/sdkh.51.net"><IMG border=0 height=31
src="平凡單片機工作室.files/xt.gif" width=88></A> <A
href="http://www.zymcu.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/zymcu104.gif" width=88></A> <A
href="http://www.powercn.net/"><IMG border=0 height=31
src="平凡單片機工作室.files/power-cn.gif" width=88> </A><STRONG><A
href="http://www.pic16.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/pic16lg.gif" width=88></A><A
href="http://www.ximeda.com/"> <IMG border=0 height=32
src="平凡單片機工作室.files/ximedalogo.gif" width=88> </A><A
href="http://www.senwas.com/newsgroup/bmb/index.php"><IMG border=0
height=32 src="平凡單片機工作室.files/logox.gif" width=100> </A><I><A
href="http://www.nbglin.com/"><IMG border=0 height=31
src="平凡單片機工作室.files/xc.gif"
width=88></A></I></STRONG></B></FONT><STRONG><EM><FONT face=" _GB2312"><A
href="http://www.mcufans.com/"> <IMG border=0 height=31
src="平凡單片機工作室.files/slogo.gif" width=88></A> </FONT></EM></STRONG></P>
<P><STRONG><FONT face=??_GB2312><A href="http://www.hkwx.com/"><IMG alt=""
border=0 height=32 name=PIC16 src="平凡單片機工作室.files/hkwxGIF.gif"
width=88></A> <A href="http://www.21xr.com/"><IMG alt="" border=0
height=31 id=樂源電子 name=樂源電子 src="平凡單片機工作室.files/logo.gif" width=88> <IMG
alt="無線遙控模塊&人體感應模塊 21xr.com新銳科技......" border=0 height=31
src="平凡單片機工作室.files/log3.gif" width=88><A href="http://www.21xr.com/"></A>
</FONT></STRONG></P></DIV>
<P align=left><A href="http://myradio.51.net/" target=_blank></A><A
href="http://myradio.51.net/">監聽與測向愛好者 </A><A
href="http://amine.nease.net/">Amine嵌入式系統開發 </A><STRONG><A
href="http://amine.nease.net/"></A></STRONG><A
href="http://www.mcustudio.com/www.mcufan.com">單片機愛好者 </A><A
href="http://www.ec188.com/">通大信息發布網 </A><A
href="http://www.eleccn.net/bbs">中國電器論壇 </A><A
href="http://www.vip998.com/">飛揚科技 </A><A
href="http://www.tianlxy.com/">中國IC在線 </A><A
href="http://www.zymcu.com/">中源單片機 </A><A
href="http://www.61ic.com/">61IC湖南電子網 </A></P>
<P align=left><A href="http://mcu51.cn.gs/">志藝單片機工作室 </A><A
href="http://www.ait.com.cn/mcu/">單片機天地 </A><A
href="http://ychunzhi.y365.com/">春芝單片機工作室 </A><A
href="http://www.erenow.net/bbs/">生物醫學工程論壇 </A><A
href="http://315m.9523.com/315m/">315遙控網 </A><A
href="http://www.daqchina.net/">大中化工業自動化 </A><A
href="http://doughty.512j.com/">單片機制作信息網 </A><A
href="http://www.lanyi.cn/">電子信息資源網 </A></P></TD></TR></TBODY></TABLE></DIV>
<P align=center><BR></P>
<P align=center>說明:部份資料為網上收集,如有侵犯您的版權,請通知我站即撤 </P></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -