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頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY單片機(jī)課程設(shè)計(jì)報(bào)告學(xué)生姓名: 王文帥 學(xué) 號(hào): 201214570405 學(xué) 院: 信息工程學(xué)院 專業(yè)班級(jí): 12級(jí)電信四班 指導(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)用方法,熟練掌握PICC C語言程序的編寫與調(diào)試,是畢業(yè)設(shè)計(jì)前的一次重要實(shí)踐,為今后走上工作崗位打下堅(jiān)實(shí)的單片機(jī)應(yīng)用基礎(chǔ)。二、設(shè)計(jì)題目及要求2.1 設(shè)計(jì)題目:基于PIC16F877單片機(jī)

2、的多功能電子時(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是美國(guó)DALLAS公司推出的I2C總線接口實(shí)時(shí)時(shí)鐘芯片,它可獨(dú)立于CPU 工作,不受CPU主晶振及其電容的影響,且計(jì)時(shí)準(zhǔn)確,月累積誤差一般小于10秒。芯片還具有主電源掉電情況下的時(shí)鐘保護(hù)電路,DS1307的時(shí)鐘靠后備電池維持工作,拒絕CPU對(duì)其讀出和寫入訪問。同時(shí)還具有備用電源自動(dòng)切換控制

3、電路,因而可在主電源掉電和其它一些惡劣環(huán)境場(chǎng)合中保證系統(tǒng)時(shí)鐘的定時(shí)準(zhǔn)確性。DS1307具有產(chǎn)生秒、分、時(shí)、日、月、年等功能,且具有閏年自動(dòng)調(diào)整功能。同時(shí),DS1307芯片內(nèi)部還集成有一定容量、具有掉電保護(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分別為增加、減少鍵,

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

5、>#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_RD() TRISA1

6、 = 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 TRIS_LCD_DAT

7、 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分別對(duì)應(yīng)周日,周一至周六/所讀取的日期時(shí)間(秒,分,時(shí),日,月,星期,年)unsigned int tem

8、per;unsigned int settempe = 570 ;unsigned char DateTime 7;unsigned char tmp="0000"/向DS1302寫入一個(gè)字節(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+); void dela

9、y1ms(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_DS1302() un

10、signed 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 = get_byte_f

11、orm_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 = 0X00; TRISC =

12、 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_DS1302(0x80,0x8

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

14、數(shù)據(jù)Write_DS1302(0x82,b);if(RB4=0)song(3);while(RB4 = ON);Write_DS1302(0x80,0x00); / 調(diào)整完畢后啟動(dòng)時(shí)鐘運(yùn)行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振蕩器出于待機(jī)狀態(tài) /這時(shí)需要將CH(clock hal

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

16、ateTimei = 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;PORT_LCD_DAT =

17、 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);Write_LCD_Comm

18、and(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 && stri!

19、= '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() ;Write_LCD_Data(

20、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_OUT();delay15

21、us(64);/延時(shí)721usDQ_IN();delay15us(5);/延時(shí)61usif (DQ)state_DQ=1;/若DS18B20無應(yīng)答,循環(huán)檢查elsestate_DQ=0;/檢測(cè)到DS18B20應(yīng)答低電平信號(hào)delay15us(43);/延時(shí)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時(shí)DQ_OUT();NOP();NOP();DQ_IN();delay15us(5);

22、/延時(shí)61uselseDQ_OUT();delay15us(5);/延時(shí)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);/延時(shí)61usreturn(data);unsigned int get_temperature()unsigned char tmpA,tmpB;/定義讀出RAM的高低

23、位變量reset();write_one_byte(0xcc);/寫跳過ROM命令,因?yàn)榭偩€上只有一個(gè)DS18B20write_one_byte(0x44);/啟動(dòng)DS18B20溫度轉(zhuǎn)換命令delay1ms(800);reset();/如果再寫命令必須再次復(fù)位write_one_byte(0xcc);/寫跳過ROM命令,因?yàn)榭偩€上只有一個(gè)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=tmpB*256+tm

24、pA;return(temper);void temp () unsigned char tmpB,tmpA; unsigned int results;display_str(1,10,tmp0); /在指定位置顯示百位/負(fù)號(hào) display_str(1,11,tmp1); /在指定位置顯示十位 display_str(1,12,tmp2); /在指定位置顯示個(gè)位 display_str(1,13,'.'); /在指定位置顯示小數(shù)點(diǎn)位 display_str(1,14,tmp3); /在指定位置顯示十分位位 display_str(1,15,0XDF); /在指定位置顯示&#

25、176; 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;/負(fù)號(hào)elsetmpB=results/256;/高八位tmpA=(unsigned char)results;/低八位results>&

26、gt;=4;tmp0=results/100+0x30;/百tmp1=results/10%10+0x30;/十tmp2=results%10+0x30;/個(gè)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)/whi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論