基于ARM7的電子萬年歷設計及基于ARM的溫度數據無線傳輸系統_第1頁
基于ARM7的電子萬年歷設計及基于ARM的溫度數據無線傳輸系統_第2頁
基于ARM7的電子萬年歷設計及基于ARM的溫度數據無線傳輸系統_第3頁
基于ARM7的電子萬年歷設計及基于ARM的溫度數據無線傳輸系統_第4頁
基于ARM7的電子萬年歷設計及基于ARM的溫度數據無線傳輸系統_第5頁
已閱讀5頁,還剩80頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

成績評定表學生姓名班級學號專業通信工程課程設計題目基于ARM7的電子萬年歷設計評語組長簽字:成績日期20**年7月19日課程設計任務書學院信息科學與工程學院專業通信工程學生姓名班級學號課程設計題目基于ARM7的電子萬年歷設計實踐教學要求與任務:學習ARM7的虛擬儀器原理、設計方法和實現技巧;掌握簡單ARM7程序的編程實現;學會使用Proteus和Keil連接電路圖和關聯源代碼;采用ARM7語言,實現電子萬年歷設計;(1)通過檢索、查資料、調查研究、確定方案、畫出組成系統結構方框圖;(2)采用ARM7實現電子萬年歷;(3)系統調試與改進,調整系統參數,分析系統運行結果;(4)寫出設計總結報告。工作計劃與進度安排:20周(上):學習ARM7虛擬儀器原理、設計方法和實現技巧,掌握簡單ARM7程序的編程實現,掌握簡單通信系統設計和分析方法。20周(下):采用ARM7語言,實現電子萬年歷設計,并對萬年歷進行評估。指導教師:20**年7月13日專業負責人:20**年7月13日學院教學副院長:20**年7月13日

目錄1系統設計 11.1電子顯示屏特性 11.2按鍵控制 11.3 LCD顯示端 11.4萬年歷調控電路 21.5萬年歷的實現 31.6LCD調試電路圖 32軟件的具體功能和要求 42.1基本要求 42.2軟件設計平臺的介紹及實現方法 42.3程序設計流程圖 43設計總結 63.1proteus仿真電路圖 63.2Keil源代碼 73.3性能分析 23[參考文獻] 241系統設計1.1電子顯示屏特性1>LED由計算機專用設備、顯示屏幕、視頻輸入端口和系統軟件等組成。2>計算機及專用設備直接決定了系統的功能,可根據用戶對系統的不同要求選擇不同的類型3>提供視頻輸入端口。1.2按鍵控制1>用于年月日的調控,復位。2>用于時分秒的置換,清屏。1.3 LCD顯示端LCD顯示端如圖1所示。圖1LCD顯示端1.4萬年歷調控電路萬年歷調控電路如圖2所示。圖2萬年歷調控電路1.5萬年歷的實現使用調試功能,經過反復的調試終于實現了計時功能,然后通過查詢資料,實現了計時過程中時鐘實時更新功能及實現LED燈跟節奏閃爍。再經過程序的改進,實現了實時時鐘和鬧鐘調整功能。添加了LED燈指示調整時間點(秒、分、時、星期、日、月、年)功能。1.6LCD調試電路圖調試電路圖如圖3所示。圖3調試電路圖2軟件的具體功能和要求2.1基本要求本課題所設計的系統要求:在理解基本實驗代碼的基礎上,掌握萬年歷的工作原理,基于程序控制方式的驅動設計。在proteus中使用ARM7的LPC2106芯片并且結合Keil的源代碼,實現萬年歷功能。編寫基于萬年歷程序,實現代碼編譯。2.2軟件設計平臺的介紹及實現方法本設計中采用可編程邏輯設計環境ARM7進行設計,KeiluVsion5采用C語言進行編程。2.3程序設計流程圖萬年歷程序流程圖如圖4所示。開始開始初始化讀日期、時間寫日期、時間顯示子程序時間修改子程序日期修改子程序顯示結果返回開關控制子程序圖4萬年歷程序流程圖3設計總結3.1proteus仿真電路圖仿真結果如圖5所示。圖5仿真電路圖3.2Keil源代碼/*****************************************************功能:LCD12864液晶顯示驅動程序****************************************************/#include"config.h"#defineLCD12864_DIRIO0DIR//端口方向#defineLCD12864_CLRIO0CLR//數據清零#defineLCD12864_SETIO0SET//數據置一#defineLCD12864_PINIO0PIN//端口狀態#defineLCD12864_BUSY(1<<26)//BUSY#defineLCD12864_CTL_NO11//控制線起始端口#defineLCD12864_DAT_NO16//數據線起始端口#defineLCD12864_RS(1<<(LCD12864_CTL_NO+2))//命令/數據#defineLCD12864_RW(1<<(LCD12864_CTL_NO+3))//讀/寫#defineLCD12864_EN(1<<(LCD12864_CTL_NO+4))//使能位#defineLCD_DispOn0x3F//開顯示命令#defineLCD_STARTROW0xC0//設置起始行指令,0xC0為第0行#defineLCD_PAGE0xB8//設置頁指令。10111000#defineLCD_COL0x40//設置列指令。#defineLCD_LINE0x40//設置列指令#defineSINGLE_SCREEN_COL64//左右屏,每屏64列#defineLCD12864_CSA(1<<(LCD12864_CTL_NO))//控制線端口定義,選中左部屏幕#defineLCD12864_CSB(1<<(LCD12864_CTL_NO+1))//選中右部屏幕#defineLCD12864_WIDTH128//寬度#defineLCD12864_HIGH64//高度#defineLCD12864_PAGE8//頁數//引用外部字模externuint8sytx[8][32];externuint8snum[][16];externuint8hytx[8][32];externuint8Nums[10][16];externuint8week[][16];externuint8menu1[];externuint8menu0[];externuint8degree[];//externuint8dianqiguan[];externuint8menu2[];externuint8menu3[];externuint8menu4[];uint8tm[6];//獲取時間存在數組中uint8year[6];//獲取日期存在數組中uint8day;//獲取星期號uint8dis_buf[22];//數據緩沖區//uint8dayoder;//延時函數voidDelay(uint32x);//初始化函數voidRTCInit(void);voidLCDInit2(void);voidvCheckBusy(void);voidvWriteCMD2(uint8ucCMD);voidWriteData2(uint8ucData);voidClearAll2(void);//顯示字符函數voidDisplayByte(uint8ucPage,uint8ucCol,uint8ucData);//顯示字符voidvDisplayByte(uint8ucPage,uint8ucCol,uint8ucData);//反選顯示字符//顯示數字函數voidDisplaynum(uint8ucPage,uint8ucCol,uint8*pDisTable);//顯示數字//顯示漢字、字符串函數voidDispOneChinese(uint8ucPage,uint8ucCol,uint8*pDisTable,uint8Col);//一個漢字voidDispChinese(uint8ucPage,uint8ucCol,uint8pDisTable[][32],uint8Num,uint8Col);//多個漢字//全屏顯示圖片voidDisPicture(uint8*pDisTable);voidvDisPicture(uint8*pDisTable,uint8sur);//刷新屏幕函數只刷新其中一部分voidDateupdated(uint8numcode[]);voidWeekupdated(uint8oder);voidTimeupdated(uint8numcode[]);voidSetTimeRtc(void);//填充時間變量//刷新屏幕函數voidfresh(void);//定時器中斷處理函數,其中調用屏幕刷新函數freshvoid__irqRTC_Int(void);//主函數入口intmain(){LCDInit2();//初始化后清屏RTCInit();//初始化實時時鐘DispChinese(0,0,hytx,8,16);//顯示"歡迎同學止步的風"VICIntSelect=0x00;//設置所有中斷連接IRQ中斷VICVectCntl0=0x20|13;//分配通道0VICVectAddr0=(int)RTC_Int;//設置中斷服務程序地址VICIntEnable=(1<<13);//使能RTC中斷SetTimeRtc();Timeupdated(tm);Dateupdated(year);Weekupdated(day);while(1){while(0==(ILR&0x01));//等待RTC增量中斷ILR=0x01;//清除中斷標志}//WriteData2(0xff);//DispChinese(1,0,Nums,10,8);//顯示"0123456789"http://ClearAll2();//Displaynum(6,2+8*2,*(snum+10));//DispChinese(1,0,Nums,10,8);//顯示"0123456789"http://DispOneChinese(6,96,*(week+6),16);//每次循環,顯示一個漢字//ClearAll2();//Displaynum(2,32+8*4,*(snum+year[4]));//Displaynum(0,0,*(snum+year[4]));//Displaynum(0,0,*(snum));//vDisPicture(menu4,0);//反選8塊中的一塊區域//DisPicture(menu4);}//*******************************************************************************//*名稱:Delay()//*功能:延時函數//*******************************************************************************/voidDelay(uint32x){unsignedinti1,j1;for(j1=0;j1<100;j1++){for(i1=0;i1<x;i1++);}}//****************************************************************************//*名稱:vCheckBusy//*功能:檢查LCD是否忙//****************************************************************************voidvCheckBusy(void){LCD12864_DIR&=0xF9FFFF03;//數據線為輸入while(1){LCD12864_CLR=LCD12864_RS;LCD12864_SET=LCD12864_RW;LCD12864_SET=LCD12864_EN;LCD12864_CLR=LCD12864_EN;if(!(LCD12864_PIN&LCD12864_BUSY))break;}LCD12864_DIR|=0x060000FC;//數據線為輸出*/}//****************************************************************************//*名稱:vWriteCMD2//*功能:寫命令//****************************************************************************voidvWriteCMD2(uint8ucCMD){vCheckBusy();LCD12864_CLR=LCD12864_RS;//RS置L,數據格式為:命令LCD12864_CLR=LCD12864_RW;//RW置L,為寫操作LCD12864_CLR=0xFF<<LCD12864_DAT_NO;//清零數據端口LCD12864_SET=ucCMD<<LCD12864_DAT_NO;//傳遞命令LCD12864_SET=LCD12864_EN;//給EN一個高脈沖,發送數據LCD12864_CLR=LCD12864_EN;//發送完成后,使能位置L,供以后繼續使用}//****************************************************************************//*名稱:WriteData2//*功能:寫數據//****************************************************************************voidWriteData2(uint8ucData){vCheckBusy();LCD12864_SET=LCD12864_RS;//寫數據時,RS為H,RW為LLCD12864_CLR=LCD12864_RW;LCD12864_CLR=0xFF<<LCD12864_DAT_NO;//清零8位數據端口LCD12864_SET=ucData<<LCD12864_DAT_NO;//傳遞命令LCD12864_SET=LCD12864_EN;//給EN一個高脈沖,發送數據LCD12864_CLR=LCD12864_EN;//發送完成后,使能位置L,供以后繼續使用}//****************************************************************************//*名稱:CleanAll2//*功能:清屏//****************************************************************************voidClearAll2(void){uint8ucPage,ucCol;//頁號,列號LCD12864_SET=LCD12864_CSA;//左右兩屏都選中LCD12864_SET=LCD12864_CSB;for(ucPage=0;ucPage<8;ucPage++){vWriteCMD2(LCD_PAGE+ucPage);//設置頁號,從0行開始,光標位置vWriteCMD2(LCD_COL);//設置列號,定位在第0列for(ucCol=0;ucCol<64;ucCol++)//左右半屏都是64列,所以循環64次就可以啦,兩邊同時清屏{vWriteCMD2(LCD_PAGE+ucPage);//設置頁號,從0行開始,光標位置vWriteCMD2(LCD_COL+ucCol);//設置列號,從0列開始,到63列結束WriteData2(0x00);//寫零,表示清空當前列}}}//****************************************************************************//*名稱:LCDInit2//*功能:初始化//****************************************************************************voidLCDInit2(void){LCD12864_DIR|=0x00FFF800;//11-23為輸出LCD12864_CLR|=0x00FFF800;//清零11-23vWriteCMD2(LCD_DispOn);//開顯示vWriteCMD2(LCD_STARTROW);//設置起始行地址,列地址和頁地址是變化的ClearAll2();}//**************************************************************************************************//*FunctionName:DisplayByte//Date:*//*Parameter:ucPage//ucDatavoidDisplayByte(uint8ucPage,uint8ucCol,uint8ucData){//先選擇顯示屏幕(左or右)if(ucCol/SINGLE_SCREEN_COL==0)//為0說明ucCol小于64。,在左半屏幕{LCD12864_SET=LCD12864_CSA;//左開LCD12864_CLR=LCD12864_CSB;//右關}elseif(ucCol/SINGLE_SCREEN_COL==1)//為1說明ucCol大于64。,在右半屏幕{LCD12864_CLR=LCD12864_CSA;//左關LCD12864_SET=LCD12864_CSB;//右開}//設置坐標vWriteCMD2(LCD_PAGE+ucPage);//設置開始的頁號vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL);//設置開始的列號//顯示數據WriteData2(ucData);}//***************************************************************************************//*名稱vDisplayByte//*功能反顯一個字符//*參數解釋ucPage顯示的起始頁數ucCol顯示的起始列數ucData要顯示的數據//***************************************************************************************/voidvDisplayByte(uint8ucPage,uint8ucCol,uint8ucData){if(ucCol/LCD12864_HIGH==0){LCD12864_SET=LCD12864_CSA;LCD12864_CLR=LCD12864_CSB;}else{LCD12864_CLR=LCD12864_CSA;LCD12864_SET=LCD12864_CSB;}vWriteCMD2(LCD_PAGE+ucPage);vWriteCMD2(LCD_LINE+ucCol%LCD12864_HIGH);WriteData2(~ucData);}//**************************************************************************//*名稱vDisPicture//*功能顯示一個被選中一部分的界面//*參數解釋*pDisTable圖像數據的指針//*sur值作用01234567分別為選中八塊中的一塊12243648分別為選中01頁23頁45頁67頁//*****************************************************************************/voidvDisPicture(uint8*pDisTable,uint8sur){uint8ucPage=0;//起始頁uint8ucCol=0;//起始列uint8width=128;//lcd寬度uint8hight=64;//lcd高度uint8i,j;//臨時變量if(sur>=0&sur<=7)//輸入數據sur在0-7之間{for(i=ucPage;i<ucPage+hight/8;i++)//頁數遞增{for(j=ucCol;j<ucCol+width;j++)//列數遞增{if((i>=(sur/2)*2)&&(i<=(sur/2)*2+1)){if(j>=64*(sur%2)&&j<=64*(sur%2)+63){vDisplayByte(i,j,*(pDisTable+i*128+j));}else{DisplayByte(i,j,*(pDisTable+i*128+j));}}else{DisplayByte(i,j,*(pDisTable+i*128+j));}}}}else//如果參數不為0-7之間即為12243648其中之一{for(i=ucPage;i<ucPage+hight/8;i++)//頁遞增{for(j=ucCol;j<ucCol+width;j++)//列遞增{if(i>=((sur-12)/12)*2&&i<=((sur-12)/12)*2+1){vDisplayByte(i,j,*(pDisTable+i*128+j));}else{DisplayByte(i,j,*(pDisTable+i*128+j));}}}}}//*******************************************************************************//**函數名稱:Displaynum()//**函數功能:顯示一個數字//**入口參數:ucPage顯示的起始頁數ucCol顯示的起始列數*pDisTable要顯示的數據的指針//**出口參數:無//*******************************************************************************/voidDisplaynum(uint8ucPage,uint8ucCol,uint8*pDisTable){uint8i;for(i=0;i<8;i++)//數字上半部分{DisplayByte(ucPage,ucCol+i,*(pDisTable+i));}for(i=0;i<8;i++)//數字下半部分{DisplayByte(ucPage+1,ucCol+i,*(pDisTable+8+i));}pDisTable++;}//*******************************************************************************//**函數名稱:Dateupdated()//**函數功能:在待機界面刷新日期//**入口參數:numcode[]要顯示的數據組成的數組長度為六數字范圍0-9pDisTable[][16]數字和溫度標示橫線字符//**出口參數:無//*******************************************************************************/voidDateupdated(uint8numcode[]){uint8count=6;uint8ucPage=2;uint8ucCol=32;uint8i=0;for(i=0;i<count;i++){if(i==2||i==4){Displaynum(ucPage,ucCol+8*i,*(snum+10));ucCol+=8;Displaynum(ucPage,ucCol+8*i,*(snum+numcode[i]));}else{Displaynum(ucPage,ucCol+8*i,*(snum+numcode[i]));}}}//*******************************************************************************//**函數名稱:SetTimeRtc()//**函數功能:獲取時間的各種數據//**入口參數:無//**出口參數:無//*******************************************************************************/voidSetTimeRtc(void){uint32datas;uint32times;uint32bak;//uint8MESSAGE[]="--北京時間:--";times=CTIME0;//讀取完整的時鐘寄存器datas=CTIME1;bak=(datas>>16)&0xfff;//獲取年dis_buf[0]=bak/1000+'0';bak=bak%1000;dis_buf[1]=bak/100+'0';bak=bak%100;dis_buf[2]=bak/10;dis_buf[3]=bak%10;dis_buf[4]='-';bak=(datas>>8)&0x0f;//獲取月dis_buf[5]=bak/10;dis_buf[6]=bak%10;dis_buf[7]='-';bak=datas&0x1f;//獲取日dis_buf[8]=bak/10;dis_buf[9]=bak%10;dis_buf[10]='';bak=(times>>24)&0x07;//獲取星期dis_buf[11]=bak%10;dis_buf[12]='';bak=(times>>16)&0x1f;//獲取小時dis_buf[13]=bak/10;dis_buf[14]=bak%10;dis_buf[15]=':';bak=(times>>8)&0x3f;//獲取分鐘dis_buf[16]=bak/10;dis_buf[17]=bak%10;dis_buf[18]=':';bak=times&0x3f;//獲取秒鐘dis_buf[19]=bak/10;dis_buf[20]=bak%10;tm[0]=dis_buf[13];tm[1]=dis_buf[14];tm[2]=dis_buf[16];tm[3]=dis_buf[17];tm[4]=dis_buf[19];tm[5]=dis_buf[20];year[0]=dis_buf[2];year[1]=dis_buf[3];year[2]=dis_buf[5];year[3]=dis_buf[6];year[4]=dis_buf[8];year[5]=dis_buf[9];day=dis_buf[11];//dayoder=dis_buf[9];}//****************************************************************************//*名稱:Weekupdated()//*功能:更新星期//****************************************************************************voidWeekupdated(uint8oder){//DispOneChinese(6,96,*(week+oder),16);DispOneChinese(6,96,*(week+oder),16);//每次循環,顯示一個漢字}//*************************************************************************************************//*名稱:Timeupdated//*作用:在待機界面刷新時間//*參數解釋:numcode[]要顯示的數據組成數組pDisTable[][16]//*************************************************************************************************/voidTimeupdated(uint8numcode[]){uint8ucPage=4;uint8ucCol=32;uint8count=6;uint8i=0;for(i=0;i<count;i++){if(i==2||i==4){Displaynum(ucPage,ucCol+8*i,*(snum+12));ucCol+=8;Displaynum(ucPage,ucCol+8*i,*(snum+numcode[i]));}else{Displaynum(ucPage,ucCol+8*i,*(snum+numcode[i]));}}}//****************************************************************************//*名稱:DispOneChinese//*功能:顯示一個漢字//一個漢字需要兩頁*16列//*注意:頁,列有改變//****************************************************************************voidDispOneChinese(uint8ucPage,uint8ucCol,uint8*pDisTable,uint8Col)//頁號,列號,指向字模數組的指針,Col表示列數,為8,則是字符數組,為16則是漢字{uint8i=0;for(i=0;i<Col;i++)//漢字上半部分{DisplayByte(ucPage,ucCol+i,*(pDisTable+i));}for(i=0;i<Col;i++)//漢字下半部分{DisplayByte(ucPage+1,ucCol+i,*(pDisTable+16+i));//漢字時用//DisplayByte(ucPage+1,ucCol+i,*(pDisTable+8+i));}}//*******************************************************************************//**函數名稱:RTCInit()//**函數功能:初始化實時時鐘//**入口參數:無//**出口參數:無//*******************************************************************************/voidRTCInit(void){PREINT=Fpclk/32768-1;//設置基準時鐘分頻器PREFRAC=Fpclk-(Fpclk/32768)*32768;CCR=0x00;//禁止時間計數器YEAR=2009;MONTH=6;DOM=18;DOW=6;HOUR=23;MIN=59;SEC=55;CIIR=0x01;//設置秒值的增量產生1次中斷CCR=0x01;//啟動RTC}//****************************************************************************//*名稱:DispChinese//*功能:顯示n個漢字//一個漢字需要兩頁*16列//*注意:按照這種寫法要每個漢字單獨取模//**************************************************voidDispChinese(uint8ucPage,uint8ucCol,uint8pDisTable[][32],uint8Num,uint8Col)//漢字時用//voidDispChinese(uint8ucPage,uint8ucCol,uint8pDisTable[][16],uint8Num,uint8Col)//Col表示列數,為8,則是字符數組,為16則是漢字{uint8i=0;for(i=0;i<Num;i++){//漢字時用DispOneChinese(ucPage,ucCol+16*i,*(pDisTable+i),Col);//每次循環,顯示一個漢字//DispOneChinese(ucPage,ucCol+8*i,*(pDisTable+i),Col);//每次循環,顯示一個字符數字}}//*******************************************************************************//**函數名稱:fresh()//**函數功能:刷新屏幕//**入口參數:無//**出口參數:無//*******************************************************************************/voidfresh(){SetTimeRtc();Timeupdated(tm);Dateupdated(year);Weekupdated(day);}//*******************************************************************************//**函數名稱:DisPicture()//**函數功能:顯示一幅圖//**入口參數:最大128*64點陣,要提供圖形的高度和寬度//**出口參數:*pDisTable要顯示的數據的指針//*******************************************************************************/voidDisPicture(uint8*pDisTable){uint8ucPage=0;uint8ucCol=0;uint8width=128;uint8hight=64;uint8i,j;for(i=ucPage;i<ucPage+hight/8;i++)for(j=ucCol;j<ucCol+width;j++)DisplayByte(i,j,*(pDisTable+i*128+j));}//*******************************************************************************//**函數名稱:RTC_Int()//**函數功能:每一秒中斷一次,刷新一次//**入口參數:無//**出口參數:無//*******************************************************************************/void__irqRTC_Int(void){fresh();//刷新ILR=0x01;//清除RTC增量中斷標志VICVectAddr=0;//向量中斷結束}3.3性能分析在測試中遇到LCD液晶顯示屏為不顯示時,首先對電路的芯片進行測試,觀察是否選擇正確以及是否有編譯程序文件,按動按鈕調好:查看編譯的程序是否正確無誤,對程序進行認真修改。經過多次的反復測試與分析,可以對電路的原理及功能更加熟悉,同時提高了設計能力與及對電路的分析能力。同時在軟件的編程方面得到更到的提高,對編程能力得到加強,對所學的知識得到很大的提高與鞏固。實現了電子萬年歷的基本功能。[參考文獻][1]劉勇編數字電路電子工業出版社2004[2]陳正振編電子電路設計與制作廣西交通職業技術學院2007[3]楊子文編ARM原理及應用西安電子科技大學出版社2006[4]王法能編ARM原理及應用科學出版社2004密級:學士學位論文THESISOFBACHELOR(年)題目:溫度數據無線傳輸系統學院:系專業:班級:學號:學生姓名: 指導教師:起訖日期:溫度數據無線傳輸系統專業:學號:姓名:指導老師:摘要人們生產生活需要知道溫度,工業生產需要知道溫度控制溫度。為了生產生活的需要,我們要有一套及時、方便、有效、快捷的傳輸溫度量的系統。本系統主要有兩個模塊,一個溫度采集發送模塊和一個溫度數據接收模塊。在溫度采集模塊通過溫度傳感器DS18B20采集溫度數據,這種傳感器可將模擬的溫度量轉換成數字量通過IIC總線將數據傳送到單片機,單片機采用LM3S1138芯片,這個芯片具有很快的處理速度,有單獨的休眠模塊,通過軟件使其進入休眠非常省電。然后將溫度數據送到無線發射模塊,我采用的無線發射是工業通用的nRF905無線收發模塊,將數據送到無線發射模塊中,發射模塊會自動將數據打包,最后將數據發送。數據接收模塊中無線接收模塊每隔650us掃描一次,當有同頻率的信號過來時就開始接收數據包,將接收到的數據包解壓,將數據送到單片機,然后單片機將數據送到上位機,上位機既可以處理數據。該設計可以使溫度數據及時的監控,通過無線傳輸不用布線。并且可以方便的在上位機處理數據。關鍵詞:DS18B20,LM3S1138,nRF905,溫度采集,無線傳輸。TemperaturedatawirelesstransmissionsystemAbstractPeopleneedtoknowproductionandlifeoftemperature,theindustrialproductionneedtoknowthetemperatureandcontroltemperature.Inordertotheneedsofproductionandlife,wewanttohaveatimely,convenient,efficient,quicktransmissiontemperatureamountofsystem.Systemtherearetwomainmodules,atemperaturegatheringsendmoduleandatemperaturedatareceivingmodule.IntemperatureacquisitionmodulethroughthetemperaturesensorDS18B20collectiontemperaturedata,thesensorcanbesimulatedtemperatureisconvertedintodigitalquantitythroughtheIICtrunktosenddatatoasingle-chipmicrocomputer,thesinglechipmicrocomputerLM3S1138chip,thechiphasquicklyprocessingspeed,hasaseparatedormancymodule,throughthesoftwaremakeitintothedormancyveryprovinceelectricity.Thenwillthetemperaturedatasenttowirelesstransmittingmodule,IusewirelesslaunchisthenRF905industrialgeneralwirelesstransceivermodule,thedatasenttowirelesstransmittingmodules,launchmoduleautomaticallywilldatapacking,finallywillsenddata.Datareceivingmodulewirelessreceivingmodulesinevery650usscanningtime,whenthefrequencyofthesignalwithcamethroughtoreceivedatapackets,willreceivethepacketdecompression,datatothesinglechipmicrocomputer,andthenthedatasenttothesinglechipmicrocomputeruppermachine,PCcanprocessingdata.Thisdesigncanmakethetemperaturedatatimelymonitoring,throughthewirelesstransmissionneednotwiring.Andcanbeconvenientinuppermachineprocessingdata.KEY:DS18B20,LM3S1138,nRF905,Temperaturegathering,Wirelesstransmission目錄摘要ⅠAbstractⅡ緒論1課題的來源與研究意義1國內外研究現狀及發展趨勢1本文主要研究內容2溫度采集發射硬件及工作原理32.1系統總體方案設計32.2溫度采集的硬件電路及工作原理32.3溫度采集電路32.4單片機選型62.5復位電路72.6電源電路82.7無線發射電路8第三章溫度數據接收硬件及工作原理133.1溫度數據接收的硬件電路及工作原理133.2單片機選型133.3電源電路及串口通信133.4無線接收電路14第四章軟件設計154.1溫度采集發射模塊軟件設計154.1.1主程序154.1.2溫度采集模塊程序164.1.3無線發射模塊程序204.2溫度數據接收模塊軟件設計214.2.1主程序214.2.2數據接收模塊程序22結論26參考文獻27致謝28附錄:溫度采集發射模塊電氣原理圖溫度數據接收模塊電氣原理圖溫度采集發射模塊PCB圖溫度數據接收模塊PCB圖溫度采集發射模塊程序清單溫度數據接收模塊程序清單緒論課題的來源及研究意義溫度數據無線傳輸系統,主要用于對溫度的自動采集和溫度數據的自動無線傳輸。對于現在社會,氣象的發展以及人們對氣象服務的需求日益增多[1],而以前用的各種型號的溫度表,人工根據溫度表刻度讀數的采集方式已經遠遠不能滿足要求。首先是溫度數據量的增大,要求24小時實時監測,對于人工的方式來說,效率低,精度低。其次現在人工勞動力成本的增加,對于大量監測點會讓數據采集成本增大。最后,對于需要采集高空溫度,人工已經不能到達。基于這些因素自動采集溫度數據保存數據已經成為主流模式。在其他行業的應用也非常廣泛,石油、化工、冶金、紡織、機械制造、航空航天、制藥、煙草、糧食存儲等等,都需要實時監測溫度。數據無線傳輸在現在各種行業運用越來越廣泛,可以實時發送數據,溫度數據采集到以后將其及時的發送到指定的上位機,對溫度數據及時的處理,在氣象上就可以及時的發出預報,讓人們安排生產生活,在工業現場,可以及時的安排工業生產,或者避免很多事故的發生。國內外研究現狀及發展趨勢隨著工業社會的發展,現代工業對于溫度的采集,數據處理已經全部實現自動化。例如我國的氣象溫度采集,已經實現自動氣象站的應用。現在使用的與單片機一起使用的溫度傳感器主要有:數字溫度傳感器和模擬溫度傳感器。模擬溫度傳感器為以前通用的熱電阻和熱電偶傳感器。而數字溫度傳感器就是能把溫度物理量和濕度物理量,通過溫、濕度敏感元件和相應電路轉換成方便計算機、plc、智能儀表等數據采集設備直接讀取得數字量的傳感器。像現在多采用芬蘭Vaisala公司生產的HMP45D溫度傳感器[10];美國模擬器件公司生產的單片集成兩端感溫傳感器AD590[6];DALLAS公司生產的數字溫度傳感器DS18B20[11]。在傳輸方面,現在采用的數據傳輸方法有很多,世界主流的有以下幾種方式:(1)有線傳輸。有線傳輸的優點傳輸速度快,傳輸穩定性、精確度高,但是有線傳輸接線復雜、布線困難,故障時難以維修。一般有線傳輸的布線方式有地下深埋光纜和地上設立電桿架設電纜,這兩種方式無論哪種都非常困難,也會增加很多不必要的成本。如果是地下深埋光纜,如果光纜發生破損或者其他故障,首先是故障點判斷費時費力,其次如果維修則要挖掘深埋地下的光纜,很費時費力。這樣就使有線傳輸以后的使用維護非常困難,成本也隨之增加。(2)無線傳輸。主流的無線傳輸[5]有,紅外線傳輸,藍牙傳輸,GPRS無線通信技術,射頻技術。①紅外線傳輸,在無線技術發展的一個時期,紅外傳輸技術被世界廣泛使用,能夠被眾多硬件和軟件支持。它主要通過數據電脈沖和紅外光脈沖之間的相互轉換來實現無線的數據收發,是一種點對點的數據傳輸協議。其優點是:具有小角度(30度錐角以內)、短距離、點對點直線數據傳輸;保密性好;傳輸速率較高可達16Mbps。缺點是通信距離短只有0~1米;通信過程中不能移動;遇到障礙物時,通信會中斷;只能點對點傳輸,因此功能單一、擴展性差。②藍牙傳輸[3],其優點在于引入身份識別后可以靈活實現漫游;低功耗對人體危害小;藍牙集成電路應用簡單,成本低廉;其缺點在于:傳輸距離短,最新的藍牙V4.0有效傳輸傳輸距離為1000米。最新的藍牙傳輸速度大大提高,但是藍牙V2.0的傳輸速度慢。③GPRS無線通信技術[8]。GPRS數據傳輸的可靠性有較高的保障;從遠端到管理中心的傳輸延時小,適于實時信息傳輸;可以實現全國聯網數據傳輸,使溫度數據全國共享方便。但是,管理中心的GPRS接入方式比較復雜,不能采用低成本的用戶終端,遠程通信終端的成本較高;通信接入的連網費較高,特別是對數據量大的數據,成本太高。④射頻技術。射頻技術是一種無線電通信技術,其利用電磁波為載波來傳輸信息,它是一種在一個區域范圍內的任何地方,在各種電子設備之間的實現無線通信的開放新技術工業標準。射頻技術使用幾個特定頻率中的一個頻率傳輸數據,相鄰網絡使用不同的頻率,目前工業上使用433/868/915/2400MHz頻段。創羿科技CY-TAT-202[12]電阻溫度系數大,感應靈敏,電阻率高,元件尺寸小,電阻值隨溫度變化而變化基本呈線性關系,在測溫范圍內,物理、化學性能穩定,長期復現性好,測量精度高,有效識別距離可達0-80m。溫度傳感電子標簽除識別與定位的功能外,還可通過感溫裝置獲取實時溫度數據。并將被監測的物體溫度數據通過電子標簽傳遞給監控管理系統,從而實現對監控過程中溫度預警。該產品的領先技術、全工業性設計和出眾特點使得其在冷鏈、醫療、倉庫管理、電力故障檢測等需地方提供了一種全新的檢測理念,有效識別距離為80米,廣泛應用于各種領域。本文主要研究內容本課題研究的溫度數據無線傳輸系統可廣泛用于氣象氣溫監測,工廠車間溫度監控等。設計要求:微處理器LM3S1138;溫度精度0.5℃;通訊距離不小于500M(無遮擋);供電方式,鋰電池,可持續工作一個月。溫度采集發射模塊硬件電路設計2.1總體方案設計在這個設計系統中,溫度采集發射模塊,需要用溫度傳感器采集溫度量,將溫度量傳輸到單片機中,單片機將溫度數據量傳輸到無線發射芯片,無線發射芯片將數據打包發送出去。接收模塊將采集到的溫度數據去掉校驗碼CRC,解壓,送到單片機中,然后單片機通過USB數據接口將數據送到計算機中,方便處理數據。2.2溫度采集發射模塊硬件組成及工作原理這個模塊由溫度傳感器,單片機,無線發射模塊組成。圖2-1溫度采集發射模塊原理框圖溫度采集發射模塊原理框圖如圖2-1所示,數字溫度傳感器DS18B20將采集到的溫度量轉換為數字量直接送到單片機中,而不需要進行A/D轉換。單片機將溫度傳感器采集的數據通過同步串行接口SSI將數據送到無線發射模塊中,無線發射模塊將數據壓縮打包,加校驗碼,以一定的頻率發送出去。2.3溫度采集電路溫度的檢測傳感器很多,傳統的測溫元件有熱電偶和熱電阻,而熱電偶和熱電阻測出的一般都是電壓,再轉換成對應的溫度,需要比較多的外部硬件支持,硬件電路復雜,軟件調試復雜,制作成本高。根據產品的溫度要求,溫度精度要達到±0.5℃,所以內槽溫度傳感器采用了美國DALLAS半導體公司生產的智能溫度傳感器DS18B20作為檢測元件,測溫范圍為-55℃到+125℃,分辨率最大可達0.0625℃。DS18B20可以直接讀出被測溫度值,而且采用3線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點。DS18B20的性能特點如下:獨特的單線接口僅需要一個端口引腳進行通訊多個DS18B20可以并聯在惟一的三線上,實現多點組網功能無需外部器件可通過數據線供電,電壓范圍為3.0V--5.5V零待機功耗溫度以9或12位數字量讀出用戶可定義的非易失性溫度報警設置報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件負電壓特性,電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作DS18B20內部結構DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8個字節的存儲器,結構如圖4所示。頭兩個字節包含測得的溫度信息,第三和第四字節是TH和TL的拷貝,是易失的,每次上電復位時被刷新。第五個字節為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。DS18B20工作時按此寄存器中的分辨率將溫度轉換為相應精度的數值。該字節各位的定義如圖2-2所示。低5位一直為1,TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設置為0,用戶不要去改動,R1和RO決定溫度轉換的精度位數,即用來設置分辨率,定義方法見表1。圖2-2高速暫存RAM結構圖由表2-2可見,DS18B20溫度轉換的時間比較長,而且設定的分辨率越高,所需要的溫度數據轉換時間就越長。因此,在實際應用中要將分辨率和轉換時間權衡考慮。表2-1配置寄存器表2-2DS18B20分辨率的定義規定高速暫存RAM的第六、七、八字節保留未用,表現為全邏輯1。第九字節讀出前面所有8個字節的CRC碼,可用來檢驗數據,從而保證通信數據的正確性。當DS18B20接

溫馨提示

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

評論

0/150

提交評論