PIC單片機課程設(shè)計報告_第1頁
PIC單片機課程設(shè)計報告_第2頁
PIC單片機課程設(shè)計報告_第3頁
PIC單片機課程設(shè)計報告_第4頁
PIC單片機課程設(shè)計報告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PIC單片機課程設(shè)計報告NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY單片機課程設(shè)計報告學(xué)生姓名: 王文帥 學(xué) 號: 201214570405 學(xué) 院: 信息工程學(xué)院 專業(yè)班級: 12級電信四班 指導(dǎo)教師: 崔博 2015年06月21 日一、課程設(shè)計目的本課程設(shè)計是在PIC單片機原理及應(yīng)用及單片機C語言編程課程的基礎(chǔ)上,通過硬件設(shè)計、軟件編程及仿真調(diào)試的實踐,進一步掌握PIC單片機的應(yīng)用方法,熟練掌握PICC C語言程序的編寫與調(diào)試,是畢業(yè)設(shè)計前的一次重要實踐,為今后走上工作崗位打下堅實的單片機應(yīng)用基礎(chǔ)。二、設(shè)計題目及要求2.1 設(shè)計題目:基于

2、PIC16F877單片機的多功能電子時鐘2.2 功能實現(xiàn):實時時鐘顯示,時間可調(diào);實時溫度顯示,并具有超限報警功能。輸出顯示采用LCD1602或LED七段數(shù)碼顯示器。2.3 設(shè)計要求:自己設(shè)計硬件和程序編程,畫出完整的電路原理圖,用Multisim或Proteus仿真,最終可實現(xiàn)脫機運行。三、設(shè)計原理說明3.1 時鐘模塊DS1307是美國DALLAS公司推出的I2C總線接口實時時鐘芯片,它可獨立于CPU 工作,不受CPU主晶振及其電容的影響,且計時準(zhǔn)確,月累積誤差一般小于10秒。芯片還具有主電源掉電情況下的時鐘保護電路,DS1307的時鐘靠后備電池維持工作,拒絕CPU對其讀出和寫入訪問。同時還

3、具有備用電源自動切換控制電路,因而可在主電源掉電和其它一些惡劣環(huán)境場合中保證系統(tǒng)時鐘的定時準(zhǔn)確性。DS1307具有產(chǎn)生秒、分、時、日、月、年等功能,且具有閏年自動調(diào)整功能。同時,DS1307芯片內(nèi)部還集成有一定容量、具有掉電保護特性的靜態(tài)RAM,可用于保存一些關(guān)鍵數(shù)據(jù)。3.2 顯示模塊如用LCD1602作為顯示設(shè)備,要求顯示屏分兩行顯示,第一行顯示日期(年-月-日)和星期,第二行顯示時間(時:分:秒)和溫度。顯示秒由00一直加到59,分鐘數(shù)也由00加到59,小時采用24小時制,由00加到23,如此循環(huán)顯示。3.3 按鍵模塊按鍵用來作為時間調(diào)整。要求至少設(shè)計4個按鍵,按鍵1作為設(shè)置鍵;按鍵2、按

4、鍵3分別為增加、減少鍵,在設(shè)置鍵按下時,此兩個按鍵方有效;按鍵4是確定鍵,在設(shè)置鍵按下時方才有效。3.4 溫度采集模塊DS18B20是美國DALLAS公司推出的單總線數(shù)字溫度傳感器。DS18B20內(nèi)部集成了溫敏元件、數(shù)據(jù)轉(zhuǎn)換芯片、存儲器芯片和計算機接口芯片等多功能模塊。其主要技術(shù)特點有:具有獨特的單線接口方式;可以通過數(shù)據(jù)線供電,具有超低功耗工作方式;測溫范圍為-55125,測溫精度為0.5;溫度轉(zhuǎn)換精度912位可編程,直接將溫度轉(zhuǎn)換值以二進制數(shù)碼的方式串行輸出。四、硬件原理圖(含原理圖、電路仿真圖)時間顯示:按下溫度鍵temp后顯示溫度:五、軟件設(shè)計(含流程圖、帶注釋的程序清單)#inclu

5、de <pic.h>#include<string.h>#include<stdio.h>#define _XTAL_FREQ 1000000UL#define speak RC3#define ON 0 #define OFF 1#define DQ RB5/設(shè)置數(shù)據(jù)方向#define DQ_IN() TRISB5 = 1 /輸入#define DQ_OUT() TRISB5 =0 /輸出/DS1302引腳定義#define IO RA1#define SCLK RA0#define RST RA2/DS1302端口數(shù)據(jù)讀寫方向#define SET_IO

6、_RD() TRISA1 = 1#define SET_IO_WR() TRISA1 = 0#define LCD_CLS 0x01#define LCD_HOME 0x02#define LCD_SETMODE 0x04#define LCD_SETVISIBLE 0x08#define LCD_SHIFT 0x10#define LCD_SETFUNCTION 0x20#define LCD_SETCGADDR 0x40#define LCD_SETDDADDR 0x80#define PORT_LCD_DAT PORTD#define PORT_LCD_CTL PORTC#define

