PIC單片機(jī)課程設(shè)計(jì)報(bào)告_第1頁
PIC單片機(jī)課程設(shè)計(jì)報(bào)告_第2頁
PIC單片機(jī)課程設(shè)計(jì)報(bào)告_第3頁
PIC單片機(jī)課程設(shè)計(jì)報(bào)告_第4頁
PIC單片機(jī)課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

.z......資料....NORTHCHINAUNIVERSITYOFSCIENCEANDTECHNOLOGY單片機(jī)課程設(shè)計(jì)報(bào)告學(xué)生:王文帥學(xué) 號:5學(xué) 院:信息工程學(xué)院專業(yè)班級:12級電信四班指導(dǎo)教師:博2015年 06 月 21日一、課程設(shè)計(jì)目的本課程設(shè)計(jì)是在《PIC單片機(jī)原理及應(yīng)用》及《單片機(jī)C語言編程》課程的基礎(chǔ)上,通過硬件設(shè)計(jì)、軟件編程及仿真調(diào)試的實(shí)踐,進(jìn)一步掌握PIC單片機(jī)的應(yīng)用方法,熟練掌握PICCC語言程序的編寫與調(diào)試,是畢業(yè)設(shè)計(jì)前的一次重要實(shí)踐,為今后走上工作崗位打下堅(jiān)實(shí)的單片機(jī)應(yīng)用基礎(chǔ)。二、設(shè)計(jì)題目及要求2.1設(shè)計(jì)題目:基于PIC16F877單片機(jī)的多功能電子時(shí)鐘2.2功能實(shí)現(xiàn):實(shí)時(shí)時(shí)鐘顯示,時(shí)間可調(diào);實(shí)時(shí)溫度顯示,并具有超限報(bào)警功能。輸出顯示采用LCD1602或LED七段數(shù)碼顯示器。2.3設(shè)計(jì)要求:自己設(shè)計(jì)硬件和程序編程,畫出完整的電路原理圖,用Multisim或Proteus仿真,最終可實(shí)現(xiàn)脫機(jī)運(yùn)行。三、設(shè)計(jì)原理說明3.1時(shí)鐘模塊DS1307是美國DALLAS公司推出的I2C總線接口實(shí)時(shí)時(shí)鐘芯片,它可獨(dú)立于CPU工作,不受CPU主晶振及其電容的影響,且計(jì)時(shí)準(zhǔn)確,月累積誤差一般小于10秒。芯片還具有主電源掉電情況下的時(shí)鐘保護(hù)電路,DS1307的時(shí)鐘靠后備電池維持工作,拒絕CPU對其讀出和寫入訪問。同時(shí)還具有備用電源自動切換控制電路,因而可在主電源掉電和其它一些惡劣環(huán)境場合中保證系統(tǒng)時(shí)鐘的定時(shí)準(zhǔn)確性。DS1307具有產(chǎn)生秒、分、時(shí)、日、月、年等功能,且具有閏年自動調(diào)整功能。同時(shí),DS1307芯片部還集成有一定容量、具有掉電保護(hù)特性的靜態(tài)RAM,可用于保存一些關(guān)鍵數(shù)據(jù)。3.2顯示模塊如用LCD1602作為顯示設(shè)備,要求顯示屏分兩行顯示,第一行顯示日期(年-月-日)和星期,第二行顯示時(shí)間(時(shí):分:秒)和溫度。顯示秒由00一直加到59,分鐘數(shù)也由00加到59,小時(shí)采用24小時(shí)制,由00加到23,如此循環(huán)顯示。3.3按鍵模塊按鍵用來作為時(shí)間調(diào)整。要求至少設(shè)計(jì)4個(gè)按鍵,按鍵1作為設(shè)置鍵;按鍵2、按鍵3分別為增加、減少鍵,在設(shè)置鍵按下時(shí),此兩個(gè)按鍵方有效;按鍵4是確定鍵,在設(shè)置鍵按下時(shí)方才有效。3.4溫度采集模塊DS18B20是美國DALLAS公司推出的單總線數(shù)字溫度傳感器。DS18B20部集成了溫敏元件、數(shù)據(jù)轉(zhuǎn)換芯片、存儲器芯片和計(jì)算機(jī)接口芯片等多功能模塊。其主要技術(shù)特點(diǎn)有:具有獨(dú)特的單線接口方式;可以通過數(shù)據(jù)線供電,具有超低功耗工作方式;測溫圍為-55℃~125℃,測溫精度為0.5℃;溫度轉(zhuǎn)換精度9~12位可編程,直接將溫度轉(zhuǎn)換值以二進(jìn)制數(shù)碼的方式串行輸出。四、硬件原理圖(含原理圖、電路仿真圖)時(shí)間顯示:按下溫度鍵temp后顯示溫度:五、軟件設(shè)計(jì)(含流程圖、帶注釋的程序清單)*include<pic.h>*include<string.h>*include<stdio.h>*define_*TAL_FREQ1000000UL*definespeakRC3*defineON0*defineOFF1*defineDQRB5//設(shè)置數(shù)據(jù)方向*defineDQ_IN()TRISB5=1//輸入*defineDQ_OUT()TRISB5=0//輸出//DS1302引腳定義*defineIORA1*defineSCLKRA0*defineRSTRA2//DS1302端口數(shù)據(jù)讀寫方向*defineSET_IO_RD()TRISA1=1*defineSET_IO_WR()TRISA1=0*defineLCD_CLS0*01*defineLCD_HOME0*02*defineLCD_SETMODE0*04*defineLCD_SETVISIBLE0*08*defineLCD_SHIFT0*10*defineLCD_SETFUNCTION0*20*defineLCD_SETCGADDR0*40*defineLCD_SETDDADDR0*80*definePORT_LCD_DATPORTD*definePORT_LCD_CTLPORTC*defineTRIS_LCD_DATTRISD*defineTRIS_LCD_CTLTRISC*defineRSRC5*defineRWRC6*defineERC7e*ternunsignedcharDateTime[];e*terncharWEEK[][4]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};//0,1,2,3,4,5,6分別對應(yīng)周日,周一至周六//所讀取的日期時(shí)間(秒,分,時(shí),日,月,星期,年)unsignedinttemper;unsignedintsettempe=570;unsignedcharDateTime[7];unsignedchartmp[]="0000";//向DS1302寫入一個(gè)字節(jié)unsignedcharRB1_FLAG=0;constunsignedchartone[]={108,102,91,86,77,68,61,57};//發(fā)聲的頻率常數(shù)voiddelay18us(unsignedchar*) //18us,每次加1,增加9us{ unsignedchari; for(;*>0;*--){ for(i=0;i<1;i++);}}voiddelay1ms(unsignedint*){ unsignedchari; for(;*>0;*--) for(i=0;i<165;i++); }voidwrite_byte_to_DS1302(unsignedchar*){unsignedchari;SET_IO_WR();for(i=0*01;i!=0*00;i<<=1) { if(*&i)IO=1;elseIO=0; SCLK=0;SCLK=1;__delay_us(10); }}//從DS1302讀取1字節(jié)unsignedcharget_byte_form_DS1302(){unsignedchari,dat=0*00;SET_IO_RD();for(i=0;i<8;i++){ SCLK=1;SCLK=0; if(IO)dat|=(0*01<<i);__delay_us(10);}return(dat>>4)*10+(dat&0*0F);}//從DS1302指定位置讀數(shù)據(jù)unsignedcharread_data(unsignedcharaddr){unsignedchardat;RST=1;write_byte_to_DS1302(addr);dat=get_byte_form_DS1302();RST=0;returndat;}//向DS1302指定地址寫數(shù)據(jù)voidWrite_DS1302(unsignedcharaddr,unsignedchardat){RST=1; write_byte_to_DS1302(addr);write_byte_to_DS1302(dat);RST=0;}voidport_init(){ ADCON1=0*06;//RA設(shè)置為普通IO口 TRISA=0*00;//端口A設(shè)置為輸出 OPTION=0*00;//端口B弱上拉使能 TRISB=0*FF;PORTC=0*00;TRISC=0*00;//端口C設(shè)置為輸出PORTD=0*00; TRISD=0*00;//端口D設(shè)置為輸出speak=0;}voidsong(unsignedchar*){ unsignedchari,j; for(i=0;i<60;i++) { for(j=0;j<3;j++) { speak=1; delay18us(tone[*]); speak=0;//翻轉(zhuǎn)發(fā)聲 delay18us(tone[*]); } } }voidkeyscan() {unsignedchara,b;DateTime[0]=0;Write_DS1302(0*8E,0*00);//Write_DS1302(0*80,0*80);//if(RB2==0)//小時(shí)+1{ DateTime[2]=DateTime[2]+1;//第三個(gè)元素小時(shí)+1 if(DateTime[2]==24)DateTime[2]=0;//當(dāng)變?yōu)?4H時(shí),小時(shí)位歸零 a=DateTime[2]/10*16+DateTime[2]%10;//變成16進(jìn)制數(shù)據(jù) Write_DS1302(0*84,a);}if(RB3==0){ DateTime[1]=DateTime[1]+1;//第二個(gè)元素分鐘+1 if(DateTime[1]==60)DateTime[1]=0;//當(dāng)變?yōu)?0min時(shí),小時(shí)位歸零 b=DateTime[1]/10*16+DateTime[1]%10;//變成16進(jìn)制數(shù)據(jù) Write_DS1302(0*82,b); }if(RB4==0){ song(3); while(RB4==ON); Write_DS1302(0*80,0*00);//調(diào)整完畢后啟動時(shí)鐘運(yùn)行 Write_DS1302(0*8E,0*00);//禁止寫 RB1_FLAG=0;//將RB1按下后產(chǎn)生的標(biāo)志清除}}//DS1302初始化voidinit_DS1302(){unsignedcharsecond_REG;second_REG=read_data(0*81);//讀取秒寄存器當(dāng)前值//如果高位CH為1,則表示當(dāng)前DS1302振蕩器出于待機(jī)狀態(tài)//這時(shí)需要將CH(clockhaltflag)位設(shè)為0,打開振蕩器使時(shí)鐘運(yùn)行if((second_REG&0*80)==0*80){Write_DS1302(0*8E,0*00);//寫控制字節(jié),取消寫保護(hù)Write_DS1302(0*80,second_REG&0*7F);//0*80地址不變,設(shè)高位CH=0 Write_DS1302(0*8E,0*80);//加保護(hù)}}//讀取當(dāng)前日期voidgetDateTime(){//Write_DS1302(0*8E,0*00);//允許寫操作unsignedchari,addr=0*81; for(i=0;i<7;i++){ DateTime[i]=read_data(addr); addr+=2; }}//********LCD顯示子函數(shù)***********************////**********結(jié)束LCD子函數(shù)********************//voidLCD_BUSY_WAIT()//忙等待{unsignedcharstatus;TRIS_LCD_DAT=0*FF;RS=0;RW=1;do{E=1;NOP();status=PORT_LCD_DAT;E=0;}while(status&0*80);}voidWrite_LCD_mand(unsignedcharcmd)//寫LCD命令{TRIS_LCD_DAT=0*00;PORT_LCD_DAT=cmd;PORT_LCD_CTL=TRIS_LCD_CTL=0*00;RS=0;RW=0;E=1;NOP();E=0;LCD_BUSY_WAIT();}voidWrite_LCD_Data(unsignedchardat)//寫LCD寄存器數(shù)據(jù){TRIS_LCD_DAT=0*00;PORT_LCD_DAT=dat;RS=1;RW=0;E=1;NOP();E=0;LCD_BUSY_WAIT();}voidLCD_Initialize(){Write_LCD_mand(0*38);__delay_ms(2);Write_LCD_mand(0*01);__delay_ms(2);Write_LCD_mand(0*06);__delay_ms(2);Write_LCD_mand(0*0C);__delay_ms(2);}voidLCD_ShowString(unsignedcharr,unsignedcharc,char*str){unsignedchari=0;if(r==0)Write_LCD_mand(0*80|c);elseif(r==1)Write_LCD_mand(0*C0|c);for(i=0;i<16&&str[i]!='\0';i++)Write_LCD_Data(str[i]);}voiddisplay_str(unsignedcharline,unsignedcharlocation,unsignedcharstr)//line行,location列,str字符{ RS=0; RW=0; E=1; delay1ms(1); if(line==0) //line=0,第一行 PORT_LCD_DAT=0*80+location; if(line==1) //line=1,第二行 PORT_LCD_DAT=0*C0+location; E=0; LCD_BUSY_WAIT(); Write_LCD_Data(str);}voidSet_LCD_POS(unsignedcharr,unsignedcharc)//設(shè)置顯示起始位置{if(r==0)Write_LCD_mand(0*80|c);elseif(r==1)Write_LCD_mand(0*C0|c);}//********18B20子程序********////包括函數(shù):voidWait_18B20();////voiddelay15us(unsignedint*) //*必須大于0{ do {*--;} while(*); }voidreset(){ unsignedcharstate_DQ=1; while(state_DQ) { DQ_OUT(); delay15us(64); //延時(shí)721us DQ_IN(); delay15us(5); //延時(shí)61us if(DQ) state_DQ=1; //若DS18B20無應(yīng)答,循環(huán)檢查 else state_DQ=0; //檢測到DS18B20應(yīng)答低電平信號 delay15us(43); //延時(shí)490us } }voidwrite_one_byte(unsignedchardata){ unsignedchari,tmp; for(i=0;i<8;i++) { tmp=data&0*01; data>>=1; if(tmp) //tmp=1時(shí) { DQ_OUT(); NOP();NOP(); DQ_IN(); delay15us(5); //延時(shí)61us } else { DQ_OUT(); delay15us(5); //延時(shí)61us DQ_IN(); NOP();NOP(); } }}unsignedcharread_one_byte(){ unsignedchari,data; for(i=0;i<8;i++) { data>>=1; DQ_OUT(); NOP(); DQ_IN(); NOP();NOP(); if(DQ==1) data=data|0*80; delay15us(5); //延時(shí)61us } return(data); }unsignedintget_temperature(){ unsignedchartmpA,tmpB; //定義讀出RAM的高低位變量 reset(); write_one_byte(0*cc); //寫跳過ROM命令,因?yàn)榭偩€上只有一個(gè)DS18B20 write_one_byte(0*44); //啟動DS18B20溫度轉(zhuǎn)換命令 delay1ms(800); reset(); //如果再寫命令必須再次復(fù)位 write_one_byte(0*cc); //寫跳過ROM命令,因?yàn)榭偩€上只有一個(gè)DS18B20 write_one_byte(0*be); //讀部RAM中9字節(jié)的容命令 tmpA=read_one_byte(); //讀部RAM低八位溫度 tmpB=read_one_byte(); //讀部RAM高八位溫度 temper=tmpB*256+tmpA; return(temper);}voidtemp(){unsignedchartmpB,tmpA;unsignedintresults; display_str(1,10,tmp[0]);//在指定位置顯示百位/負(fù)號display_str(1,11,tmp[1]);//在指定位置顯示十位display_str(1,12,tmp[2]);//在指定位置顯示個(gè)位display_str(1,13,'.');//在指定位置顯示小數(shù)點(diǎn)位display_str(1,14,tmp[3]);//在指定位置顯示十分位位display_str(1,15,0*DF);//在指定位置顯示°display_str(1,16,'C');//在指定位置顯示C delay1ms(200); //tmp[21]...222325 results=get_temperature(); if(results>=0*1000) { results=results^0*FFFF; results++; tmpB=results/256; tmpA=(unsignedchar)results; results>>=4; tmp[0]=0*2D; //負(fù)號 } else { tmpB=results/256; //高八位 tmpA=(unsignedchar)results; //低八位 results>>=4; tmp[0]=results/100+0*30; //百 } tmp[1]=results/10%10+0*30; //十 tmp[2]=results%10+0*30; //個(gè) tmpA<<=4; tmpA>>=4; results=625*tmpA; tmp[3]=results/1000+0*30;//if(results>40)//speak=0;//song(0);}charLCD_disp_buff[17];voidpro_key_scan(){if(RB1==1) { getDateTime(); }if(RB1==0){song(0); while(RB1==ON); __delay_ms(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論