国产精品久久久久久久久免费,高潮迭起av乳颜射后入,国产对白老熟女正在播放,国产精品igao视频网网址,丰满人妻熟妇乱又伦精品

機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
單片機內(nèi)部資源編程
單片機內(nèi)部資源編程
 更新時間:2008-7-27 16:15:12  點擊數(shù):2
【字體: 字體顏色
  通過前面課程的學習,我們已了解了“通用”的C語言特性,本課將介紹針對80C51單片機特性的C語言編程。
  1.定時器編程
定時器編程主要是對定時器進行初始化以設(shè)置定時器工作模式,確定計數(shù)初值等,使用C語言編程和使用匯編編程方法非常類似,以下通過一個例子來分析。
例1:用定時器實現(xiàn)P1所接LED每60ms亮或滅一次,設(shè)系統(tǒng)晶振為12M。

        圖16 用定時器實現(xiàn)LED閃爍
  參考圖16輸入源程序,建立并設(shè)置工程,本例使用實驗仿真板難以得到理想的結(jié)果,應(yīng)使用硬件進行練習。
  分析:要使用單片機的定時器,首先要設(shè)置定時器的工作方式,然后給定時器賦初值,即進行定時器的初始化。這里選擇定時器0,工作于定時方式,工作方式1,即16位定時/計數(shù)的工作方式,不使用門控位。由此可以確定定時器的工作方式字TMOD應(yīng)為00000001B,即0x01。定時初值應(yīng)為65536-60000=5536,由于不能直接給T0賦值,必須將5536轉(zhuǎn)化為十六進制即為0x15a0,這樣可以寫出初始化程序:
TMOD=0x01;
TH0=0x15;
TL0=0xa0;
  初始化定時器后,要定時器工作,必須將TR0置1,程序中用“TR0=1;”來實現(xiàn)。
  可以用中斷或查詢的方式來使用定時器,本例使用查詢方式,中斷方式稍后介紹。
  由定時時間到后,TF0被置為1,因此,只需要查詢TF0是否等于1即可得知定時時間是否到達,程序中用“if(TF0){…}”來判斷,如果TF0=0,則條件不滿足,大括號中的程序行不會被執(zhí)行到,當定時時間到TF1=1后,條件滿足,即執(zhí)行大括號中的程序行,首先將TF0清零,然后重置定時初值,最后是執(zhí)行規(guī)定動作――取反P1.0的狀態(tài)。
  2.中斷編程
  C51編譯器支持在C源程序中直接開發(fā)中斷過程,使用該擴展屬性的函數(shù)定義語法如下:
  返回值 函數(shù)名 interrupt n
  其中n對應(yīng)中斷源的編號,其值從0開始,以80C51單片機為例,編號從0~4,分別對應(yīng)外中斷0、定時器0中斷、外中斷1、定時器1中斷和串行口中斷。
  2.1 中斷應(yīng)用實例
  下面我們同樣通過一個例子來說明中斷編程的應(yīng)用。
  例2 用中斷法實現(xiàn)定時器控制P1.0所接LED以60ms閃爍。

         圖17 用中斷法使用定時器
  參考圖17輸入源程序,設(shè)置工程,同樣,本例用實驗仿真板難以看到真實的效果,應(yīng)使用硬件來完成這一實驗。
  分析:本例與例1的要求相同,唯一的區(qū)別是必須用中斷方式來實現(xiàn)。這里仍選用定時器T0,工作于方式1,無門控,因此,定時器的初始化操作與上例相同。要開啟中斷,必須將EA(總中斷允許)和ET0(定時器T0中斷允許)置1,程序中用“EA=1;”和“ET0=1;”來實現(xiàn)。在做完這些工作以后,就用for(;;){;}讓主程序進入無限循環(huán)中,所有工作均由中斷程序?qū)崿F(xiàn)。
由于定時器0的中斷編號為1,所以中斷程序中這樣寫:
void timer0() interrupt 1
{…}
  可見,用C51語言寫中斷程序是非常簡單的,只要簡單地在函數(shù)名后加上interrupt 關(guān)鍵字和中斷編號就成了。
  2.2 寄存器組切換
  為進行中斷的現(xiàn)場保護,80C51單片機除采用堆棧技術(shù)外,還獨特地采用寄存器組的方式,80C51中有4組名稱均為R0~R7的工作寄存器,通過設(shè)置RS0、RS1來切換工作寄存器組,這使得中斷保護工作非常簡單和快速。使用匯編語言編程時,內(nèi)存使用均由編程者控制,編程時可直接設(shè)置RS0、RS1,但用C語言編程,內(nèi)存由編譯器分配和使用,因此,不能自行設(shè)置RS0、RS1,否則會造成內(nèi)存使用的沖突。
  在C51中,寄存器組選擇取決于特定的編譯器指令,即使用using n指定,其中n的值是0~3,對應(yīng)使用四組工作寄存器。
例如上述例子中可以這么樣來寫:
void timer0() interrupt 1 using 2
{…}
表示在該中斷程序中使用第2組工作寄存器。
  3.串行口編程
  80C51系列單片機片上有UART用于串行通信,80C51中有兩個SBUF,一個用作發(fā)送緩沖器,一個用作接收緩沖器,在完成串口的初始化后,只要將數(shù)據(jù)送入發(fā)送SBUF,即可按設(shè)定好的波特率將數(shù)據(jù)發(fā)送出去,而在接收到數(shù)據(jù)后,可以從接收BUF中讀到接收到的數(shù)據(jù)。下面通過一個例子來了解串行口編程的方法。
  例3 單片機P1口接8只發(fā)光二極管,P3.2~P3.5接有K1~K4共四個按鍵,使用串行口編程,1)由PC機控制單片機的P1口,將PC機送出的數(shù)以二進制形式顯示在發(fā)光二極管上;2)按下K1向主機發(fā)送數(shù)字0x55,按下K2向主機發(fā)送數(shù)字0xAA,使顯示轉(zhuǎn)下一行。
 
