電子裝置與系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)報(bào)告_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  電子裝置與系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)</p><p>  學(xué)院: 信息電子學(xué)院 </p><p>  班級: 08電子信息工程 </p><p><b>  目錄</b></p><p>  1、課程設(shè)計(jì)目的………………………………………………………………3</p>&l

2、t;p>  2、課程設(shè)計(jì)工具及題目………………………………………………………3</p><p>  2.1、課程設(shè)計(jì)工具…………………………………………………...……3</p><p>  2.2、課程設(shè)計(jì)題目……………………………………………...…………3</p><p>  3、課程設(shè)計(jì)內(nèi)容、步驟及電路原理圖………………………………………3</p

3、><p>  3.1、課程設(shè)計(jì)內(nèi)容………………………………………………………..3</p><p>  3.2、課程設(shè)計(jì)步驟………………………………………………………..3</p><p>  3.3、整個(gè)系統(tǒng)的電路原理圖……………………………………………..4</p><p>  4、課程設(shè)計(jì)各模塊工作原理…………………………………………………

4、5</p><p>  4.1、紅外心率計(jì)模塊.……………………………………………………...5</p><p>  4.1.1、負(fù)電源變換電路………………………………………………5</p><p>  4.1.2、血液波動(dòng)檢測電路……............................................................6</

5、p><p>  4.1.3、放大、整形、濾波電路…………………………………........7</p><p>  4.2、PIC單片機(jī)檢測并顯示模塊…………………………………………8</p><p>  4.2.1、定時(shí)器初始化及中斷函數(shù)…………………………………....8</p><p>  4.2.2、數(shù)脈沖個(gè)數(shù)程序…………………………………

6、…………....9</p><p>  4.2.3、數(shù)碼管顯示程序………...……………………………………10</p><p>  4.2.4、延時(shí)子程序…….……………………………………………...11</p><p>  4.2.5、ds18b20溫度采集程序………………………………………..11</p><p>  5、課程設(shè)計(jì)心得……

7、………………………………………………………....14</p><p>  6、參考文獻(xiàn)…………………………………………………………………....15</p><p>  7、附錄:源程序代碼及注釋…………………………………………………16</p><p>  課程設(shè)計(jì)目的:單片機(jī)具有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說,智能控制與自動(dòng)控制的核心就是單片機(jī)

8、。目前,一個(gè)學(xué)習(xí)與應(yīng)用單片機(jī)的高潮在全社會大規(guī)模地興起。學(xué)習(xí)單片機(jī)的最有效方法就是理論與實(shí)踐并重。系統(tǒng)地運(yùn)用已學(xué)的理論知識解決實(shí)際問題的能力和查閱資料的能力。培養(yǎng)一定的自學(xué)能力和獨(dú)立分析問題、解決問題的能力,能通過獨(dú)立思考、查閱工具書、參考文獻(xiàn),尋找解決方案;</p><p>  課程設(shè)計(jì)工具及題目: </p><p>  1、課程設(shè)計(jì)工具:PC機(jī)、PIC單片機(jī)最小系統(tǒng)、紅外心率計(jì)模塊&l

9、t;/p><p>  2、課程設(shè)計(jì)題目:基于PIC單片機(jī)的脈搏檢測</p><p>  課程設(shè)計(jì)內(nèi)容、步驟及電路原理圖</p><p>  1、學(xué)習(xí)PCB畫圖,選好課題,即脈搏檢測。購買元器件材料,焊接PIC最小系統(tǒng)版,搭建心率計(jì)模塊,然后由心率計(jì)模塊產(chǎn)生方波,用PIC單片機(jī)數(shù)出一分鐘的脈沖個(gè)數(shù),然后在數(shù)碼管上顯示出來,即為脈搏。</p><p>

10、;  2、首先根據(jù)最小系統(tǒng)版的原理圖,搭建好電路,調(diào)試下載線是否可以下載,復(fù)位開關(guān)是否可以工作。調(diào)試成功之后,開始搭建心率計(jì)模塊,搭建好心率計(jì)模塊之后,開始檢測是否可以產(chǎn)生方波,用手指按在傳感器上,然后用示波器觀察是否出現(xiàn)方波脈沖。調(diào)試成功之后,就編寫相應(yīng)的程序,燒寫進(jìn)單片機(jī)中,然后就可以檢測相應(yīng)的脈搏了。</p><p>  3、紅外心率計(jì)模塊電路圖</p><p>  4、PIC單片機(jī)

11、最小系統(tǒng)原理圖</p><p>  各功能模塊的工作原理:</p><p><b>  紅外心率計(jì)模塊</b></p><p><b>  單元電路的工作原理</b></p><p><b>  ⑴ 負(fù)電源變換電路</b></p><p>  負(fù)電源變換

12、電路的作用是把+12V直流電變成-10V左右的直流電壓,-10V 電壓與+12V作為運(yùn)算放大器的電源。負(fù)電源變換電路如圖2所示,其中IC1(CD4069)為六非門集成電路,它的內(nèi)部結(jié)構(gòu)圖如圖3(a)所示。</p><p>  負(fù)電源變換電路工作原理:通電的瞬間,假設(shè)A點(diǎn)是低電位,則B點(diǎn)是高電位,C點(diǎn)是低電位,D點(diǎn)是高電位。B點(diǎn)的高電位通過R19給C7充電,當(dāng)F點(diǎn)的電壓高于IC1(CD4049)的電平轉(zhuǎn)換電壓時(shí),B

13、點(diǎn)輸出低電位,C點(diǎn)(C7一端)輸出高電位,由于電容兩端的電壓不能突變,所以C7兩端的電壓通過R19放電。當(dāng)F點(diǎn)電壓低于IC1的轉(zhuǎn)換電壓時(shí),B點(diǎn)輸出高電位,此高電位通過R19對C7充電,如此循環(huán)。C點(diǎn)得到方波,經(jīng)過后面四個(gè)反相器反相、擴(kuò)流后,在D點(diǎn)得到方波。</p><p>  當(dāng)D點(diǎn)是高電平的時(shí)候,V1導(dǎo)通C8被充電,大約充到11V左右,當(dāng)D點(diǎn)變成低電平的時(shí)候,由于C8兩端電壓不能突變,G點(diǎn)電壓被拉到-11V左右

14、,此時(shí)V2導(dǎo)通, C9反方向進(jìn)行充電,使E點(diǎn)電壓達(dá)到-10V左右。由于帶負(fù)載的能力不強(qiáng),當(dāng)帶上負(fù)載后,E點(diǎn)電壓大約降到9V左右。</p><p><b>  圖2 電源電路</b></p><p>  (a) CD4049 (b) LM741</p><p> 

15、 圖3 集成電路的結(jié)構(gòu)圖</p><p>  ⑵ 血液波動(dòng)檢測電路</p><p>  血液波動(dòng)檢測電路首先通過紅外光電傳感器把血液中波動(dòng)的成分檢測出來,然后通過電容器耦合到放大器的輸入端。如圖4所示。</p><p>  圖4 血液波動(dòng)檢測電路</p><p>  TCRT5000紅外光電傳感器的檢測方法:</p><

16、;p>  首先用數(shù)字萬用表的二極管檔位正向壓降測試控制端發(fā)射管(淺藍(lán)色)的正、負(fù)極,將紅黑表筆分別接發(fā)射管的兩個(gè)引腳,正反各測一次,表頭一次顯示“1.05(0.9-1.1)”,一次顯示溢出值“-1”,則顯示1.05V的那次正確,紅表筆接的是正極,黑表筆接的是負(fù)極。若兩次都顯示“1”,說明發(fā)射管內(nèi)部開路,若兩次都顯示“0”發(fā)射管內(nèi)不短路。然后再判斷接收管的C、E極和光電轉(zhuǎn)換效率,方法如下:將發(fā)射管的正負(fù)極分別插入數(shù)字萬用表hFE檔N

