【正文】
6. 附錄 32148U 2 : ALM 35 856748U 2 : BLM 35 832148U 3 : ALM 35 856748U 3 : BLM 35 8R110 kR210 kR310 kR410 kR510 kR610 kR710 kR810 kR910 kR 1 010 kR 1 110 kR V 11k 47 R A 0/ A N 02R A 1/ A N 13R A 2/ A N 2/ V R E F / C V R E F4R A 4/ T 0CK I /C1O U T6R A 5/ A N 4/ S S /C2 O U T7R E 0/ A N 5 / R D8R E 1/ A N 6 / W R9R E 2/ A N 7 / C S10O S C 1/ C LK I N13O S C 2/ C LK O U T14R C 1/ T 1O S I /CC P 216R C 2/ C C P 117R C 3/ S C K / S C L18R D 0/ P S P 019R D 1/ P S P 120R B 7/ P G D40R B 6/ P G C39R B 538R B 437R B 3/ P G M36R B 235R B 134R B 0/ I N T33R D 7/ P S P 730R D 6/ P S P 629R D 5/ P S P 528R D 4/ P S P 427R D 3/ P S P 322R D 2/ P S P 221R C 7/ R X /D T26R C 6/ T X /C K25R C 5/ S D O24R C 4/ S D I /S D A23R A 3/ A N 3/ V R E F +5R C 0/ T 1O S O /T 1CK I15M C LR/V pp /T H V1U3P I C 16 F 87 7 AX2C R Y S T A LC81nFC91nFR 1 710 kC 1 01nF (電路圖) 7.參考文獻(xiàn) [1].譚浩強(qiáng) 著 .C 程序設(shè)計(jì)(第三版) . 北京:清華大學(xué)出版社, 2020. [2].王昊天 李海濤 王志強(qiáng) 等編著 . PIC 單片機(jī)原理與應(yīng)用 . 北京:機(jī)械工業(yè)出版社, 2020. [3].沈任遠(yuǎn) 吳勇 主編 . 常用電子元器件簡明手冊 . 北京 : 機(jī)械工業(yè)出版社, 2020. [4].杜偉略 主編 . 80C51 單片機(jī)及接口技術(shù) . 北京:化學(xué)工業(yè)出版社, 2020. [5].李榮正 劉啟中 陳學(xué)軍 . PIC 單片機(jī)原理及應(yīng)用 [M]. 北京 : 北京航空航天大學(xué)出版社 ,2020. [6].鄭國平 主編 . 模擬電子技術(shù) . 北京: 清華大學(xué)出版社 , 2020. [7].于曉平 主編 . 數(shù)字電子技術(shù) . 北京: 清華大學(xué)出版社 , 2020. [8].趙巧娥 主編 . 自動檢測與傳感器技術(shù) .北京:中國電力出版社, 2020. [9].陸應(yīng)華 主編 . 電子系統(tǒng)設(shè)計(jì)教程 . 北京: 國防工業(yè)出版社 , 2020. [10].王彥朋 主編 . 大學(xué)生電子設(shè)計(jì)與應(yīng)用 . 北京: 中國電力出版社 , 2020. [11].黃永定 主編 . 電子實(shí)驗(yàn)綜合實(shí)訓(xùn)教程 . 北京: 機(jī)械工業(yè)出版社 , 2020. [12].侯建軍 等 主編 . 電子技術(shù)基礎(chǔ)實(shí)驗(yàn)、綜合設(shè)計(jì)實(shí)驗(yàn)與課程設(shè)計(jì) . 北京: 高等教育出版社 , 2020. 。 主機(jī)發(fā)送指定數(shù)據(jù),從機(jī)接收,檢查 LED 顯示是否一致,如果不一致,再檢查 寄存器內(nèi)容是否接收到數(shù)據(jù)。 軟件調(diào)試 46 輸入一定常數(shù),看 LED 的顯示情況。 檢測當(dāng)敏感元件變化時(shí) A/D 轉(zhuǎn)換電路電壓是否有變化。 /*顯示接收的數(shù)據(jù) */ while(1) { 。 /*發(fā)送接收到的數(shù)據(jù) */ while(1){ if(TXIF==1) break。 } /*等待接收數(shù)據(jù) */ rece[k]=RCREG。k4。 /*接收允許 */ TXEN=1。 /*SCI 部件初始化 */ di()。 /*最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */ } /********************/接收主程序 /****************************/ jsmain() { SPIINIT()。 /*查得顯示的段碼 */ SPILED(data)。k++){ data=rece[k]。 /*準(zhǔn)備鎖存 */ for(k=0。 SSPIF=0。 /*啟動發(fā)送 */ do { 。 TRISC7=1。 /*異步高速傳輸 */ RCSTA=0X80。 } } include /*該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程 序是接收部分,并把接收的數(shù)據(jù)顯示在 4個(gè) LED 上 */ /***********************/SCI 部件初始化子程序 /***************************/ void sciint() { SPBRG=0X19。 /*讀響應(yīng)字節(jié),清 RCIF*/ } display()。 } /*等待寫入完成 */ while(1){ if(RCIF==1) break。k++){ TXREG=tran[k]。 /*接收數(shù)據(jù)允許 */ for(k=0。 /*中斷禁止 */ TXEN=1。 /*給數(shù)組賦初值 */ sciint()。 /*最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */ } /***********************/發(fā)射主程序 /********************************/ fsmain () 44 { SPIINIT()。 /*查得顯示的段碼 */ SPILED(data)。k++) { data=tran[k]。 /*準(zhǔn)備鎖存 */ for(k=0。 SSPIF=0。 /*啟動發(fā)送 */ do { 。 TRISC7=1。 /*選擇異步高速方式傳輸 8 位數(shù)據(jù) */ RCSTA=0X80。 } } /************************/SCI 部件初始化子程序 /**********************/ void sciint() { SPBRG=0X19。k8。 /*SDO 引腳為輸出, SCK 引腳為輸出 */ TRISA5=0。 SSPSTAT=0xC0。 /*不帶小數(shù)點(diǎn)的顯示段碼表 */ union adres {int y1; unsigned char adre[2]; 開始 清除 ADIF 標(biāo)志位 讀取并存儲 A/D 轉(zhuǎn)換器轉(zhuǎn)換結(jié)果 壓強(qiáng) 250psi 報(bào)警子程序 輸出壓強(qiáng)和顯示 等待下一次 A/D 轉(zhuǎn)換 延時(shí)子程序 Y N 41 }adresult; //定義一個(gè)共用體,用于存放 A/D 轉(zhuǎn)換的結(jié)果 unsigned char i; unsigned int j; //主程序 main() { void delay(); void interrupt adint(void); void SPIINIT(); void sciint(); void SPILED(data); void display(); fsmain (); void sciint(); void display(); jsmain(); adinitial(); //A/D轉(zhuǎn)換初始化 initial(); //系統(tǒng)各 I/O 口初始化 ei(); //總中斷允許 ADGO=1; //啟動 A/D 轉(zhuǎn)換 while(1) { ; } //等待中斷,在中斷中循環(huán)檢測外部電壓 } 4. 2. 2 各子程序 /****************/系統(tǒng)各 I/O 口初始化子程序 /**************/ void initial() { TRISD=0X00; //D口為輸出 i=0x00; } /********************/A/D 轉(zhuǎn)化初始化子程序 /*****************/ void adinitial() { ADCON0=0x51; //選擇 A/D 通道為 RA2,打開 A/D 轉(zhuǎn)換器 //在工作狀態(tài),且使 A/D 轉(zhuǎn)換時(shí)鐘為 8tosc ADCON1=0X80; //轉(zhuǎn)換結(jié)果右移,及 ADRESH 寄存器的高 6 位為 0 //且把 RA2 口設(shè)置為模擬量輸入方式 PIE1=0X00; PIE2=0X00; 42 ADIE=1; //A/D轉(zhuǎn)換中斷允許 PEIE=1; //外圍中斷允許 TRISA2=1; //設(shè)置 RA2 為輸入方式 } /*********************/延時(shí)子程序 /****************************/ void delay() { for(j=5535; j; ) continue; } //報(bào)警子程序 void alarm() { i=i^0xFF; //通過異或方式每次把 i 的各位值取反 PORTD=i; //D口輸出 i 的值 } /*******************/中斷服務(wù)程序 /*****************************/ void interrupt adint(void) { ADIF=0; //清除中斷標(biāo)志 [0]=ADRESL; [1]=ADRESH; //讀取并存儲 A/D 轉(zhuǎn)換結(jié)果, A/D 轉(zhuǎn)換的結(jié)果通過共 //用體的形式放入了變量 y1 中 if(0x200) { alarm(); //如果輸入的模擬量大于 250psi(對應(yīng)數(shù)字量 //0X200h),則調(diào)用報(bào)警子程序 delay(); //調(diào)用延時(shí)子程序,使電壓檢測不要過于頻繁 } else PORTD=0XF0 ; //如果輸入的模擬量小于 250psi,則與 D 口相連的 ADGO=1; //啟動下一次 A/D 轉(zhuǎn)換 } /*****************通訊部分 ********************/ /*該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是發(fā)送部分 */ /*****************/spi 顯示初始化子程序 /**************************/ void SPIINIT() { PIR1=0。 /*定義一個(gè)數(shù)組存儲發(fā)送數(shù)據(jù) */ unsigned char k, data。 PIC16F877 指令摘要 PIC 是采用 RISC( Reduced Instruction Set Computing,精簡指令集),與 8051系列采用的 CISC( Complicated Instruction Set Computing,復(fù)雜指令集)不同,PIC16F877 所有指令指有 35 個(gè), 8051 高達(dá) 111 個(gè)指令,詳細(xì)指令說明請參閱產(chǎn)品資料手冊。 3. PIC16F877 指令簡介 PIC16F877 常用的語言有匯編語言與 C 語言兩種,匯編語言是將每一個(gè)機(jī)器碼使用一個(gè)文字代號代表,比較接近處理器真正動作模式;而 C 語言是比較符合人們的 使用習(xí)慣,事先將匯編語言組合成 C 語言形式,使 用較為方便,但是 C 語言所組譯的機(jī)器碼程序通常比較大,且組譯軟件通常需要額外購買。當(dāng)整體系統(tǒng)需要多單片機(jī)時(shí),彼此可以 經(jīng)由并列傳輸接口來快速傳輸資料。 PORTC PORTC 總共有 8 個(gè)位 (RC0~RC7),除了可作為數(shù)位 I/O 外,還和一些特殊功能的周邊電路共享接腳,例如 CCP(直流馬達(dá)控制)、 I2C、 SPI(同步串行通訊電路)、UART(異步串行傳輸電路)等等。 PIC 是 8 位的單片機(jī),以接腳特性分組,每組盡 量湊滿 8 支接腳,并將I/O 命名為 PORTA(RA0~RA5)、 PORTB(RB0~RB7)、 PORTC(RC0~RC7)、PORTD(RD0~RD7)和 PORTE(RE0~RE2)等,各分組接口特性說明如下: PORTA PIC16F877 的 PORTA 總共有 6 個(gè)位 (RA0~RA5), PORTA 的接腳可作為數(shù)字輸出輸入端口,而系統(tǒng)重置后, PORTA 自動成為模擬輸入狀態(tài),可讀取模擬輸入訊號。 圖 6. 振蕩源電路圖(圖片來源: Microchip PIC16F87X Data Sheet) 表 1. 建議電容值(圖片來源