#define uchar unsigned char
#include "string.h"
#include "reg51.h"
void SendData(uchar Dat)
{ uchar i=0;
SBUF=Dat;
while(1){  if(TI)
{ TI=0;
break;}}
}
void mDelay(unsigned int DelayTime)
{ unsigned char j=0;
for(;DelayTime>0;DelayTime--)
{ for(j=0;j<125;j++)
{;}
}
}
uchar Key()
{ uchar KValue;
P3|=0x3e; //中間4位置高電平
if((KValue=P3|0xe3)!=0xff)
{ mDelay(10);
if((KValue=P3|0xe3)!=0xff)
{ for(;;)
if((P3|0xe3)==0xff)
return(KValue);
}
}
return(0);
}

void main()
{ uchar KeyValue;
P1=0xff; //關(guān)閉P1口接的所有燈
TMOD=0x20; //確定定時器工作模式
TH1=0xFD;
TL0=0xFD; //定時初值
PCON&=0x80; //SMOD=1
TR1=1; //開啟定時器1
SCON=0x40; //串口工作方式1
REN=1; //允許接收
for(;;)
{ if(KeyValue=Key())
{ if((KeyValue|0xfb)!=0xff) //K1按下
SendData(0x55);
if((KeyValue|0xf7)!=0xff)
SendData(0xaa);
}
if(RI)
{ P1=SBUF;
RI=0;
}
}
}
 
  實現(xiàn)過程:輸入程序,命名為exam53.c,建立名為exam53的工程,將文件加入,設(shè)置工程,使用實驗仿真板進行調(diào)試。正確編譯連接后進入調(diào)試,打開實驗仿真板,然后再點擊viewserial #1打開串行窗口,在窗口空白處點右鍵,在彈出式菜單中選擇“Hex Mode”如圖18所示。
             
             圖18 選擇顯示模式
  單擊實驗仿真板的K1鍵和K2鍵,即可看到串行窗口中分別出現(xiàn)55和AA;單擊串行窗口的空白處,使其變?yōu)榛顒哟翱,可接收鍵盤輸入,按下鍵盤上不同的字符鍵,可見實驗仿真板上的LED產(chǎn)生相應(yīng)的變化。在實驗仿真板上按下K1一次、K2連續(xù)兩次、再按一次K1后,串行窗口中的狀態(tài)如圖19上部所示;在計算機鍵盤上按下“1”后實驗仿真板顯示的狀態(tài)如圖19下部所示!0”使燈亮,“1”使燈滅,因此P1口的值為00110001,即0x31,這正是字符1的ASCII碼值。
  
      圖19 使用實驗仿真板演示串行口操作
  程序分析:本程序使用T1作為波特率發(fā)生器,工作于方式2(8位自動重裝入方式),波特率為19200,串行口工作于方式1,根據(jù)以上條件算出T1的定時初值為0xfd,TMOD應(yīng)初始化為0x20,SMOD初始化為0x30,PCON中的SMOD位置1,主程序main的開頭對這些初值進行了設(shè)置。設(shè)置好初值后,用“TR1=1;”開啟定時器1,用“REN=1;”允許接收數(shù)據(jù),然后進入無限循環(huán)中開始正常工作。在這個無限循環(huán)中首先調(diào)用鍵盤程序,檢測是否有鍵按下,及哪一個鍵被按下,如果K1被按下,則調(diào)用發(fā)送數(shù)據(jù)程序,將數(shù)0x55送出,如果K2被按下,則將數(shù)0xAA送出。接著檢測RI是否等于1,如果RI等于1,說明接收到字符,清RI,準備下一次接收,并將接收到的數(shù)據(jù)送往P1口顯示。一次循環(huán)結(jié)束,繼續(xù)開始下一次循環(huán)。
發(fā)送函數(shù)SendData中有只有一個參數(shù)Dat,即待發(fā)送的字符,函數(shù)將該待發(fā)送的字符送入SBUF后,使用一個無限循環(huán)等待發(fā)送的結(jié)束,在循環(huán)中通過檢測TI來判斷數(shù)據(jù)是否發(fā)送完畢,發(fā)送完畢使用break語句退出循環(huán)。
  該實驗同樣可用硬件實現(xiàn),下面介紹使用前面課程中介紹的仿真型實驗板做實驗的方法。由于該板占用了串口作為仿真機與PC機的通訊,因此做串口通訊類實驗只能用下載后全速運行的方法,具體步驟如下: 
  1.設(shè)置工程,在Debug頁中選擇“Use Keil Monitor Drive”,點擊Setting按鈕,將通訊的波特率設(shè)置為19200;
  2.進入調(diào)試后全速運行程序,然后按Debug->Stop Runing,按提示退出調(diào)試狀態(tài),實際上這不并會中斷硬件電路的工作;
  3.在PC機上運行一個串口調(diào)試軟件,這里以“串口調(diào)試助手”軟件為例,按圖20設(shè)置串口參數(shù)。按下實驗板上的K1、口,串口調(diào)試助手的接收窗口即可接收到0x55和0xAA,在串口調(diào)試助手的輸出窗口中鍵入數(shù)據(jù),即可由實驗板接收并由P1顯示出來。

       圖20 設(shè)置串口參數(shù)
  通過本課學習,我們了解了單片機內(nèi)部資源編程的方法,下一課將通過一些綜合性的例子的介紹,繼續(xù)學習采用C語言編程的有關(guān)技術(shù)。
  • 上一篇: C語言綜合練習(2)
  • 下一篇: 循環(huán)程序設(shè)計
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1