17、PN型的C、E插孔,再將模擬萬用表打到R×1kΩ檔。紅黑表筆分別接接收管的兩個(gè)引腳,若表針不動(dòng),則紅黑表筆對調(diào),若表針向右偏轉(zhuǎn)到15kΩ左右,則黑表筆所接管腳為C,紅表筆所接管腳為E。此時(shí),再用手指或白紙貼近兩管上方,表針繼續(xù)向右偏轉(zhuǎn)至1kΩ以內(nèi),說明該紅外光電斷續(xù)器的光電轉(zhuǎn)換效率高。</p><p>  血液波動(dòng)檢測電路工作原理:TCRT5000是集紅外線發(fā)射管、接收管為一體的器件,工作時(shí)把探頭貼在手

18、指上,力度要適中。紅外線發(fā)射管發(fā)出的紅外線穿過動(dòng)脈血管經(jīng)手指指骨反射回來,反射回來的信號強(qiáng)度隨著血液流動(dòng)的變化而變化,接收管把反射回來的光信號變成微弱的電信號,并通過C1耦合到放大器。</p><p> ?、?放大、整形、濾波電路</p><p>  放大、整形、濾波電路是把傳感起檢測到的微弱電信號進(jìn)行放大、整形、濾波,最后輸出反映心跳頻率的方波,如圖5所示。其中LM741為高精度單運(yùn)放電

19、路,它們的引腳功能如圖3 (b)所示。IC2、IC3、IC4都為LM741。</p><p>  圖5 信號放大、整形電路</p><p>  因?yàn)閭鞲衅魉蛠淼男盘柗戎挥?~5毫伏,要放大到10V左右才能作為計(jì)數(shù)器的輸入脈沖。因此放大倍數(shù)設(shè)計(jì)在4000倍左右。兩級放大器都接成反相比例放大器的電路,經(jīng)過兩級放大、反相后的波形是跟輸入波形同相、且放大了的波形。放大后的波形是一個(gè)交流信號。其中

20、A1、A2的供電方式是正負(fù)電源供電,電源為+12V、-10V。</p><p>  A1、A2與周圍元件組成二級放大電路,放大倍數(shù)Auf為:</p><p>  由于放大后的波形是一個(gè)交流信號,而計(jì)數(shù)器需要的是單方向的直流脈沖信號。所以經(jīng)過V3檢波后變成單方向的直流脈沖信號,并把檢波后的信號送到RC兩階濾波電路,濾波電路的作用是濾除放大后的干擾信號。R9、V4組成傳感器工作指示電路,當(dāng)傳感

21、器接收到心跳信號時(shí),V4就會按心跳的強(qiáng)度而改變亮度,因此V4正常工作時(shí)是按心跳的頻率閃爍。直流脈沖信號濾波后送入A3的同相輸入端,反相輸入端接一個(gè)固定的電平,A3是作為一個(gè)電壓比較器來工作的,是單電源供電。當(dāng)A3的3腳電壓高于2腳電壓的時(shí)候,6腳輸出高電平;當(dāng)A3的3腳電壓低于2腳電壓的時(shí)候,6腳輸出低電平,所以A3輸出一個(gè)反應(yīng)心跳頻率的方波信號。</p><p>  PIC單片機(jī)檢測并顯示模塊</p>

