第6章模擬量輸入與輸出_第1頁
第6章模擬量輸入與輸出_第2頁
第6章模擬量輸入與輸出_第3頁
第6章模擬量輸入與輸出_第4頁
第6章模擬量輸入與輸出_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第6章 模擬量輸入與輸出6.1 A/D轉(zhuǎn)換的應(yīng)用例6.1 A/D轉(zhuǎn)換初始化程序/A/D轉(zhuǎn)換初始化子程序voidadinitial( )ADCON0 = 0x51;/選擇A/D通道為RA2,打開A/D轉(zhuǎn)換器 /在工作狀態(tài),且使AD轉(zhuǎn)換時鐘為8toscADCON1 = 0X80;/轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0" /且把RA2口設(shè)置為模擬量輸入方式PIE1 = 0X00;PIE2 = 0X00;ADIE = 1;/A/D轉(zhuǎn)換中斷允許PEIE = 1;/外圍中斷允許TRISA2=1;/設(shè)置RA2為輸入方式6.1.2 程序清單下面給出一個調(diào)試通過的例程,可作為讀者

2、編制程序的參考。該程序中用共用體的方式把A/D轉(zhuǎn)換的10位結(jié)果組合在一起。有關(guān)共用體的詳細資料請參考本書相關(guān)章節(jié)。# include<pic.h>unionadresinty1;unsigned char adre2;adresult;/定義一個共用體,用于存放A/D轉(zhuǎn)換的結(jié)果unsigned chari;unsigned intj;/系統(tǒng)各I/O口初始化子程序voidinitial()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)

3、換時鐘為8toscADCON1=0X80;/轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0" /且把RA2口設(shè)置為模擬量輸入方式PIE1=0X00;PIE2=0X00;ADIE=1;/A/D轉(zhuǎn)換中斷允許PEIE=1;/外圍中斷允許TRISA2=1;/設(shè)置RA2為輸入方式/延時子程序voiddelay()for(j=5535;-j;)continue;/報警子程序voidalarm()i=i0xFF;/通過異或方式每次把i的各位值取反PORTD=i;/D口輸出i的值/中斷服務(wù)程序voidinterruptadint(void)ADIF=0;/清除中斷標(biāo)志adresult.a

4、dre0=ADRESL;adresult.adre1=ADRESH;/讀取并存儲A/D轉(zhuǎn)換結(jié)果,A/D轉(zhuǎn)換的結(jié)果通過共/用體的形式放入了變量y1中 if(adresult.y1>0x200)alarm();/如果輸入的模擬量大于2.5V(對應(yīng)數(shù)字量/0X200h),則調(diào)用報警子程序delay();/調(diào)用延時子程序,使電壓檢測不要過于頻繁elsePORTD=0XF0;/如果輸入的模擬量小于2.5V,則與D口相連的/8個發(fā)光二極管的低4個發(fā)亮,表示系統(tǒng)正常ADGO=1;/啟動下一次A/D轉(zhuǎn)換 /主程序main()adinitial();/A/D轉(zhuǎn)換初始化initial();/系統(tǒng)各I/O口初

5、始化ei();/總中斷允許ADGO=1;/啟動A/D轉(zhuǎn)換while(1);/等待中斷,在中斷中循環(huán)檢測外部電壓6.2.2 I2C總線工作方式相關(guān)子程序1C語言編寫的I2C總線工作方式的初始化子程序/I2C初始化子程序void i2cint()SSPCON = 0X08;/初始化SSPCON寄存器TRISC3 =1;/設(shè)置SCL為輸入口TRISC4 =1;/設(shè)置SDA為輸入口TRISA4 = 0;SSPSTAT=0X80;/初始化SSPSTAT寄存器SSPADD=0X02;/設(shè)定I2C時鐘頻率SSPCON2=0X00;/初始化SSPCON2寄存器di();/關(guān)閉總中斷SSPIF=0;/清SSP中