7、TRIS_LCD_DAT TRISD#define TRIS_LCD_CTL TRISC#define RS RC5#define RW RC6#define E RC7extern unsigned char DateTime;extern char WEEK4= "SUN","MON","TUS","WEN","THU","FRI","SAT"/0,1,2,3,4,5,6分別對應(yīng)周日,周一至周六/所讀取的日期時間(秒,分,時,日,月,星期,年)unsi

8、gned int temper;unsigned int settempe = 570 ;unsigned char DateTime 7;unsigned char tmp="0000"/向DS1302寫入一個字節(jié)unsigned char RB1_FLAG = 0;const unsigned char tone=108,102,91,86,77,68,61,57;/發(fā)聲的頻率常數(shù)void delay18us(unsigned char x)/18us,每次加1,增加9usunsigned char i;for(;x>0;x-) for(i=0;i<1;i+

9、); void delay1ms(unsigned int x)unsigned char i;for(;x>0;x-)for(i=0;i<165;i+);void write_byte_to_DS1302(unsigned char x) unsigned char i; SET_IO_WR(); for(i=0x01; i !=0x00; i <<= 1)if (x & i) IO = 1; else IO =0;SCLK = 0; SCLK =1; _delay_us(10);/從DS1302讀取1字節(jié)unsigned char get_byte_form

10、_DS1302() unsigned char i,dat =0x00; SET_IO_RD(); for(i = 0; i < 8; i+) SCLK = 1; SCLK=0; if(IO) dat |= (0x01<<i); _delay_us(10); return (dat>>4)*10 + (dat&0x0F);/從DS1302指定位置讀數(shù)據(jù)unsigned char read_data(unsigned char addr) unsigned char dat; RST = 1; write_byte_to_DS1302(addr); dat

11、= get_byte_form_DS1302(); RST = 0; return dat;/向DS1302指定地址寫數(shù)據(jù)void Write_DS1302(unsigned char addr,unsigned char dat) RST = 1;write_byte_to_DS1302(addr); write_byte_to_DS1302(dat); RST = 0;void port_init()ADCON1 = 0X06; /RA設(shè)置為普通IO口TRISA = 0X00; /端口A設(shè)置為輸出OPTION = 0X00; /端口B弱上拉使能TRISB = 0xFF; PORTC = 0

12、X00; TRISC = 0X00; /端口C設(shè)置為輸出 PORTD = 0X00;TRISD = 0X00; /端口D設(shè)置為輸出 speak=0; void song(unsigned char x)unsigned char i,j;for(i=0;i<60;i+)for(j=0;j<3;j+)speak = 1;delay18us(tonex);speak = 0; /翻轉(zhuǎn)發(fā)聲delay18us(tonex);void keyscan()unsigned char a ,b ; DateTime0=0; Write_DS1302(0x8E,0x00); / Write_DS1

13、302(0x80,0x80); / if(RB2=0) /小時+1DateTime2 = DateTime2+1; /第三個元素小時+1if(DateTime2 = 24) DateTime2= 0;/當(dāng)變?yōu)?4H時,小時位歸零a = DateTime2/10*16+DateTime2%10; /變成16進制數(shù)據(jù)Write_DS1302(0x84,a); if(RB3=0)DateTime1 = DateTime1+1; /第二個元素分鐘+1if(DateTime1 = 60) DateTime1= 0;/當(dāng)變?yōu)?0min時,小時位歸零b = DateTime1/10*16+DateTime1

14、%10; /變成16進制數(shù)據(jù)Write_DS1302(0x82,b);if(RB4=0)song(3);while(RB4 = ON);Write_DS1302(0x80,0x00); / 調(diào)整完畢后啟動時鐘運行Write_DS1302(0x8E,0x00); / 禁止寫RB1_FLAG = 0; / 將RB1按下后產(chǎn)生的標(biāo)志清除 /DS1302初始化void init_DS1302() unsigned char second_REG; second_REG = read_data(0x81); /讀取秒寄存器當(dāng)前值 /如果高位CH為1,則表示當(dāng)前DS1302振蕩器出于待機狀態(tài) /這時需要將

15、CH(clock halt flag)位設(shè)為0,打開振蕩器使時鐘運行 if (second_REG & 0x80) = 0x80) Write_DS1302(0x8E,0x00) ; /寫控制字節(jié),取消寫保護 Write_DS1302(0x80,second_REG & 0x7F) ; /0x80地址不變,設(shè)高位CH=0 Write_DS1302(0x8E,0x80) ; /加保護 /讀取當(dāng)前日期void getDateTime() /Write_DS1302(0x8E,0x00); /允許寫操作 unsigned char i, addr = 0x81;for (i=0; i

16、<7; i+) DateTimei = read_data(addr);addr +=2;/*LCD顯示子函數(shù)*/*結(jié)束LCD子函數(shù)*/ void LCD_BUSY_WAIT() /忙等待 unsigned char status; TRIS_LCD_DAT = 0xFF; RS = 0; RW = 1; do E =1; NOP(); status = PORT_LCD_DAT; E = 0; while (status & 0x80);void Write_LCD_Command(unsigned char cmd) /寫LCD命令TRIS_LCD_DAT = 0x00;PO