22、;<p>  定時(shí)器,定時(shí)1s實(shí)現(xiàn)60秒的計(jì)時(shí)功能,用于檢測的時(shí)間,并在數(shù)碼管上顯示出來。相應(yīng)的初始化程序?yàn)椋?lt;/p><p>  void time1_rtc_init(void)</p><p><b>  {</b></p><p>  INTCON = 0x20; //disable glob

23、al and enable TMR0 interrupt</p><p>  INTCON2 = 0x84; //TMR0 high priority</p><p>  RCONbits.IPEN = 1; //enable priority levels</p><p>  TMR0H = 100;

24、 //clear timer</p><p>  TMR0L = 0; //clear timer</p><p>  T0CON = 0x85; //set up timer0 - prescaler 1:64</p><p>  INTCONbits.GIEH = 1;

25、 //enable interrupts</p><p><b>  }</b></p><p>  定時(shí)器的中斷函數(shù)為:</p><p>  #pragma code InterruptVectorHigh = 0x08</p><p><b>  void</b></p&

26、gt;<p>  InterruptVectorHigh (void)</p><p><b>  {</b></p><p><b>  _asm</b></p><p>  goto InterruptHandlerHigh //jump to interrupt routine</p>&

27、lt;p><b>  _endasm</b></p><p><b>  }</b></p><p>  #pragma code</p><p>  #pragma interrupt InterruptHandlerHigh</p><p>  void InterruptHandlerH

28、igh ()</p><p><b>  {</b></p><p>  if(INTCONbits.TMR0IF)</p><p>  { //check for TMR0 overflow</p><p>  INTCONbits.TMR0IF =

29、0; //clear interrupt flag</p><p>  second++; //indicate timeout</p><p>  if(second == 60)</p><p><b>  { </b></p><p>  second = 0;</

30、p><p>  result = 1;</p><p><b>  }</b></p><p>  //if(result != 1)</p><p>  //led = ~led;</p><p><b>  }</b></p><p><b

31、>  }</b></p><p>  由RB0采集脈搏的方波,計(jì)數(shù)方波個(gè)數(shù),并在60秒后顯示在數(shù)碼管上。</p><p>  #define pulse PORTBbits.RB0</p><p>  采用上升沿觸發(fā)來實(shí)現(xiàn)計(jì)數(shù)功能,從而實(shí)現(xiàn)了計(jì)數(shù)方波的個(gè)數(shù)的功能。</p><p>  if(INTCONbits.INT0IF

32、 == 1)</p><p><b>  {</b></p><p>  INTCONbits.INT0IF = 0;</p><p>  delay_ms(100);</p><p><b>  fre++;</b></p><p><b>  }</b&g

33、t;</p><p>  位選和段選的數(shù)值和數(shù)碼管的顯示程序如下:</p><p>  const unsigned table[10]=</p><p>  {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; </p><p>  const unsigned bit_set[4]={

34、0xFE,0xFD, 0xFB, 0xF7};</p><p>  void display(int time)</p><p><b>  { </b></p><p>  PORTC = table[time % 10];</p><p>  PORTD = bit_set[3];</p><p&

35、gt;  delay_ms(20);</p><p>  PORTC = table[(time / 10) % 10];</p><p>  PORTD = bit_set[2];</p><p>  delay_ms(20);</p><p>  PORTC = table[time / 100];</p><p&g

36、t;  PORTD = bit_set[1];</p><p>  delay_ms(20);</p><p><b>  }</b></p><p>  顯示帶小數(shù)位的,代碼如下:</p><p>  void display1(int time)</p><p><b>  { &l

37、t;/b></p><p>  PORTC = table[time % 10];</p><p>  PORTD = bit_set[3];</p><p>  delay_ms(10);</p><p>  PORTC = table1[(time / 10 )% 10];</p><p>  PORTD =

38、 bit_set[2];</p><p>  delay_ms(10);</p><p>  PORTC = table[(time)/ 100];</p><p>  PORTD = bit_set[1];</p><p>  delay_ms(10);</p><p><b>  }</b>

39、</p><p><b>  延時(shí)子程序如下:</b></p><p>  void delay_ms(unsigned int time)</p><p><b>  {</b></p><p><b>  int n;</b></p><p>  f

40、or(;time>0;time--)</p><p><b>  {</b></p><p>  for(n = 0; n < 50; n++);</p><p><b>  }</b></p><p><b>  }</b></p><p>

41、;  DS18B20溫度采集程序如下:</p><p>  void dsreset(void) //18B20復(fù)位,初始化函數(shù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  TRISB = 1;</p><p

42、><b>  ds=0;</b></p><p><b>  i=103;</b></p><p>  while(i>0)i--;</p><p><b>  ds=1;</b></p><p><b>  i=4;</b></p>

43、;<p>  while(i>0)i--;</p><p><b>  }</b></p><p>  char tempreadbit(void) //讀1位函數(shù)</p><p><b>  {</b></p><p><b>  int i;</b>

44、</p><p><b>  char dat;</b></p><p>  TRISB = 1;</p><p>  ds=0;i++; //i++ 起延時(shí)作用</p><p>  ds=1;i++;i++;</p><p>  TRISB = 3;</p>&l

45、t;p><b>  dat=ds;</b></p><p>  i=8;while(i>0)i--;</p><p>  return (dat);</p><p><b>  }</b></p><p>  char tempread(void) //讀1個(gè)字節(jié)</p>

46、<p><b>  {</b></p><p>  char i,j,dat;</p><p><b>  dat=0;</b></p><p>  for(i=1;i<=8;i++)</p><p><b>  {</b></p><p

47、>  j=tempreadbit();</p><p>  dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里</p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }&

48、lt;/b></p><p>  void tempwritebyte(char dat) //向18B20寫一個(gè)字節(jié)數(shù)據(jù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p><b>  char j;</b>&l

49、t;/p><p>  char testb;</p><p>  for(j=1;j<=8;j++)</p><p><b>  {</b></p><p>  testb=dat&0x01;</p><p>  dat=dat>>1;</p><p>

50、;  if(testb) //寫 1</p><p><b>  {</b></p><p>  TRISB = 1;</p><p><b>  ds=0;</b></p><p><b>  i++;i++;</b></p><p><

51、b>  ds=1;</b></p><p>  i=8;while(i>0)i--;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p> 

52、 TRISB = 1;</p><p>  ds=0; //寫 0</p><p>  i=8;while(i>0)i--;</p><p><b>  ds=1;</b></p><p><b>  i++;i++;</b></p><p><b&g

53、t;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void tempchange(void) //DS18B20 開始獲取溫度并轉(zhuǎn)換</p><p><b>  {</b></p>

54、<p>  dsreset();</p><p>  delay_ms(1);</p><p>  tempwritebyte(0xcc); // 寫跳過讀ROM指令</p><p>  tempwritebyte(0x44); // 寫溫度轉(zhuǎn)換指令</p><p><b>  }</b></p&g

55、t;<p>  int get_temp() //讀取寄存器中存儲的溫度數(shù)據(jù)</p><p><b>  {</b></p><p><b>  char a,b;</b></p><p>  dsreset();</p><p>  delay_ms(1);</

56、p><p>  tempwritebyte(0xcc);</p><p>  tempwritebyte(0xbe);</p><p>  a=tempread(); //讀低8位</p><p>  b=tempread(); //讀高8位</p><p><b>  temp=

57、b;</b></p><p>  temp<<=8; //兩個(gè)字節(jié)組合為1個(gè)字</p><p>  temp=temp|a;</p><p>  f_temp=temp*0.0625; //溫度在寄存器中為12位 分辨率位0.0625°</p><p>  temp=f_tem

58、p*10+0.5; //乘以10表示小數(shù)點(diǎn)后面只取1位,加0.5是四舍五入</p><p>  f_temp=f_temp+0.05; </p><p>  return temp; //temp是整型</p><p><b>  }</b></p><p><b>  課程設(shè)計(jì)心得<

59、;/b></p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 郭天祥。新概念51單片機(jī)C語言教程[M] 2009.12</p><p>  [1] 孫安青。PIC單片機(jī)使用C語言程序設(shè)計(jì)與典型實(shí)例[M] 2008.06</p><p>  附錄:源程序代碼及注釋</p><

60、p>  #include <p18F452.h></p><p>  #define pulse PORTBbits.RB0</p><p>  #define ds PORTBbits.RB1</p><p>  void delay_ms(unsigned int time); </p><p>  const u

61、nsigned char table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; </p><p>  const unsigned char table1[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; </p><p>  const unsigne

62、d bit_set[4]={0xFE,0xFD, 0xFB, 0xF7};</p><p>  void time1_rtc_init(void);</p><p>  void timer1_rtc_isr(void);</p><p>  void InterruptHandlerHigh (void);</p><p>  void d

63、isplay(int time);</p><p>  void display1(int time);</p><p>  void main(void);</p><p>  int second, flag, fre, result, temp, count;</p><p>  float f_temp;</p><

64、;p>  void dsreset(void) //18B20復(fù)位,初始化函數(shù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  TRISB = 0xf1;</p><p><b>  ds=0;</b>&

65、lt;/p><p><b>  i=103;</b></p><p>  while(i>0)i--;</p><p><b>  ds=1;</b></p><p><b>  i=4;</b></p><p>  while(i>0)i--;

66、</p><p><b>  }</b></p><p>  char tempreadbit(void) //讀1位函數(shù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p><b> 

67、 char dat;</b></p><p>  TRISB = 0xf1;</p><p>  ds=0;i++; //i++ 起延時(shí)作用</p><p>  ds=1;i++;i++;</p><p>  TRISB = 0xf3;</p><p><b>  dat=ds;

68、</b></p><p>  i=8;while(i>0)i--;</p><p>  return (dat);</p><p><b>  }</b></p><p>  char tempread(void) //讀1個(gè)字節(jié)</p><p><b>  {&l

69、t;/b></p><p>  char i,j,dat;</p><p><b>  dat=0;</b></p><p>  for(i=1;i<=8;i++)</p><p><b>  {</b></p><p>  j=tempreadbit();<

70、;/p><p>  dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里</p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b></p><

71、p>  void tempwritebyte(char dat) //向18B20寫一個(gè)字節(jié)數(shù)據(jù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p><b>  char j;</b></p><p>  char

72、 testb;</p><p>  for(j=1;j<=8;j++)</p><p><b>  {</b></p><p>  testb=dat&0x01;</p><p>  dat=dat>>1;</p><p>  if(testb) //寫 1<

73、;/p><p><b>  {</b></p><p>  TRISB = 0xf1;</p><p><b>  ds=0;</b></p><p><b>  i++;i++;</b></p><p><b>  ds=1;</b>

74、</p><p>  i=8;while(i>0)i--;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  TRISB = 0xf1;</p&g

75、t;<p>  ds=0; //寫 0</p><p>  i=8;while(i>0)i--;</p><p><b>  ds=1;</b></p><p><b>  i++;i++;</b></p><p><b>  }</b><

76、/p><p><b>  }</b></p><p><b>  }</b></p><p>  void tempchange(void) //DS18B20 開始獲取溫度并轉(zhuǎn)換</p><p><b>  {</b></p><p>  dsreset

77、();</p><p>  delay_ms(1);</p><p>  tempwritebyte(0xcc); // 寫跳過讀ROM指令</p><p>  tempwritebyte(0x44); // 寫溫度轉(zhuǎn)換指令</p><p><b>  }</b></p><p>  int

78、get_temp() //讀取寄存器中存儲的溫度數(shù)據(jù)</p><p><b>  {</b></p><p><b>  char a,b;</b></p><p>  dsreset();</p><p>  delay_ms(1);</p><p>  t

79、empwritebyte(0xcc);</p><p>  tempwritebyte(0xbe);</p><p>  a=tempread(); //讀低8位</p><p>  b=tempread(); //讀高8位</p><p><b>  temp=b;</b></p&

80、gt;<p>  temp<<=8; //兩個(gè)字節(jié)組合為1個(gè)字</p><p>  temp=temp|a;</p><p>  f_temp=temp*0.0625; //溫度在寄存器中為12位 分辨率位0.0625°</p><p>  temp=f_temp*10+0.5; //乘以10

81、表示小數(shù)點(diǎn)后面只取1位,加0.5是四舍五入</p><p>  f_temp=f_temp+0.05; </p><p>  return temp; //temp是整型</p><p><b>  }</b></p><p>  void main (void)</p><p>

82、<b>  {</b></p><p>  second = 0;</p><p>  TRISC = 0; /* configure PORTD for output */</p><p>  TRISD = 0;</p><p>  TRISB = 0xf1;</p><p>  time

83、1_rtc_init();</p><p><b>  flag = 0;</b></p><p>  fre = 0;</p><p>  result = 0;</p><p>  count = 0;</p><p><b>  while(1)</b></p

84、><p><b>  {</b></p><p>  /*if(flag == 1 && pulse == 1)</p><p><b>  {</b></p><p><b>  fre+=2;</b></p><p><b>

85、  flag = 0;</b></p><p><b>  }</b></p><p>  else if(pulse == 0 && flag == 0)</p><p><b>  {</b></p><p><b>  flag = 1;</b>

86、;</p><p><b>  } */</b></p><p>  if(result != 1)</p><p>  display(second);</p><p><b>  else</b></p><p><b>  {</b></p&

87、gt;<p><b>  while(1)</b></p><p><b>  {</b></p><p>  tempchange();</p><p>  temp = get_temp(); //采集溫度</p><p><b>  count++;</b

88、></p><p>  if(count == 201) count = 0;</p><p>  if(count <= 100)</p><p><b>  {</b></p><p>  display(fre);</p><p><b>  }</b&

89、gt;</p><p>  else if(count <= 200)</p><p><b>  {</b></p><p>  display1(temp);</p><p><b>  }</b></p><p><b>  }</b><

90、;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void display(int time)</p><p><b>  { </b></

91、p><p>  PORTC = table[time % 10];</p><p>  PORTD = bit_set[3];</p><p>  delay_ms(10);</p><p>  PORTC = table[(time / 10) % 10];</p><p>  PORTD = bit_set[2];&l

92、t;/p><p>  delay_ms(10);</p><p>  PORTC = table[time / 100];</p><p>  PORTD = bit_set[1];</p><p>  delay_ms(10);</p><p><b>  }</b></p><

93、;p>  void display1(int time)</p><p><b>  { </b></p><p>  PORTC = table[time % 10];</p><p>  PORTD = bit_set[3];</p><p>  delay_ms(10);</p><p&g

94、t;  PORTC = table1[(time / 10 )% 10];</p><p>  PORTD = bit_set[2];</p><p>  delay_ms(10);</p><p>  PORTC = table[(time)/ 100];</p><p>  PORTD = bit_set[1];</p>

95、<p>  delay_ms(10);</p><p><b>  }</b></p><p>  void time1_rtc_init(void)</p><p><b>  {</b></p><p>  INTCON = 0x20; //disable

96、 global and enable TMR0 interrupt</p><p>  INTCON2 = 0x84; //TMR0 high priority</p><p>  RCONbits.IPEN = 1; //enable priority levels</p><p>  TMR0H = 100;

97、 //clear timer</p><p>  TMR0L = 0; //clear timer</p><p>  T0CON = 0x85; //set up timer0 - prescaler 1:8</p><p>  INTCONbits.GIEH

98、= 1; //enable interrupts</p><p>  INTCONbits.INT0IF = 0;</p><p>  INTCONbits.INT0IE = 1;</p><p>  INTCON2bits.RBPU = 0;</p><p>  INTCON2bits.INTEDG0 = 0;</p

99、><p><b>  }</b></p><p>  #pragma code InterruptVectorHigh = 0x08</p><p><b>  void</b></p><p>  InterruptVectorHigh (void)</p><p><b

100、>  {</b></p><p><b>  _asm</b></p><p>  goto InterruptHandlerHigh //jump to interrupt routine</p><p><b>  _endasm</b></p><p><b>  

101、}</b></p><p>  //----------------------------------------------------------------------------</p><p>  // High priority interrupt routine</p><p>  #pragma code</p><

102、p>  #pragma interrupt InterruptHandlerHigh</p><p>  void InterruptHandlerHigh ()</p><p><b>  {</b></p><p>  if(INTCONbits.TMR0IF)</p><p>  {

103、 //check for TMR0 overflow</p><p>  INTCONbits.TMR0IF = 0; //clear interrupt flag</p><p>  second++; //indicate timeout</p><p>  if(second

104、 == 30)</p><p><b>  { </b></p><p>  //second = 0;</p><p>  result = 1;</p><p><b>  }</b></p><p>  // pulse = ~pulse;</p><

105、;p><b>  }</b></p><p>  if(INTCONbits.INT0IF == 1)</p><p><b>  {</b></p><p>  INTCONbits.INT0IF = 0;</p><p>  delay_ms(100);</p><p&

106、gt;<b>  fre++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void delay_ms(unsigned int time)</p><p><b>  {</b></p

107、><p><b>  int n;</b></p><p>  for(;time>0;time--)</p><p><b>  {</b></p><p>  for(n = 0; n < 50; n++);</p><p><b>  }</b&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論