| | | 中等職業教育機電類專業規劃教材:單片機C語言實用教程 | 該商品所屬分類:圖書 -> 中國人民大學出版社 | 【市場價】 | 364-528元 | 【優惠價】 | 228-330元 | 【作者】 | 龍建飛張箭 | 【出版社】 | 中國人民大學出版社 | 【ISBN】 | 9787300179889 | 【折扣說明】 | 一次購物滿999元台幣免運費+贈品 一次購物滿2000元台幣95折+免運費+贈品 一次購物滿3000元台幣92折+免運費+贈品 一次購物滿4000元台幣88折+免運費+贈品
| 【本期贈品】 | ①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
| |
版本 | 正版全新電子版PDF檔 | 您已选择: | 正版全新 | 溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。*. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。 *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。 *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。 | | | | 內容介紹 | |
出版社:中國人民大學出版社 ISBN:9787300179889 版次:1 商品編碼:11322270 品牌:中國人民大學出版社 包裝:平裝 叢書名:中等職業教育機電類專業規劃教材 開本:16開 出版時間:2013-08-01 用紙:膠版紙 正文語種:中文 作者:龍建飛,張箭
" 內容簡介 《中等職業教育機電類專業規劃教材:單片機C語言實用教程》內容包括51單片機所有的內部硬件知識(I/O口控制、定時器、中斷、通信等),以及編寫C51單片機程序的C語言基礎知識,外圍硬件包括LED燈、獨立按鈕、鈕子開關、數碼管、繼電器、交/直流電動機、大/小液晶、點陣等。
作者簡介 龍建飛,張箭,珠海市理工職業技術學校責任教師,有多年的從教經驗,曾主編、參編教材多部。 目錄 第一章 單片機簡介和軟件使用 第二章 單片機基本I/O口的控制 任務一 用單片機控制發光二極管發光 任務二 單片機I/O控制發光二極管發光或熄滅 任務三 單片機I/O控制發光二極管的閃爍 任務四 延時函數在發光二極管閃爍中的運用 任務五 單片機控制發光二極管特效發光或閃爍 任務六 鈕子開關的應用 任務七 獨立按鈕的應用 任務八 單片機控制流水燈的顯示 第三章 單片機定時器和中斷技術 任務一 51單片機外部中斷在發光二極管中的應用 任務二 51單片機定時器在發光二極管中的應用 第四章 單片機控制數碼管的顯示 任務一 單片機控制數碼管的靜態顯示 任務二 單片機控制數碼管的動態顯示 任務三 單片機控制數碼管顯示00~99 任務四 指針控制數碼管的顯示數據 任務五 4×4鍵盤控制數碼管的顯示 第五章 單片機控制繫統的制作 第六章 單片機串口通信 任務一 單片機與上位機(計算機)通信 任務二 單片機雙機通信 第七章 單片機控制字符的顯示 任務一 單片機控制液晶1602的顯示 任務二 單片機控制液晶12864的顯示 任務三 單片機控制32×16點陣的顯示 第八章 單片機多任務模塊化編程 任務一 單片機模塊化編程控制LED閃爍 任務二 單片機多任務在模塊化編程上的應用 參考文獻
查看全部↓ 精彩書摘 第三章單片機定時器和中斷技術任務一51單片機外部中斷在發光二極管中的應用 一、任務書 用單片機外部中斷INT0和INT1控制LED點亮、熄滅、閃爍和花樣顯示,電路如圖3—1所示。圖3—1單片機外部中斷控制發光二極管電路圖二、任務分析如圖3—1所示,利用連接在單片機INT0和INT1管腳上的按鈕SB3和SB4來控制LED發光、閃爍、流水燈的啟動、停止和一些簡單的設置,由於采用了中斷技術,不會因為長延時而使按鈕的響應變得遲緩。三、單片機控制程序(一)利用外部中斷INT0(按鈕SB3接單片機的INT0引腳 )和外部中斷INT1(按鈕SB4接單片機的INT1引腳 )控制LED燈的點亮和熄滅1外部中斷INT0控制1隻發光二極管LED0下載單片機程序,上電後LED1一直以05秒的時間間隔進行閃爍;當按下SB3時,LED0點亮;延時2秒,LED0熄滅,參考程序如下:01 #include 〈reg52h〉//調用52單片機頭文件reg52h 02 sbit LED0=P1^0;sbit LED1=P1^1; 03 void delay_1ms(unsigned int x)//延時函數,約1ms 04 {unsigned int i,j; 05for(i=x;i〉0;--i)for(j=114;j〉0;--j); 06 } 07 void main(){ 08IT0=1;//設置外部中斷INT0觸發方式,下降沿觸發 09EX0=1;//啟動INT0中斷 10EA=1;//啟動總中斷 11while(1){ 12LED1=0;//點亮LED1 13delay_1ms(500);//延時05秒 14LED1=1;//熄滅LED1 15delay_1ms(500); 16} 17 } 18 void INT_0(void)interrupt 0//中斷子程序 19 {LED0=0; 20delay_1ms(2000);//延時2秒 21LED0=1; 22 } 參考程序分析08~10行:外部中斷INT0的設置。① 設置中斷控制寄存器TCON中的中斷標志位IT0為1,說明連接在單片機INT0硬件上的信號要請求中斷,必須是下降沿。② 設置中斷允許寄存器IE中的EX0和EA為1,說明啟動的是外部中斷INT0,並且打開總中斷(EA=1)允許開關。12~15行:LED1閃爍程序。18~22行:外部中斷INT0的中斷處理函數,實現LED0點亮2秒後熄滅功能。中斷函數是處理中斷事件的專用函數,一般形式如下:void函數名(void)interrupt中斷號n[using寄存器組號] { 語句組; }(1)函數名是自定義的,但符合標識符的定義規則。(2)中斷號n與中斷源要相對應(如表3—1所示)。表3—1中斷源和中斷向量表 中斷號n優先級中斷源中斷入口地址01(最高)外部中斷0(INT0 P32)0003H12定時器0000BH23外部中斷1(INT1 P33)0013H34定時器10018H45(最低)串行口0023H(3)寄存器組號是可選項,可以由編譯軟件自動分配。51單片機內部RAM中有4組不同的工作寄存器組,每個寄存器組有8個工作寄存器R0~R7,所以寄存器組號可以取0~3之間常數。如果要設置一個工作寄存器組,則必須保證任何寄存器組在切換時不能發生衝突,否則將產生不正確的結果。建議初學者不要設置此項,讓編譯器自動分配即可。(4)中斷關鍵字“interrupt”不能寫錯,其後面不允許跟一個帶運算符的表達式,也不允許用於外部函數,如原來的延時函數名“delay”不能取名為“interrupt”。當正確定義了中斷程序之後,程序在運行時,若有中斷信號的請求,其CPU就會自動進入中斷程序執行其代碼。編寫中斷函數需要注意以下幾點:(1)函數內的程序盡可能短,否則會影響主程序的執行;(2)中斷函數不能有參數和返回值,隻能通過全局變量與其他函數進行數據傳遞;(3)中斷函數不需要調用,隻有設置好後它就會自動執行。2利用外部中斷INT0(按鈕SB3接單片機的INT0引腳 )控制一隻發光二極管LED0下載單片機程序,上電後LED1一直以05秒的時間間隔進行閃爍;當按下SB3時,LED0點亮;當松開SB3時,LED0熄滅,中斷函數參考程序如下,與前面相同部分由讀者自行完善:01 void INT_0(void)interrupt0//中斷處理函數 02 { 03LED0=0;//點亮LED0 04while(SB3==0);//等待SB3松開 05LED0=1;//熄滅LED0 06 } 參考程序分析01行:中斷函數名為“INT_0”,外部中斷0的中斷號為“0”,按下連接在INT0管腳上的SB3,則單片機自動跳到此處執行。04行:如果按下的SB3沒有松開,則單片機一直停在INT0中斷函數裡不能返回主程序執行,導致主程序中LED1閃爍長時間沒有響應。使用外部中斷步驟如下:(1)設置觸發類型。IT0、IT1置1時下降沿觸發外部中斷INT0和INT1,清零或單片機復位默認為0則為低電平觸發外部中斷INT0和INT1。(2)允許中斷。EA=1、EX0=1或EX1=1。有時要考慮優先級IP的設置。(3)編寫中斷函數。INT0中斷號n為0,INT1中斷號n為2。(二)利用外部中斷INT0(按鈕SB3接單片機的INT0引腳 )和外部中斷INT1(按鈕SB4接單片機的INT1引腳 )控制LED燈的閃爍1利用外部中斷INT0控制LED0的閃爍單片機上電後LED1一直以05秒的時間間隔進行閃爍;當按下SB3時,LED0閃爍3次後熄滅,時間間隔為1秒。中斷函數參考程序如下,與前面相同部分由讀者自行完善:01 void INT_0(void)interrupt0{//中斷函數 02unsigned char i;//定義局部字符型變量i,取值範圍0~255 03for(i=0;i〈6;++i){//LED0閃爍3次 04LED0=!LED0;//LED0狀態取反 05delay_1ms(1000);//延時1秒 06} 07 } 參考程序分析03行:由於LED0利用位取反運算符“!”,所以每取反兩次纔是閃爍1次,故“i〈6”。2利用外部中斷INT0控制LED0啟動閃爍外部中斷INT1控制LED0停止閃爍。單片機上電後LED0熄滅;當按下SB3時,LED0開始閃爍;當按下SB4時,LED0停止閃爍並熄滅。參考程序如下:01 #include 〈reg52h〉//調用52單片機頭文件reg52h 02 sbit LED0=P1^0;//定義P10引腳名為LED0,P要大寫*/ 03 bitQT;//定義啟停標志位 04 void delay_1ms(unsigned int x)//延時函數,約1ms 05 {unsigned int i,j; 06for(i=x;i〉0;--i)for(j=114;j〉0;--j); 07 } 08 void main(){ 09IT0=1;//設置外部中斷INT0觸發方式,下降沿觸發 10EX0=1;//啟動INT0中斷 11IT1=1; 12EX1=1; 13EA=1;//啟動總中斷 14while(1){ 15if(QT){ 16LED0=!LED0;//LED0取反 17delay_1ms(500);//延時05秒 18} 19} 20 } 21 void INT_0(void)interrupt 0 22 { 23QT=1;//啟停標志位置1,啟動 24 } 25 void INT_1(void)interrupt 2 26 { 27LED0=1;//LED0熄滅 28QT=0;//啟停標志位置0,停止 29 } 參考程序分析03行:定義了一個全局位變量QT,利用QT的置1和置0作為啟動和停止的信號,而使QT發出這個信號的是在外部中斷函數“INT_0”和“INT_1”中。(三)利用外部中斷INT0(按鈕SB3接單片機的INT0引腳 )和外部中斷INT1(按鈕SB4接單片機的INT1引腳 )控制LED燈的花樣顯示1利用外部中斷INT0控制P1口上的8個LED花樣顯示單片機上電後接在P00口上的LED一直以05秒的時間間隔進行閃爍;當按下SB3時,8個LED從左到右依次點亮3次後熄滅。中斷函數參考程序如下,與前面相同部分由讀者自行完善:01 #include 〈reg52h〉//調用52單片機頭文件reg52h 02 sbit LED0=P0^0;/*定義P00引腳名為LED0,P要大寫*/ 03 unsigned char code table[ ]={ 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0xb80,0x00 }; //輪流點亮 04 void delay_1ms(unsigned int x)//延時函數,約1ms 05 {unsigned int i,j; 06for(i=x;i〉0;--i)for(j=114;j〉0;--j); 07 } 08 void main(){ 09IT0=1;//設置外部中斷INT0觸發方式,下降沿觸發 10EX0=1;//啟動INT0中斷 11EA=1;//啟動總中斷 12 while(1){ 13LED0=!LED0;//點亮LED0 14delay_1ms(500);//延時05秒 15} 16 } 17 void INT_0(void)interrupt0{ 18 unsigned char k;//定義數組下標循環變量 19 for(k=0;k〈8;++k){//8是數組裡數據的個數 20P1=table[k];//數組名為table,下標為變量k 21delay_1ms(1000);//延時1秒 22 } 23 P1=0xff;//8個LED全部熄滅 24 } 參考程序分析當按下SB3後,單片機進入中斷函數開始執行流水燈程序,使得主函數中閃爍的LED0很久不能進行執行,保持在中斷前一刻的狀態,直到處理完中斷函數後LED0就又開始閃爍。2利用外部中斷INT0控制P1口上的8個LED花樣顯示的啟動外部中斷INT1按鈕SB4接單片機的INT1引腳 )控制P1口上的8個LED花樣顯示的停止。單片機上電後8個LED熄滅;當按下SB3時,LED開始由中間向兩邊依次點亮(間隔時間為1秒),不斷循環;當按下SB4時,LED停止顯示並熄滅。參考程序如下:01 #include 〈reg52h〉//調用52單片機頭文件reg52h 02 sbit LED0=P0^0;//定義P00引腳名為LED0,P要大寫*/ 03 bitQT;//啟動、停止標志位 04 unsigned char code table[ ]={ 0xe7,0xc3,0x81,0x00,0xff }; //輪流點亮 05 void delay_1ms(unsigned int x){//延時函數,約1ms 06unsigned int i,j; 07for(i=x;i〉0;--i) 08for(j=114;j〉0;--j); 09 } 10 void main(){ 11unsigned char k;//定義數組下標循環變量 12IT0=1;//設置外部中斷INT0觸發方式,下降沿觸發 13EX0=1;//啟動INT0中斷 14IT1=1; 15EX1=1; 16EA=1;//啟動總中斷 17while(1){ 18if(QT) { 19P1=table[k];//數組名為table,下標為變量k 20delay(1000);//延時1秒 21if(++k〉=5)k=0; 22} 23else{ 24P1=0xff;//LED熄滅 25k=0; 26} 27} 28 } 29 void INT_0(void)interrupt 0{ 30QT=1;//啟停標志位置1,啟動 31 } 32 void INT_1(void)interrupt2{ 33P1=0xff;//LED熄滅 34QT=0;//啟停標志位置0,停止 35 }四、應知應會知識鏈接(一)中斷的概念中斷就是主程序執行過程中,產生了另外一個緊急任務,需要打斷(暫停)主程序的執行,轉向執行緊急任務(中斷函數)。緊急任務完成後,再返回主程序原來被打斷的地方繼續執行接下來的主程序。舉一個例子,當你正在看書(執行主程序)→電話突然響起來(產生中斷信號1)→你在書上做記號,然後去拿起電話和對方進行通話(處理中斷1)→突然門鈴響了(產生中斷信號2)→你讓與你通話的對方稍等一下→你去開門並與來訪者交談片刻(處理中斷2)→交談結束,關好門→回到電話旁拿起電話繼續通話(中斷返回1)→通話結束掛上電話→拿起書,從作記號處繼續看書(中斷返回2)。上述例子是一個中斷嵌套,就是在中斷中又發生了一次中斷(開門交談)。在這三個任務(看書、打電話、接待來訪者)中,一個人不可能同時完成這三項任務,隻能采用中斷技術做完一件後再去做另一件。並且上述的中斷都是隨機的,不知道電話什麼時候響起,也不知道客人什麼時候來訪,在單片機中也是一樣的,突發或隨機的不確定事件,不可能在主程序中編寫程序,因為執行處理程序時,可能事件並沒有發生;或者事件發生的時候,可能處理程序還沒有執行到,就會錯過時機。所以,中斷程序就是很好地解決這種“隨機”事件處理的問題。通過中斷,單片機能夠多任務處理,提高了單片機的“應變”能力。(二)中斷控制的特殊功能寄存器:TCON、SCON、IP、IE在AT89S52單片機中,有4個寄存器是供用戶對中斷進行控制的,這4個寄存器分別是定時器控制寄存器TCON,串行口控制寄存器SCON,中斷允許控制寄存器IE,以及中斷優先控制寄存器IP。1定時器控制寄存器TCON(見表3—2)表3—2 位地址8F H 8E H 8D H 8C H 8B H 8A H 89 H 88 H 位名稱TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 (1)TF0(TF1)內部定時器/計數器0(定時器/計數器1)溢出中斷標志位如下:當片內定時器/計數器0(定時器/計數器1)計數溢出的時候,由單片機自動置1,而當進入了中斷服務程序之後再由單片機自動清零。(2)TR0(TR1)內部定時器/計數器0(定時器/計數器1)運行控制位如下:TR0(TR1)=1,啟動運行定時器T0(T1)。TR0(TR1)=0,停止運行定時器T0(T1)。(3)IE0(IE1)外部中斷請求標志位如下:當INT0(或INT1)引腳出現有效的請求信號,此位由單片機自動置1,而當進入了中斷服務程序之後再由單片機自動清零。(4)IT0(IT1)外部中斷觸發方式控制位如下:IT0(IT1)=1,脈衝觸發方式,下降沿觸發有效。IT0(IT1)=0,電平觸發方式,低電平有效。2串行口控制寄存器SCON(見表3—3)表3—3 位地址 9F H 9E H 9D H 9C H 9B H 9A H 99 H 98 H 位名稱 SM0 SM1 SM2 REN TB8 RB8 TI RI (1)TI 串行口發送中斷標志位如下:當單片機串行口發送完一幀數據後,此位由單片機自動置1,而當進入了中斷服務程 序之後是不會自動清零的,必須由用戶在中斷服務程序中用軟件清零。(2)RI串行口接收中斷標志位如下:當單片機串行口接收完一幀數據後,此位由單片機自動置1,而當進入了中斷服務程序之後是不會自動清零的,必須由用戶在中斷服務程序中用軟件清零。3中斷允許控制寄存器IE(見表3—4)表3—4 位地址AF H AE H AD H AC H AB H AA H A9 H A8 H 位名稱EA ES ET1 EX1 ET0 EX0 (1)EA中斷允許總控制位如下:EA=0,關閉總中斷。EA=1,啟動總中斷,當啟動了總中斷後,再由各中斷源的中斷允許控制位進行設置。(2)ES串行中斷允許控制位如下:ES=0,關閉串行中斷。ES=1,啟動串行中斷。(3)(30EX0(EX1)外部中斷允許控制位如下:EX0(EX1)=0,關閉外部中斷0(外部中斷1)。(4)EX0(EX1)=1,啟動外部中斷0(外部中斷1)。ET0(ET1)定時中斷允許控制位如下:ET0(ET1)=0,關閉定時中斷0(定時中斷1)。ET0(ET1)=1,啟動定時中斷0(定時中斷1)。4中斷優先級控制寄存器IP(見表3—5)表3—5 位地址BF H BE H BD H BC H BB H BA H B9 H B8 H 位名稱PS PT1 PX1 PT0 PX0 (1)PX0(PX1)外部中斷0(外部中斷1)優先級設定位如下:PX0(PX1)=1,外部中斷0(外部中斷1)定義為最高優先級中斷。PX0(PX1)=0,外部中斷0(外部中斷1)定義為最低優先級中斷。(2)PT0(PT1)定時中斷0(定時中斷1)優先級設定位如下:PT0(PT1)=1,定時中斷0(定時中斷1)定義為最高優先級中斷。PT0(PT1)=0,定時中斷0(定時中斷1)定義為最低優先級中斷。(3)PS 串行通信優先級設定位如下:PS=1,串行通信定義為最高優先級中斷。PS=0,串行通信定義為最低優先級中斷。如果在同時收到幾個同一優先級的中斷請求時,哪一個中斷請求優先得到響應,取決於內部的查詢順序,其查詢順序為:外部中斷0定時器0中斷外部中斷1定時器中斷1串行中斷。優先級的作用如下:① 當一個中斷函數正在執行時,能被比它級別高的中斷所中斷。圖3—2外部中斷響應示意圖② 當一個中斷函數正在執行時,不能立即響應同級或低級的中斷請求。③ 同級中斷同時產生中斷請求時,先響應中斷號小的中斷。④ 當一個中斷函數正在執行時,產生的同級或低級的中斷請求,如果前一個中斷函數執行完成時,同級或低級的中斷請求信號不存在了(標志位被清零),則中斷不會發生。(三)中斷響應如圖3—2所示,正常情況下單片機執行主程序,但是如果有中斷事件的發生,它就會把當前的事件保存起來,去執行中斷程序,當執行完中斷程序之後,再回來原來主程序的程序段中開始執行。圖3—2為中斷響應的流程。在允許中斷時,一旦出現中斷信號,就會進入中斷執行中斷程序。不同的中斷源,執行中斷程序的方法不同,但流程是相似的。(1)保護現場。指保護主程序當前的數據。對於C語言編程,保護現場是自動的。(2)執行中斷程序。根據中斷號來選擇執行專門的中斷函數,完成中斷事件的處理。(3)中斷返回。中斷程序執行完時,需要恢復主程序的現場,以便主程序能接著剛纔被中斷的地方繼續執行下去。對於C語言編程,恢復現場是自動的。 查看全部↓
" | | | | | |