|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
初次pic c綜合調(diào)試 |
| 作者:baiguo 欄目:單片機(jī) |
剛看完《PIC單片機(jī)原理及應(yīng)用》一書,自覺各功能模塊單獨(dú)使用已無大礙,就不知深淺想設(shè)計(jì)如下一項(xiàng)目: 題目:電源逆變器驅(qū)動(dòng)及顯示 功能:CCP1,CCP2為驅(qū)動(dòng)脈沖;LED數(shù)碼管顯示輸入電壓及輸出功率;按鍵開,關(guān) 和選擇電壓或功率轉(zhuǎn)換通道;ADC轉(zhuǎn)換并判斷輸入電壓是否在范圍之內(nèi),輸出是否過載 程序如下: /*********************************************************** Project :驅(qū)動(dòng)顯示 Chip type :PIC16F877 Clock frequency:400KHZ Comments: 1.RA0,RA1為電壓及功率輸入通道 2.RD為LED字段,RB低三位為位段 3.RB4(ON/OFF),RB5(電壓/功率) 系統(tǒng)加電后,LED旋轉(zhuǎn)顯示 —— | | —— RB4按下,LED閃爍“ON"三次后,PWM工作,LED顯示輸入電壓 RB5只在RB4按下后起作用(交替顯示電壓或功率) RB4再次按下,LED閃爍“OFF"三次后,PWM停止工作,LED旋轉(zhuǎn)顯示 —— | | —— 輸入電壓過高,顯示"HO";過低,顯示"LO" 輸出過載,顯示"OL" ***********************************************************/ #include<pic1687x.h> unsigned CHAR mmm,i,j,ii,jj; unsigned CHAR word[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90}; unsigned CHAR led[3]={0xFF,0xFF,0xFF}; unsigned int temp_v,temp_p; unsigned CHAR key,keyi,flag; union adre { unsigned int rel; unsigned CHAR rell[2]; }adrel[5]; //**********************延時(shí)子程序**************************** void delay_ms(unsigned CHAR time) { unsigned CHAR scend; while(time>0) { time--; for(scend=100;scend>0;scend--) ; } } //**********************延時(shí)子程序i**************************** void delayi_ms(unsigned CHAR timei) { unsigned CHAR scendi; while(timei>0) { timei--; for(scendi=100;scendi>0;scendi--) ; } } //**********************mcu初始化**************************** void mcu_init(void) { INTCON=0x00; TRISB=0xF0; //高四位輸入,低四位輸出 OPTION=0x80; //RB7~4弱上拉 PORTB|=0x07; //清除顯示 TRISC&=0xF9; // CCP1,CCP2輸出 TRISD=0x00; //定為輸出 PORTD=0xFF; TRISA=0xFF; //定為輸入 } //**********************bcd碼轉(zhuǎn)換子程序*********************** void hextobcd(unsigned int temp_vi,unsigned int temp_pi) { unsigned int tempv,tempp,tempvi,temppi; unsigned CHAR nn,mm; if(key==3) //顯示電壓 { tempvi=temp_vi<<3+temp_vi<<1; for(nn=0;nn<3;nn++) { tempv=tempvi%10; led[nn]=word[tempv]; tempvi=tempvi>>3-tempvi>>1; } if(led[2]==0xC0) //十位去零 led[2]=0xFF; led[1]&=0x7F; //個(gè)位加點(diǎn) } if(key==2) //顯示功率 { temppi=temp_pi; for(mm=0;mm<3;mm++) { tempp=temppi%10; led[mm]=word[tempp]; temppi=temppi>>3-temppi>>1; } if(led[2]==0xC0) //高位去零 { led[2]=0xFF; if(led[1]==0xC0) led[1]=0xFF; } } } //**********************alarm_v顯示子程序********************* void alarm_v(void) { if(adrel[i].rel<409) //欠壓顯示 { PORTB|=0x07; PORTD=0xC7; //"L" PORTB&=0xFD; delay_ms(5); PORTB|=0x07; PORTD=0xC0; //"O" delay_ms(5); } if(adrel[i].rel>614) //過壓顯示 { PORTB|=0x07; PORTD=0x86; //"H" PORTB&=0xFD; delay_ms(5); PORTB|=0x07; PORTD=0xC0; //"O" delay_ms(5); } } //**********************alarm_p顯示子程序********************* void alarm_p(void) { //過載顯示 PORTB|=0x07; PORTD=0xC0; //"O" PORTB&=0xFD; delay_ms(5); PORTB|=0x07; PORTD=0xC7; //"L" delay_ms(5); } //***********************待機(jī)顯示子程序*********************** void wait(void) { unsigned CHAR ii,jj; T0IE=0; for(ii=0;ii<5;ii++) { SWITCH (ii) { case 0:for(jj=0;jj<10;jj++) { PORTB|=0x07; // _ _ PORTD=0xE7; // | PORTB&=0xFB; // | delay_ms(5); // _ _ PORTB|=0x07; PORTD=0xF6; PORTB&=0xFD; delay_ms(5); PORTB|=0x07; PORTD=0xFC; PORTB&=0xFE; delay_ms(5); } |
| 2樓: | >>參與討論 |
| 作者: dadodo 于 2004/3/1 11:21:00 發(fā)布:
換LPC900啦,哈哈! |
|
| 3樓: | >>參與討論 |
| 作者: baiguo 于 2004/3/1 12:26:00 發(fā)布:
No 以上用PIC16F73就可實(shí)現(xiàn),才15塊,LPC900太貴啦 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |