![PIC實例程序[精校版本]_第1頁](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c1.gif)
![PIC實例程序[精校版本]_第2頁](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c2.gif)
![PIC實例程序[精校版本]_第3頁](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c3.gif)
![PIC實例程序[精校版本]_第4頁](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c4.gif)
![PIC實例程序[精校版本]_第5頁](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、MCD-DEMO2A/D轉(zhuǎn)換程序?qū)嵗齈IC16F877A+PICC /實驗?zāi)康模菏煜/D轉(zhuǎn)換/軟件思路:選擇RA0做為模擬輸入通道;/ 結(jié)果只取低8位/ 連續(xù)轉(zhuǎn)換5次再求平均值做為轉(zhuǎn)換結(jié)果/ 結(jié)果送數(shù)碼管的高低3位顯示/硬件要求:跳線J18接通/ 撥碼開關(guān)S6全部置ON,S5第4-6位置ON,第1-3位置OFF/ 為不影響結(jié)果,其他撥碼開關(guān)置OFF。#include /包含單片機內(nèi)部資源預(yù)定義_CONFIG(0x1832); /芯片配置字,看門狗關(guān),上電延時開,掉電檢測關(guān),低壓編程關(guān),加密,4M晶體HS振蕩const char TABLE=0xc0,0xf9,0xa4,0xb0,0x99,0
2、x92,0X82,0XF8,0X80,0X90; /定義常數(shù)0-9的數(shù)據(jù)表格void DELAY(); /delay函數(shù)申明void init(); /I/O口初始化函數(shù)申明void display(int x); /顯示函數(shù)申明/- /主程序開始void main() int result=0x00; /定義轉(zhuǎn)換結(jié)果寄存器 while(1) /死循環(huán) int i; /定義循環(huán)次數(shù)控制寄存器 result=0x00; /轉(zhuǎn)換結(jié)果清0 for(i=5;i0;i-) /求5次轉(zhuǎn)換結(jié)果的平均值 init(); /調(diào)用初始化函數(shù) ADGO=0X1; /開啟轉(zhuǎn)換過程 while(ADGO); /等待轉(zhuǎn)換
3、完成 result=result+ADRESL; /累計轉(zhuǎn)換結(jié)果 result=result/5; /求5次結(jié)果的平均值 display(result); /調(diào)用顯示函數(shù) /-/初始化函數(shù)void init() PORTA=0XFF; PORTD=0XFF; /熄滅所有顯示 TRISA=0X1; /設(shè)置RA0為輸入,其他為輸出 TRISD=0X00; /設(shè)置D口全為輸出 ADCON1=0X8E; /轉(zhuǎn)換結(jié)果左對齊,RA0做模擬輸入口,其它做普通I/O ADCON0=0X41; /系統(tǒng)時鐘Fosc/8,選擇RA0通道,允許ADC工作 DELAY(); /保證采樣延時 /-/顯示函數(shù)void di
4、splay(int x) int bai,shi,ge,temp; /定義4個臨時變量 temp=x; /暫存AD轉(zhuǎn)換的結(jié)果 bai=temp/0x64; /求顯示的百位 shi=(temp%0x64)/0xa; /求顯示的十位 ge=(temp%0x64)%0xa; /求顯示的個位 PORTD=TABLEbai; /查表得百位顯示的代碼 PORTA=0x1f; /RA3輸出低電平,點亮百位顯示 DELAY(); /延時一定時間,保證顯示亮度 PORTD=TABLEshi; /查表得十位顯示的代碼 PORTA=0x2F; /RA4輸出低電平,點亮十位顯示 DELAY(); /延時一定時間,保證
5、亮度 PORTD=TABLEge; /求個位顯示的代碼 PORTA=0x37; /RA5輸出低電平,點亮個位顯示 DELAY(); /延時一定時間,保證亮度 /-/延時程序void DELAY() /延時程序 int i; /定義整形變量 for(i=0x100;i-;); /延時 2008-3-21 11:47:00flash607等級:小學(xué)三年級文章:10積分:432門派:無門無派注冊:2008年5月7日第 2 樓 學(xué)習(xí)學(xué)習(xí)!很好的東西加很好的程序!2008-5-22 10:35:00libozero等級:初中一年級文章:37積分:1204門派:無門無派注冊:2008年5月14日第 3 樓
6、 求匯編的AD轉(zhuǎn)換程序?qū)嵗?008-5-28 10:15:00zhongruntian頭銜:丐幫幫主等級:老師(版主)文章:8684積分:178421門派:丐幫注冊:2005年3月13日第 4 樓 坎坷不平,艱難重重,若無耐心,難望有成.PIC16技術(shù)支持QQ:443935535 2008-5-28 11:03:00slaoliu等級:高中一年級文章:85積分:2142門派:無門無派注冊:2006年11月7日第 5 樓 此程序為什么用 PROTEUS7.1 仿真不能正常工作呢.2008-8-15 12:09:00charles_ccw等級:小學(xué)三年級文章:9積分:392門派:無門無派注冊:20
7、07年1月16日第 6 樓 為什麼當(dāng)我跑程式時轉(zhuǎn)動電位器,不是出現(xiàn)一次0-255,而是0-255 四次呢? 請指教!2008-9-28 14:08:00zhongruntian頭銜:丐幫幫主等級:老師(版主)文章:8684積分:178421門派:丐幫注冊:2005年3月13日第 7 樓 以下是引用charles_ccw在2008-9-28 14:08:00的發(fā)言:為什麼當(dāng)我跑程式時轉(zhuǎn)動電位器,不是出現(xiàn)一次0-255,而是0-255 四次呢? 請指教!這樣就對了!877A的A/D轉(zhuǎn)換是10位的,而這個程序只取了低8位。實際轉(zhuǎn)換結(jié)果應(yīng)該是:00 000 - 00 255 - 01 000 - 01
8、 - 01 255 - 10 000 - 10 255 - 11 000 - 11 255 (高兩位是二進制,后面三位是十進制,這樣寫主要是為了方便。如 00 2555 其中00是兩位二進制,255是三位十進制)坎坷不平,艱難重重,若無耐心,難望有成.PIC16技術(shù)支持QQ:443935535 2008-9-28 15:44:00charles_ccw等級:小學(xué)三年級文章:9積分:392門派:無門無派注冊:2007年1月16日第 8 樓 請問一下,如何才可以變回一組數(shù)字呢,即 000-255 或 000-1024 呢? 謝謝!2008-9-28 16:46:00wangjingcan等級:小學(xué)
9、二年級文章:7積分:361門派:無門無派注冊:2009年2月23日第 9 樓 result=result+ADRESL; /累計轉(zhuǎn)換結(jié)果?當(dāng)ADRESL值較大時(如0XFE)數(shù)據(jù)不會溢出?2009-4-29 10:37:00zhongruntian頭銜:丐幫幫主等級:老師(版主)文章:8684積分:178421門派:丐幫注冊:2005年3月13日第 10 樓 以下是引用wangjingcan在2009-4-29 10:37:00的發(fā)言:result=result+ADRESL; /累計轉(zhuǎn)換結(jié)果?當(dāng)ADRESL值較大時(如0XFE)數(shù)據(jù)不會溢出?result是int型啊。樓主 MCD-DEMO2
10、PIC單片機紅外線遙控接收解碼實例PIC16F877A+PICC/實驗?zāi)康模菏煜みb控接碼解碼的方法/數(shù)碼管顯示解碼結(jié)果:高四位為用戶碼,低2位為按鍵碼/硬件要求:跳線J19接通,其他跳線斷開/ 撥碼開關(guān)S5、S6全部置ON/ 其他撥碼開關(guān)全部置OFF#include_CONFIG(0x1832); /芯片配置字,看門狗關(guān),上電延時開,掉電檢測關(guān),低壓編程關(guān),加密,4M晶體HS振蕩#define uchar unsigned char#define uint unsigned intvoid delay(char x,char y);#define bitset(var,bitno)(var)|
11、=1(bitno)#define bitclr(var,bitno)(var)&=(1(bitno)union struct unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; oneBit; unsigned char allBits; myFlag;#define CNT2_1 myFlag.oneBit.b1 #define CNT2_2 myFlag.oneBit.b2 #define CNT2_3
12、myFlag.oneBit.b3 #define CNT2 myFlag .allBitsstatic bit FLAGS ; static bit Bitin; union Csr unsigned long i; unsigned char Csra4; myCsra;#define RMT RA1 / ;遙控接收輸入腳位地址(RA。1)#define BITIN 7 /遙控接收數(shù)據(jù)位位標(biāo)志uchar CNT0, CNT3,CNT4; /用戶臨時寄存器1-4uint CNT1;uchar TABADD; /數(shù)碼管顯示碼取碼用寄存器uchar CSR0; /;遙控鍵碼反碼寄存器uchar C
13、SR1; /;遙控器鍵碼寄存器uchar CSR2; /;遙控器用戶碼高8位寄存器uchar CSR3; /;遙控器用戶碼低8位寄存器uchar FLAGS2; /;臨時寄存器uchar CSR2A ; /遙控接收32位數(shù)據(jù)暫存寄存器const uchar table=0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0a1,0x86,0x8e,;/0x00 / 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,/-系統(tǒng)初始化子程序-void initia
14、l (void) PORTA=0; ADCON1=7; / 設(shè)置RA口全部為普通數(shù)字IO口 TRISA=0x02; / 將RMT設(shè)置為輸入,其它所有IO口設(shè)置為輸出 TRISD=0; / ;RC口全部為輸出 PORTD=0xFF; /先讓數(shù)碼管全部不顯示/-void RCV() if(!RMT) CNT1=640; /4*256*10us 640*16=10。24ms CNT2=0; /RCV1 do / ;先檢測引導(dǎo)碼的9MS低電平_ / ;每一個循環(huán)16US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; if(CNT2_2) /高電平大于8*10US=80US則
15、為有效高電平, break; /否則是一些干擾信號16*4=64us while (CNT1-); /低電平大于4*256*10US=10.24MS則是錯誤脈沖 /RCV2 if(CNT2_2&(0CNT1)&(CNT1320) /;低電平小于2*256*10US=5.12MS_ /320*16=5。12ms則是錯誤脈沖 CNT1=480; /;3*256*10us 480*16=7.68 CNT2=0; /RCV3 /;每一個循環(huán)16US do if(!RMT) CNT2=CNT2+; if (RMT) CNT2=0; if(CNT2_2) / 低電平大于8*10US=80US則為有效低電平
16、,否則是一些干擾信號 break; /RCV4,否則是一些干擾信號16*4=64us / 高電平大于3*256*10US=7.68MS則是錯誤的 while (CNT1-); /RCV4 if(CNT2_2 & (0CNT1)&(CNT1320) /高電平小于1*256*10US=2.56MS則是錯誤的 /480-320=160 *16= 2.56ms CNT3 =32; /接收數(shù)據(jù)共32位,16位用戶碼,8位控制碼加8位控制碼的反碼 /RCV5 do CNT2=0; CNT0=86; /低電平大于256-170=86*10US=860US錯誤 86*10 _ CNT4=200; /高電平大于
17、256-56=200*10US=2MS錯誤 200*10 /RCV5_HI do /;每一個循環(huán)10US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; if(CNT2_3) /;高電平大于8*10US=80US則為有效高電平 break; /RCV6否則是一些干擾信號16*4=64us /;低電平大于860US則是錯誤的 while (CNT0-); /CV6 if(CNT0=0)|(CNT2_3=0) break; CNT2=0; /RCV6_LO do /_ if(!RMT) CNT2=CNT2+; if(RMT) CNT2=0; if(CNT2_3) /低電平
18、大于10*8US=80US則是有效低電平 break ; / COMPARE 否則是一些干擾信號16*4=64us while (CNT4-);/高電平大于256-56=200*10US=2MS錯誤 if(CNT4=0)|(CNT2_3=0) break; /OMPARE CNT0=(86-CNT0)+(200-CNT4) ; /;減CNT0的值 等于實際低電平計數(shù)值 / ;減CNT4的值 等于實際高電平計數(shù)值 / ;將高低電平的計數(shù)加在一起并存入CNT0,通過比較高低電平總的時間來確定是1還是0 / ;總的值大于255(即時間大于255*10US=2.55MS)則錯誤 255*10=2.55
19、 / ;總的時間小于70*10US=700US則是錯誤的 70*10=700 if( (70CNT0)&(CNT0130)|(160CNT0)&(CNT0230) ) ) / ;130*10=1.3MS if(70CNT0)&(CNT0130) /COMPARE_H / ;時間大于1.3MS轉(zhuǎn)去確定是否1 Bitin=0; /;時間在700US-1.3MS之間則是0 else/ if (160CNT01; /;將每一位移入相應(yīng)寄存器 if(Bitin) bitset ( myCsra. Csra3,7); else bitclr ( myCsra. Csra3,7); else break;
20、while (CNT3-); /;是否接收完32位 CSR3=myCsra. Csra0; CSR2=myCsra. Csra1; CSR1=myCsra. Csra2; CSR0=myCsra. Csra3; CSR2A= CSR0; /;比較鍵碼的反碼取反后是否等于鍵碼 /;不等于則接收到的是錯誤的信息 / 將鍵碼送顯示 /-void display() int i; /定義查表變量 i=CSR3&0x0f; /求秒的個位 PORTD=tablei; /送D口顯示 PORTA=0x3e; /點亮秒的個位 delay(5,70); /延長一段時間,保證亮度 i=CSR3&0xf0; /求秒的
21、十位 i=i4; /右移4位 PORTD=tablei; /送D口顯示 PORTA=0x3d; /點亮秒的十位 delay(5,70); /延長一段時間,保證亮度 i=CSR2&0x0f; /求分的個位 PORTD=tablei; /送D口顯示,并顯示小數(shù)點 PORTA=0x37; /點亮分的個位 delay(5,70); /延長一段時間,保證亮度 i=CSR2&0xf0; /求分的十位 i=i4; PORTD=tablei; /送D口顯示 PORTA=0x3b; /點亮分的十位 delay(5,70); /延長一段時間,保證亮度 i=CSR1&0x0f; /求時的個位 PORTD=table
22、i; /送D口顯示,并加上小數(shù)點 PORTA=0x2f; /點亮?xí)r的個位 delay(5,70); /延長一段時間,保證亮度 i=CSR1&0xf0; /求時的十位 i=i4; PORTD=tablei; /送D口顯示 PORTA=0x1f; /點亮?xí)r的十位 delay(5,70); /延長一段時間,保證亮度 /-主程序-void main(void) initial (); /系統(tǒng)初始化子程序 while(1) RCV(); /遙控接收程序 display(); /解碼顯示程序 /-/延時函數(shù)void delay(char x,char y) char z; do z=y; do;while
23、(-z); while(-x);/其指令時間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數(shù)調(diào)用的call 指令、頁面設(shè)定、傳遞參數(shù)花掉的7 個指令。/則是:14+(3*(Y-1)+7)*(#include_CONFIG(0x1832); /芯片配置字,看門狗關(guān),上電延時開,掉電檢測關(guān),低壓編程關(guān),加密,4M晶體HS振蕩#define uch unsigned char /給unsigned char起別名 uch# define DQ RA0 /定義18B20數(shù)據(jù)端口 # define DQ_DIR TRISA0 /定義18B20D口方向寄存器 # define DQ_HIGH()
24、DQ_DIR =1 /設(shè)置數(shù)據(jù)口為輸入# define DQ_LOW() DQ = 0; DQ_DIR = 0 /設(shè)置數(shù)據(jù)口為輸出unsigned char TLV=0 ; /采集到的溫度高8位unsigned char THV=0; /采集到的溫度低8位unsigned char TZ=0; /轉(zhuǎn)換后的溫度值整數(shù)部分unsigned char TX=0; /轉(zhuǎn)換后的溫度值小數(shù)部分unsigned int wd; /轉(zhuǎn)換后的溫度值BCD碼形式unsigned char shi; /整數(shù)十位unsigned char ge; /整數(shù)個位unsigned char shifen; /十分位unsi
25、gned char baifen; /百分位unsigned char qianfen; /千分位unsigned char wanfen; /萬分位unsigned char table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /0-9的顯示代碼/-/延時函數(shù)void delay(char x,char y) char z; do z=y; do;while(-z); while(-x);/其指令時間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數(shù)調(diào)用的call 指令、頁面設(shè)定、傳遞參數(shù)花掉的7 個指令。/則是:14+(3
26、*(Y-1)+7)*(X-1)。/-/結(jié)果顯示函數(shù)void display()TRISA=0X00; /設(shè)置A口全為輸出PORTD=tableshi; /顯示整數(shù)十位PORTA=0x3e;delay(10,70);PORTD=tablege&0X7F; /顯示整數(shù)個位,并點亮小數(shù)點PORTA=0x3d;delay(10,70);PORTD=tableshifen; /顯示小數(shù)十分位PORTA=0x3b;delay(10,70);PORTD=tablebaifen; /顯示小數(shù)百分位PORTA=0x37;delay(10,70);PORTD=tableqianfen; /顯示小數(shù)千分位PORTA
27、=0x2f;delay(10,70);PORTD=tablewanfen; /顯示小數(shù)萬分位PORTA=0x1f;delay(10,70);/-/系統(tǒng)初始化函數(shù)void init() ADCON1=0X07; /設(shè)置A口為普通數(shù)字口 TRISA=0X00; /設(shè)置A口方向為輸出 TRISD=0X00; /設(shè)置D口方向為輸出/-/復(fù)位DS18B20函數(shù)reset(void) char presence=1; while(presence) DQ_LOW() ; /主機拉至低電平 delay(2,70); /延時503us DQ_HIGH(); /釋放總線等電阻拉高總線,并保持1560us del
28、ay(2,8); /延時70us if(DQ=1) presence=1; /沒有接收到應(yīng)答信號,繼續(xù)復(fù)位 else presence=0; /接收到應(yīng)答信號 delay(2,60); /延時430us /-/寫18b20寫字節(jié)函數(shù)void write_byte(uch val)uch i;uch temp;for(i=8;i0;i-) temp=val&0x01; /最低位移出 DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); /從高拉至低電平,產(chǎn)生寫時間隙 if(temp=1) DQ_HIGH(); /如果寫1,拉高電平 delay(2,7); /延時63us DQ_HIGH(); NOP(); NOP(); val=val1; /右移一位 /-/18b20讀字節(jié)函數(shù)uch read_byte(void)uch i;uch value=0; /讀出溫度static bit j;for(i=8;i0;i-) value=1; DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); /6us DQ_HIGH(); /拉至高電平 NOP(); NOP(); NOP(); NOP(); NOP(); /4us j=DQ; if(j) value|=0x80;
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省臨沂市蘭陵縣第一中學(xué)2025屆高三第三次適物理試題含解析
- 湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院《分子生物學(xué)韓》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省菏澤市第一中學(xué)2024-2025學(xué)年高三“零診”考試物理試題含解析
- 山西水利職業(yè)技術(shù)學(xué)院《鋼琴即興伴奏(2)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川省成都市青羊區(qū)石室教育集團2025年初三期末物理試題含解析
- 四川師范大學(xué)《智能信息處理》2023-2024學(xué)年第二學(xué)期期末試卷
- 井陘礦區(qū)2025屆數(shù)學(xué)三下期末質(zhì)量檢測試題含解析
- 四川鐵道職業(yè)學(xué)院《大學(xué)體育(4)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西信息應(yīng)用職業(yè)技術(shù)學(xué)院《電機學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西警官職業(yè)學(xué)院《小學(xué)數(shù)學(xué)課程標(biāo)準與教材研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 高職汽修專業(yè)《汽車電氣設(shè)備維修》說課課件
- 陳述句與反問句互改(課件)-2022-2023學(xué)年三年級語文公開課
- 2024至2030年中國車用氮氧傳感器行業(yè)市場發(fā)展調(diào)研及投資前景分析報告
- 人工肩關(guān)節(jié)置換(反肩)
- 離婚協(xié)議書范本2個孩子可打印
- 人教版 水平四 《一百米跑》說課稿
- 藏族民間舞-熱巴舞智慧樹知到期末考試答案章節(jié)答案2024年西藏大學(xué)
- 浙江省中小學(xué)心理健康教育課程標(biāo)準
- 《何西阿書一概要》課件
- 超市經(jīng)銷商轉(zhuǎn)場協(xié)議書
- 中華全國律師協(xié)會律師知識產(chǎn)權(quán)盡職調(diào)查操作指引
評論
0/150
提交評論