版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、 第5章PIC16F877的外圍功能模塊簡單應(yīng)用實例該例用于令與PORTD口相連的8個發(fā)光二極管前4個點亮,后4個熄滅。在調(diào)試程序前,應(yīng)使與PORTD口相連的8位拔碼開關(guān)拔向相應(yīng)的位置。例5.1PORTD輸出#includemain()TRiSD=0X00;while(1);pORTD=0XF0;/*TRISD寄存器被賦值,PORTD每一位都為輸出*/*循環(huán)執(zhí)行點亮發(fā)光二極管的語句*/*向PORTD送數(shù)據(jù),點亮LED(由實驗?zāi)0?/*的設(shè)計決定相應(yīng)位置低時LED點亮)。*/5.2.1MSSP模塊SPI方式功能簡介F面是一段簡單的spi初始化例程,用于利用spi工作方式輸出數(shù)據(jù)的場合。例5.2S
2、PI初始化程序/*spi初始化子程序*/voidspiiNiT()/*清除SPI中斷標(biāo)志*/*sspEN=1;CKp=0,F(xiàn)OsC/4*/*SDO引腳為輸出,SCK引腳為輸出*/piR1=0;sspCON=0 x30;sspsTAT=0 xC0;TRisC=0 x00;程序清單下面給出已經(jīng)在實驗板上調(diào)試通過的一個程序,可作為用戶編制其它程序的參考。#include/*該程序用于在8個LED上依次顯示18等8個字符*/staticvolatileinttable20=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0XD8,0 x800 x90,0 x88,0
3、 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x7f,0 xbf,0 x89,0 xff;volatileunsignedchardata;#definepORTAiT(adr,bit)(unsigned)(&adr)*8+(bit)/*絕對尋址位操作指令*/staticbitPORTA_5PORTAIT(PORTA,5);/*spi初始化子程序*/voidSPIINIT()PIR1=0;SSPCON=0 x30;/*SSPEN=1;CKP=0,F(xiàn)OSC/4*/SSPSTAT=0 xC0;TRISC=OxOO;/*SDO引腳為輸出,SCK引腳為輸出*/*系統(tǒng)各輸入輸出口初始化子
4、程序*/voidinitial()TRISA=0 x00;/*A口設(shè)置為輸出*/INTCON=0 x00;/*關(guān)閉所有中斷*/PORTA_5=0;/*SPI發(fā)送子程序*/voidSPILED(intdata)SSPBUF=data;dowhile(SSPIF=0);SSPIF=0;/*主程序*/main()unsignedI;initial();SPIINIT();for(i=8;i0;i-)data=tablei;SPILED(data);PORTA_5=1;/*LACK送低電平,為鎖存做準(zhǔn)備*/*啟動發(fā)送*/*等待發(fā)送完畢*/*清除SSPIF標(biāo)志*/*系統(tǒng)初始化*/*SPI初始化*/*連續(xù)
5、發(fā)送8個數(shù)據(jù)*/*通過數(shù)組的轉(zhuǎn)換獲得待顯示的段碼*/*發(fā)送顯示段碼顯示*/*最后給鎖存信號,代表顯示任務(wù)完成*/程序清單下面給出已經(jīng)在實驗板上調(diào)試通過的程序,可作為用戶編制其它程序的參考。有關(guān)顯示部分的SPI初始化,請讀者參考5.2節(jié)。#include/*該程序用于按下相應(yīng)的鍵時,在第一個8段LED上顯示相應(yīng)的14的字符*/PORTAIT(adr,bit)(unsigned)(&adr)*8+(bit)/*絕對尋址位操作指令*/PORTA_5#definestaticbit#definestaticbitPORTBIT(adr,PORTB_5staticbitPORTB_4staticbitP
6、ORTB_1staticbitPORTB_2PORTAIT(PORTA,5);bit)(unsigned)(&adr)*8+(bit)/*絕對尋址位操作指令*/PORTBIT(PORTB,5);PORTBIT(PORTB,4);PORTBIT(PORTB,1);PORTBIT(PORTB,2); intI;charj;TRISC=0 xD7;/*SDO引腳為輸出,SCK引腳為輸出*/*系統(tǒng)各輸入輸出口初始化子程序*/voidinitial()TRISA=0 xDF;TRISB=0XF0;INTCON=0 x00data=0X00;PORTB=0X00;j=0;/*軟件延時子程序*/voidDE
7、LAY()/*設(shè)置與鍵盤有關(guān)的各口的數(shù)據(jù)方向*/*關(guān)閉所有中斷*/*待顯示的寄存器賦初值*/*RB1RB2先送低電平*/unsignedunsignedintdata;/*spi初始化子程序*/voidSPIINIT()PIR1=0SSPCON=0 x30;SSPSTAT=0 xC0;for(i=6553;-i;)continue;/*鍵掃描子程序*/intKEYSCAN()while(1)if(PORTB_5=0)|(PORTB_4=0)break;/*等待有鍵按下*/DELAY();/*軟件延時*/if(PORTB_5=0)|(PORTB_4=0)/*如果仍有鍵按下,則調(diào)用鍵服務(wù)子程序*/
8、*如果為干擾,則令返回值為0*/KEYSERVE();elsej=0 x00;return(j);/*鍵服務(wù)子程序*/intKEYSERVE()PORTB=0XFD;if(PORTB_5=0)j=0X01if(PORTB_4=0)j=0X03PORTB=0XFB;if(PORTB_5=0)if(PORTB_4=0)PORTB=0X00;j=0X02;j=0X04;/*以上根據(jù)按下的鍵確定相應(yīng)的鍵值*/*恢復(fù)PORTB的值*/while(1)if(PORTB_5=1)&(PORTB_4=1)break;/*等待鍵盤松開*/return(j);/*SPI發(fā)送子程序*/voidSPILED(intd
9、ata)SSPBUF=data;/*啟動發(fā)送*/dowhile(SSPIF=0);/*等待發(fā)送完畢SSPIF=0;/*主程序*/main()staticinttable20=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0XD8,0 x80,0 x900 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x7f,0 xbf,0 x89,0 xff;initial。;/*系統(tǒng)初始化*/SPHNITO;/*SPI初始化*/while(1)KEYSCAN();if(j!=0)/*如果j=0,證明先前的按鍵為干擾,則不予顯示*/data=ta
10、blej;PORTA_5=0;/*LACK信號清0,為鎖存做準(zhǔn)備*/SPILED(data);PORTA_5=1;/*最后給鎖存信號,代表顯示任務(wù)完成*/5.4.1PORTB端口“電平變化中斷”簡介例5.3PORTB口“電平變化中斷”初始化子程序voidPORTBINT()TRISB=0XF0;OPTION=0 x7F;PORTB=0X00;RBIE=1;PORTB=PORTB;/*B口“電平變化中斷”初始化子程序*/*設(shè)置相應(yīng)口的輸入輸出方式*/*B口弱上拉有效*/*RB1,RB2先送低電平*/*B口變位中斷允許*/*讀B口的值,以鎖存舊值,為變位中斷創(chuàng)造條件*/程序清單面給出一個調(diào)試通過的
11、例程,以供讀者參考。有關(guān)顯示的部分請讀者參考前面章節(jié)。該程序中寄存器的位都用頭文件中定義的位,如RB5表示PORTB的第5位,而不像前面幾節(jié)那樣自己定義。#include/*該程序用于通過PORTB的”電平變化中斷進行鍵盤的識別。*/*程序設(shè)置一個鍵值寄存器j,當(dāng)按下S9鍵時j=l,按下S11鍵時*/*j=2,按下S10鍵時,j=3,按下S12鍵時j=4*/unsignedchardata;unsignedintI;unsignedcharj;constchartable20=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0XD8,0 x80,0 x90,
12、0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x7f,0 xbf,0 x89,0 xff;/*B口“電平變化中斷”初始化子程序*/voidPORTBINT()/*設(shè)置相應(yīng)口的輸入輸出方式*/*RB1,RB2先送低電平*/*B口變位中斷允許*/*讀B口的值,為變位中斷創(chuàng)造條件*/TRISB=0XF0;OPTION=0 x7F;PORTB=0X00;RBIE=1;PORTB=PORTB;/*spi初始化子程序*/voidSPIINIT()PIR1=0;SSPCON=0 x30;SSPSTAT=0 xC0;TRISC=0 xD7;/*SDO引腳為輸出,SCK引腳為輸出*
13、/ # #/*系統(tǒng)各輸入輸出口初始化子程序*/voidinitial()TRISA=0 xDF #INTCON=0 x00;data=0X00;/*鍵服務(wù)子程序*/voidKEYSERVE()/*關(guān)閉所有中斷*/*待顯示的寄存器賦初值*/ PORTB=0XFD;if(RB5=0)j=0X01;if(RB4=0)j=0X03;PORTB=0XFB;if(RB5=0)j=0X02;if(RB4=0)j=0X04;PORTB=0X00;/*軟件延時子程序*/voidDELAY()for(i=6553;-i;)continue;/*SPI發(fā)送子程序*/voidSPILED(intdata)SSPBUF
14、=data;dowhile(SSPIF=0);SSPIF=0;voidIDEDIS()KEYSERVE();data=tablej;RA5=0;SPILED(data);RA5=1;/*中斷服務(wù)程序*/voidinterruptkeyint(void)DELAY();if(RB5=0)|(RB4=0)/*以上通過逐行逐列掃描,以確定是何鍵按下*/*恢復(fù)PORTB的值*/*啟動發(fā)送*/*進行鍵盤的識別*/*獲得需要送出顯示的段碼*/*LACK信號清0,為鎖存做準(zhǔn)備*/*最后給一個鎖存信號,代表顯示任務(wù)完成*/*軟件延時*/*該語句除了能夠確認(rèn)按鍵是否為干擾外,*/*還可以屏蔽一次鍵松開時引起的中
15、斷*/ IDEDIS();PORTB=PORTB/*鍵識別和顯示模塊*/*讀B口的值,改變中斷發(fā)生的條件,避免鍵*/*一直按下時,連續(xù)進行鍵識別*/*鍵掃描時可能會產(chǎn)生電平變化”而使RBIF*/*置1,再清除一次RBIF以避免額外中斷*/RBIF=0;main()initial();PORTBINT();SPIINIT();ei();while(1)5.5.2程序清單/*系統(tǒng)初始化*/*B口變位中斷初始化*/*利用SPI顯示初始化*/*總中斷允許*/*等待中斷*/ 下面給出一個調(diào)試通過的例程,可作為讀者的參考。調(diào)試該程序把模板J7上的短路跳針拔下,以免產(chǎn)生沖突。#includevolatile
16、unsignedchardata;/*spi初始化子程序*/voidSPIINIT()PIR1=0;SSPCON=0 x30;/*SSPEN=1;CKP=0,F(xiàn)OSC/4*/SSPSTAT=0 xC0;TRISC=OxlO;/*SDI引腳為輸入,SCK引腳為輸出*/*系統(tǒng)各輸入輸出口初始化子程序*/voidinitial()/*D口為輸出方式*/*關(guān)閉所有中斷*/TRISA=0 x00;TRISD=0 x00;INTCON=0 x00/*SPI接收子程序*/intSPIIN()RA4=0;/*74HC165并行置數(shù)使能,將8位開關(guān)量置入器件*/*(LOAD為低電平時8位并行數(shù)據(jù)置入74HC16
17、5)*/RA4=1;/*74HC165移位置數(shù)使能(LOAD為高電平時芯*/*片才能串行工作)*/SSPBUF=0;/*啟動SPI,此操作只用于清除SSPSTAT的*BF位,因此W中的實際數(shù)據(jù)無關(guān)緊要*/do9while(SSPIF=0);/*查詢數(shù)據(jù)接收完畢否?*/SSPIF=0;data=SSPBUF;return(data);/*返回接收到的數(shù)據(jù)*/*把SPI接收的數(shù)據(jù)通過D口顯示在8個發(fā)光二極管上的子程序*/voidSPIOUT(intdata)PORTD=data;/*主程序*/main()initial();/*系統(tǒng)初始化*/SPHNITO;/*SPI初始化*/while(1)SP
18、HN();/*SPI接收外部數(shù)據(jù)*/SPIOUT(data);/*送出數(shù)據(jù)顯示*/5.6.1CCP模塊的PWM工作方式簡介下面給出一個CCP模塊設(shè)置為PWM操作時的初始化程序例5.4CCP模塊設(shè)置為PWM方式時的初始化程序/*CCP1模塊的PWM工作方式初始化子程序*/voidCCP1INIT()CCPR1L=0X7F;CCP1CON=0X3C;/*設(shè)置CCP1模塊為PWM工作方式,且其工作循環(huán)*的低2位為11,高8位為01111111=7F*/INTCON=0X00;PR2=0XFF;TRISC=0XFB;/*禁止總中斷和外圍中斷*/*設(shè)置PWM的工作周期*/*設(shè)置CCP1引腳為輸出方式*/
19、該初始化子程序設(shè)置CCP1模塊輸出分辨率為10位的PWM波形,且占空比為50%。程序清單下面給出一個調(diào)試通過的例程,可作為讀者編制程序的參考。#include/*該程序用于使CCP1模塊產(chǎn)生分辨率為10位的PWM波形,占空比為50%*/*CCP1模塊的PWM工作方式初始化子程序*/voidCCP1INIT()CCPR1L=0X7F;CCP1CON=0X3C;/*設(shè)置CCP1模塊為PWM工作方式,且其工作*循環(huán)的低2位為11,高8位為01111111=7F*/INTCON=0X00;PR2=0XFF;TRISC=0XFB;/*禁止總中斷和外圍中斷*/*設(shè)置PWM的工作周期*/*設(shè)置CCP1引腳為
20、輸出方式*/*主程序*/main()CCP1INIT();T2CON=0X04;/*CCP1模塊的PWM工作方式初始化*/*打開TMR2,且使其前分頻為0,*同時開始輸出PWM波形*/dowhile(1);/*系統(tǒng)開始輸出PWM波形。如果系統(tǒng)是*多任務(wù)的,則可以在此執(zhí)行其它任務(wù),而*不會影響PWM波形的產(chǎn)生*/ 5.7.3應(yīng)用程序2.程序清單#include/*此程序?qū)崿F(xiàn)看門狗WDT的功能*/unsignedlongI;/*系統(tǒng)初始化子程序*/voidinitial()OPTION=0X0F;TRISD=0X00;/*延時子程序*/voidDELAY()for(i=19999;-i;)continue;/*主程序*/main()initial();PORTD=0X00;DELAY();PORTD=0XFF;while(1)/*把前分頻器分配給WDT,且分頻倍率為1:128*/*D口設(shè)為輸出*/*初始化,設(shè)定看門狗的相關(guān)寄存器*/*D口送00H,
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)人才2024年薪金聘用協(xié)議書版
- 二零二五版冷鏈物流車輛貨物運輸安全協(xié)議2篇
- 二零二五年藝術(shù)品搬運運輸服務(wù)合同3篇
- 二零二五版數(shù)字經(jīng)濟產(chǎn)業(yè)發(fā)展合同范本2篇
- 2024施工合同匯集
- 二零二五年度鋼板租賃與節(jié)能減排服務(wù)協(xié)議3篇
- 個性化旅游顧問服務(wù)協(xié)議2024版版A版
- 2024版產(chǎn)品銷售協(xié)議6篇
- 二零二五年度高科技產(chǎn)業(yè)合伙人分家協(xié)議書3篇
- 二零二五年度智能工廠安全生產(chǎn)服務(wù)外包合同2篇
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 《用銳角三角函數(shù)解決問題(3)》參考課件
- 房地產(chǎn)營銷策劃 -佛山龍灣壹號學(xué)區(qū)房項目推廣策略提案方案
- 產(chǎn)品共同研發(fā)合作協(xié)議范本5篇
- 風(fēng)水學(xué)的基礎(chǔ)知識培訓(xùn)
- 2024年6月高考地理真題完全解讀(安徽?。?/a>
- 吸入療法在呼吸康復(fù)應(yīng)用中的中國專家共識2022版
- 1-35kV電纜技術(shù)參數(shù)表
- 信息科技課程標(biāo)準(zhǔn)測(2022版)考試題庫及答案
- 施工組織設(shè)計方案針對性、完整性
- 2002版干部履歷表(貴州省)
評論
0/150
提交評論