17、RT_LCD_DAT = cmd;PORT_LCD_CTL = TRIS_LCD_CTL = 0x00;RS = 0;RW = 0;E = 1 ;NOP();E = 0 ;LCD_BUSY_WAIT();void Write_LCD_Data(unsigned char dat) /寫LCD寄存器數(shù)據(jù)TRIS_LCD_DAT = 0x00;PORT_LCD_DAT = dat;RS = 1;RW = 0;E = 1 ;NOP();E = 0;LCD_BUSY_WAIT();void LCD_Initialize()Write_LCD_Command(0x38); _delay_ms(2);Wr

18、ite_LCD_Command(0x01);_delay_ms(2);Write_LCD_Command(0x06);_delay_ms(2);Write_LCD_Command(0x0C);_delay_ms(2);void LCD_ShowString(unsigned char r, unsigned char c, char *str)unsigned char i = 0;if(r = 0) Write_LCD_Command(0x80 | c); elseif(r = 1) Write_LCD_Command(0xC0 | c);for (i = 0; i < 16 &

19、;& stri!= '0' i+)Write_LCD_Data(stri);void display_str(unsigned char line,unsigned char location,unsigned char str)/line行,location列,str字符RS=0;RW=0;E=1;delay1ms(1);if (line=0) /line=0,第一行PORT_LCD_DAT=0x80+location;if (line=1) /line=1,第二行PORT_LCD_DAT=0xC0+location; E=0;LCD_BUSY_WAIT() ;Wri

20、te_LCD_Data(str);void Set_LCD_POS(unsigned char r,unsigned char c) /設(shè)置顯示起始位置if(r = 0) Write_LCD_Command(0x80 | c); elseif(r = 1) Write_LCD_Command(0xC0 | c);/*18B20子程序*/包括函數(shù):void Wait_18B20();/void delay15us(unsigned int x)/x必須大于0dox-;while(x);void reset()unsigned char state_DQ=1;while(state_DQ)DQ_O

21、UT();delay15us(64);/延時721usDQ_IN();delay15us(5);/延時61usif (DQ)state_DQ=1;/若DS18B20無應(yīng)答,循環(huán)檢查elsestate_DQ=0;/檢測到DS18B20應(yīng)答低電平信號delay15us(43);/延時490usvoid write_one_byte(unsigned char data)unsigned char i,tmp;for(i=0;i<8;i+)tmp=data&0x01;data>>=1;if (tmp)/tmp=1時DQ_OUT();NOP();NOP();DQ_IN();d

22、elay15us(5);/延時61uselseDQ_OUT();delay15us(5);/延時61usDQ_IN();NOP();NOP();unsigned char read_one_byte()unsigned char i,data;for(i=0;i<8;i+)data>>=1;DQ_OUT();NOP();DQ_IN();NOP();NOP();if (DQ=1)data=data|0x80;delay15us(5);/延時61usreturn(data);unsigned int get_temperature()unsigned char tmpA,tmpB

23、;/定義讀出RAM的高低位變量reset();write_one_byte(0xcc);/寫跳過ROM命令,因為總線上只有一個DS18B20write_one_byte(0x44);/啟動DS18B20溫度轉(zhuǎn)換命令delay1ms(800);reset();/如果再寫命令必須再次復(fù)位write_one_byte(0xcc);/寫跳過ROM命令,因為總線上只有一個DS18B20write_one_byte(0xbe);/讀內(nèi)部RAM中9字節(jié)的內(nèi)容命令tmpA=read_one_byte();/讀內(nèi)部RAM 低八位溫度tmpB=read_one_byte();/讀內(nèi)部RAM 高八位溫度temper

24、=tmpB*256+tmpA;return(temper);void temp () unsigned char tmpB,tmpA; unsigned int results;display_str(1,10,tmp0); /在指定位置顯示百位/負號 display_str(1,11,tmp1); /在指定位置顯示十位 display_str(1,12,tmp2); /在指定位置顯示個位 display_str(1,13,'.'); /在指定位置顯示小數(shù)點位 display_str(1,14,tmp3); /在指定位置顯示十分位位 display_str(1,15,0XDF)

25、; /在指定位置顯示° display_str(1,16,'C'); /在指定位置顯示Cdelay1ms(200);/tmp21. 22 23 25 results=get_temperature();if(results>=0x1000)results=results0xFFFF;results+;tmpB=results/256;tmpA=(unsigned char)results;results>>=4;tmp0=0x2D;/負號elsetmpB=results/256;/高八位tmpA=(unsigned char)results;/低八位

26、results>>=4;tmp0=results/100+0x30;/百tmp1=results/10%10+0x30;/十tmp2=results%10+0x30;/個tmpA<<=4;tmpA>>=4;results=625*tmpA;tmp3=results/1000+0x30; /if (results>40) /speak = 0; /song(0); char LCD_disp_buff17;void pro_key_scan()if(RB1 = 1)getDateTime(); if(RB1= 0) song(0);while(RB1 = ON);_delay_ms(10); /if(RB1=0)/while(!

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論