6、斷標(biāo)志RA4=0;/關(guān)掉74HC165的移位時鐘使能,以免74HC165移位/數(shù)據(jù)輸出與I2C總線的數(shù)據(jù)線發(fā)生沖突(此操作與該/實驗板的特殊結(jié)構(gòu)有關(guān),不是通用的)SSPEN=1;/SSP模塊使能2C語言編寫的I2C總線工作方式傳輸數(shù)據(jù)子程序需要發(fā)送的數(shù)據(jù)在寄存器j中。/I2C總線輸出數(shù)據(jù)子程序i2cout()SEN=1;/產(chǎn)生I2C啟動信號for(n=0x02;-n;)continue;/給予一定的延時,保證啟動doRSEN=1;/產(chǎn)生I2C重啟動信號while(SSPIF=0);/如果沒能啟動,則反復(fù)啟動,直到啟動為止SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=0X58;/I2C總線發(fā)

7、送地址字節(jié)do;while(SSPIF=0);/等待地址發(fā)送完畢SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=0X01;/I2C總線發(fā)送命令字節(jié)do;while(SSPIF=0);/等待命令發(fā)送完畢SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=j;/I2C總線發(fā)送數(shù)據(jù)字節(jié)do;while(SSPIF=0);/等待數(shù)據(jù)發(fā)送完畢SSPIF=0;/SSPIF標(biāo)志清0PEN=1;/產(chǎn)生停止條件do ;while(SSPIF=0);/等待停止條件產(chǎn)生SSPIF=0;/SSPIF標(biāo)志清06.2.4程序清單下面給一個例程。該程序利用MAX518進行D/A轉(zhuǎn)換,且從D/A0引腳輸出一個正弦波形。可作為

8、讀者編制程序的參考。特別注意,在調(diào)試該程序時,把模板上的鈕子開關(guān)S8拔向高電平,以免發(fā)生資源沖突。#include<pic.h>/本程序?qū)⑼ㄟ^PIC16F877的I2C方式驅(qū)動D/A轉(zhuǎn)換器MAX518,使其D/A0通道輸出/一個連續(xù)的正弦波形(注:本程序并沒對正弦波的頻率進行控制)const char table = 0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XF

9、A,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0

10、E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C;/以上的數(shù)組用于存放正弦表,在定義數(shù)組時,前面應(yīng)該加上 const,/以使數(shù)組存放于ROM中,而不至于占用太多的RAMunsigned char i;unsigned char j;un

11、signed char n;/I2C初始化子程序voidi2cint()SSPCON = 0X08;/初始化SSPCON寄存器TRISC3 =1;/設(shè)置SCL為輸入口TRISC4 =1;/設(shè)置SDA為輸入口TRISA4 = 0;SSPSTAT=0X80;/初始化SSPSTAT寄存器SSPADD=0X02;/設(shè)定I2C時鐘頻率SSPCON2=0X00;/初始化SSPCON2寄存器di();/關(guān)閉總中斷SSPIF=0;/清SSP中斷標(biāo)志RA4=0;/關(guān)掉74HC165的移位時鐘使能,以免74HC165/移位數(shù)據(jù)輸出與I2C總線的數(shù)據(jù)線發(fā)生沖突SSPEN=1;/SSP模塊使能/I2C總線輸出數(shù)據(jù)子程

12、序voidi2cout()SEN=1;/產(chǎn)生I2C啟動信號for(n=0x02;-n;)continue;/給予一定的延時,保證啟動doRSEN=1;/產(chǎn)生I2C啟動信號while(SSPIF=0);/如果沒能啟動,則反復(fù)啟動,直到啟動為止SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=0X58;/I2C總線發(fā)送地址字節(jié)do;while(SSPIF=0);/等待地址發(fā)送完畢SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=0X00;/I2C總線發(fā)送命令字節(jié),D/A0通道輸出do;while(SSPIF=0);/等待命令發(fā)送完畢SSPIF=0;/SSPIF標(biāo)志清0SSPBUF=j;/I2C總線發(fā)送數(shù)據(jù)字節(jié)do;while(SSPIF=0);/等待數(shù)

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論