自行車測速儀設(shè)計(jì)報(bào)告_第1頁
自行車測速儀設(shè)計(jì)報(bào)告_第2頁
自行車測速儀設(shè)計(jì)報(bào)告_第3頁
自行車測速儀設(shè)計(jì)報(bào)告_第4頁
自行車測速儀設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

word文檔可自由復(fù)制編輯嵌入式系統(tǒng)設(shè)計(jì)自行車車速報(bào)警系統(tǒng)摘要本課題實(shí)驗(yàn)主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍爾傳感器和加速度傾角傳感器來實(shí)現(xiàn)自行車測速功能。通過霍爾傳感器來采集信號(hào),經(jīng)過單片機(jī)處理后,由12864液晶顯示其總里程,分里程,速度,加速度;信號(hào)經(jīng)過加速度傾角傳感器讀出坡度值,并在12864液晶中顯示出來;然后由數(shù)學(xué)公式計(jì)算出消耗的卡路里值。12864顯示頁面一共有三面。按鍵具有調(diào)控展現(xiàn)的頁面,清除分里程數(shù)據(jù),保存總里程數(shù)據(jù)的功能,利用24C02實(shí)現(xiàn)斷電不消失的功能。發(fā)光二極管模塊,利用MOS管的特性可以實(shí)現(xiàn)在暗處自動(dòng)點(diǎn)亮。關(guān)鍵詞:自行車測速儀;霍爾傳感器A3144;加速度傾角傳感器MMA7455;12864LCD目錄1設(shè)計(jì)要求................................2設(shè)計(jì)方案................................2.1芯片的選擇...............................2.2霍爾傳感器與單片機(jī)的通信..............2.312864液晶屏與單片機(jī)..................2.4單片機(jī)與24C02........................2.5單片機(jī)與MMA7455......................2.6單片機(jī)下載程序........................3總體方案................................3.1工作原理.............................3.2總體設(shè)計(jì).............................4系統(tǒng)硬件設(shè)計(jì)............................4.1STC89C52RC單片機(jī)最小系統(tǒng).............4.2各部分電路電路圖.....................4.3整體電路.............................5系統(tǒng)軟件設(shè)計(jì)............................5.1主程序流程...........................參考文獻(xiàn)....................................附錄........................................1設(shè)計(jì)要求1.1發(fā)光二極管模塊在暗處自動(dòng)點(diǎn)亮功能。1.2利用霍爾傳感器采集信號(hào),由單片機(jī)處理后控制外圍設(shè)備工作。1.3利用單片機(jī)控制12864液晶屏顯示。1.4將指定的數(shù)據(jù)放入24C02中,達(dá)到斷電不丟失的效果。1.5用KeiluVision3編寫C程序,利用單片機(jī)最小系統(tǒng)燒寫程序到單片機(jī)。1.6利用傳感器模塊計(jì)算傾角(坡度),由12864液晶顯示。2設(shè)計(jì)方案2.1芯片的選擇自行車測速儀按系統(tǒng)功能實(shí)現(xiàn)要求,決定控制系統(tǒng)采用STC89C52RC單片機(jī),采集信號(hào)的霍爾傳感器采用A3144,保存信息的E^2PROM24C02,計(jì)算傾角的加速度傾角傳感器MMA7455,用于顯示的12864液晶。2.2霍爾傳感器與單片機(jī)之間的通信將霍爾傳感器的信號(hào)輸出端和單片機(jī)的某一個(gè)I/O口相連(本板子中使用P2^3),通過檢測P2^3電平的下降沿和上升沿來編寫程序,以達(dá)到計(jì)數(shù)的功能。2.312864液晶屏與單片機(jī)將12864液晶屏按照其操作指南正確連接在電路中,編寫程序,由單片機(jī)控制12864液晶顯示各種數(shù)據(jù)。2.4單片機(jī)與24C02程序編寫中,要求保存功能的按鍵按下時(shí),總里程的數(shù)據(jù)寫入到24C02芯片中,達(dá)到斷電不丟失的功能。將24C02按照操作手冊正確連接到電路中,由單片機(jī)控制,當(dāng)檢查到按鍵按下時(shí),執(zhí)行程序:經(jīng)總里程數(shù)據(jù)寫入24C02中,保存起來。2.5單片機(jī)與MMA7455此模塊是用集成工藝制作好的商品。按照操作手冊正確連接到電路中,根據(jù)芯片資料和示例程序可以使其輸出角度值,然后在12864中顯示出來。2.6單片機(jī)下載程序利用單片機(jī)最小系統(tǒng)和串口(配合MAX232轉(zhuǎn)電平芯片),借助STC下載器完成程序的燒寫。3總體方案3.1工作原理本實(shí)驗(yàn)主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍爾傳感器和加速度傾角傳感器來實(shí)現(xiàn)自行車測速功能。通過霍爾傳感器來采集信號(hào),經(jīng)過單片機(jī)處理后,由12864液晶顯示其總里程,分里程,速度,加速度;信號(hào)經(jīng)過加速度傾角傳感器讀出坡度值,并在12864液晶中顯示出來;然后由數(shù)學(xué)公式計(jì)算出消耗的卡路里值。12864顯示頁面一共有三面。按鍵具有調(diào)控展現(xiàn)的頁面,清除分里程數(shù)據(jù),保存總里程數(shù)據(jù)的功能,利用24C02實(shí)現(xiàn)斷電不消失的功能。發(fā)光二極管模塊,利用MOS管的特性可以實(shí)現(xiàn)在暗處自動(dòng)點(diǎn)亮。3.2設(shè)計(jì)總體框圖STC89C52RCSTC89C52RCA314424C02MMA7455745512864液晶SHAPE4系統(tǒng)硬件設(shè)計(jì)4.1STC89C52RC單片機(jī)最小系統(tǒng)4.1.1最小系統(tǒng)包括晶體振蕩電路、復(fù)位開關(guān)和電源部分。4.2各部分電路4.2.1主要控制部分(STC89C52RC)4.2.212864液晶部分4.2.324C02部分電路4.2.4串口及MAX232部分4.2.5傾角傳感器MMA74554.2.6霍爾傳感器部分4.2.7發(fā)光二極管獨(dú)立顯示模塊4.3整體電路5系統(tǒng)軟件設(shè)計(jì)主程序流程圖開始開始初始化檢查霍爾傳感器信號(hào)單片機(jī)處理信號(hào)發(fā)出指令操作液晶屏顯示參考文獻(xiàn)[1]沈紅衛(wèi)《基于單片機(jī)結(jié)構(gòu)的智能系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》電子工業(yè)出版社[2]黃惠媛《單片機(jī)原理與接口技術(shù)》海洋出版社[3]周平伍云輝《單片機(jī)應(yīng)用技術(shù)》電子科技大學(xué)出版社[4]吳金戌沈金陽郭庭吉《8051單片機(jī)實(shí)踐與應(yīng)用》清華大學(xué)出版社[5]黃正謹(jǐn)?shù)取峨娮釉O(shè)計(jì)競賽賽題解析》東南大學(xué)出版社附錄程序:/*************河北大學(xué)電信學(xué)院***********//*******************李煒*****************//***********自行車測速儀程序**************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/**********液晶屏相關(guān)部分*****************/#definelcd_portP0 //液晶屏指令、數(shù)據(jù)通信接口sbitrs=P2^7;//液晶屏寄存器選擇接口(rs=0時(shí)選擇指令寄存器,rs=1時(shí)選擇數(shù)據(jù)寄存器) sbitrw=P2^6; //液晶屏讀寫選擇接口(rw=0時(shí)選擇寫入,rw=1時(shí)選擇讀出) sbiten=P2^5; //液晶屏使能接口(en=0時(shí)通信接口中斷,en=1時(shí)通信接口接通)sbitret=P2^4;//液晶屏主復(fù)位引腳/*********子函數(shù)部分*****************/voiddelayms_lcd(uintms); //延時(shí)子函數(shù),時(shí)間為1msvoiddelay_n10_us(uintn); //10微秒延時(shí)函數(shù)(n*10us)voidlcd_wr_command(ucharcom); //向液晶屏輸入命令子函數(shù)voidlcd_wr_data(uchardat); //向液晶屏輸入數(shù)據(jù)單字節(jié)子函數(shù)voidlcd_int(); //LCD初始化voidpicture_show0();//12864畫面0voidpicture_show1(); //12864畫面1voidpicture_show2(); //12864畫面2voidpicture_select(); //12864畫面選擇voidkey_select();//按鍵相關(guān)判斷voidinterrupt_set();//中斷函數(shù)參數(shù)設(shè)定voidstart_24C02(); //24C02起始信號(hào)voidwrite_one_char(ucharx); //寫入一個(gè)字節(jié)voidwait_ack(); //等待應(yīng)答ucharread_one_char(); //讀出一個(gè)字節(jié)voidstop_24C02(); //24C02終止信號(hào)voidread_total_distance();//讀出24C02中數(shù)據(jù)并且賦值給total_distancevoidwrite_total_distance();//寫入24C02中total_distance數(shù)據(jù)voidwrite_total_distance1();//寫入24C02中total_distance數(shù)據(jù)voidforbid_data();//限制所有變量的取值/*********24C02相關(guān)部分****************/sbitSCL=P1^5; //串口時(shí)鐘引腳sbitSDA=P1^4; //串口數(shù)據(jù)引腳/**********相關(guān)數(shù)組部分***********/ucharcodedata1[]="歡迎使用";ucharcodedata2[]="自行車測速儀";ucharcodedata3[]="制作人";ucharcodedata4[]="李煒";ucharcodedata5[]="趙向輝";ucharcodedata6[]="總里程";ucharcodedata7[]="分里程";ucharcodedata8[]="速度";ucharcodedata9[]="加速度";ucharcodedata10[]="坡度";ucharcodedata11[]="卡路里";ucharcodedata12[]="請注意安全";ucharcodedata_show[]="0123456789" ;/***********相關(guān)變量部分************/uintnew_total_distance=0,old_total_distance=0;//四位數(shù)據(jù)uintnew_part_distance=0,old_part_distance=0;//三位數(shù)據(jù)uintold_speed=0,new_speed=0;//兩位數(shù)據(jù)uintold_acceleration=0,new_acceleration=0;//兩位數(shù)據(jù)uintold_ascent=0,new_ascent=0;//三位數(shù)據(jù)uintcalorie=0;//三位數(shù)據(jù)ucharold_j=0,new_j=0,part_flag=0,write_flag=0,show_flag=0,control_flag=0;staticuinttime=0;/*******按鍵相關(guān)**************/sbitkey1=P1^0; //頁面上翻sbitkey2=P1^1; //手動(dòng)保存sbitkey3=P1^2; //頁面下翻sbitkey4=P1^3; //清除分里程數(shù)據(jù)/*********霍爾傳感器相關(guān)部分**********/sbitA3145_OUT=P2^3;/***********************************/voidmain(){ read_total_distance(); lcd_int(); //LCD初始化 picture_show0(); delayms_lcd(2000); lcd_int(); picture_show1(); delayms_lcd(2000); lcd_int(); picture_show2(); delayms_lcd(2000); interrupt_set(); A3145_OUT=1; while(1) { key_select(); picture_select(); if(control_flag==0) new_total_distance=new_part_distance; if(show_flag==1) { if(old_j==1) picture_show1(); if(old_j==2) picture_show2(); } if(part_flag==1) { while(A3145_OUT==0); ET0=0; TR0=0; new_speed=250/time; new_acceleration=(new_speed-old_speed)*50/time; time=0; ET0=1; TR0=1; new_part_distance+=5; calorie=(calorie+5); part_flag=0; show_flag=1; } forbid_data(); }}/************限制所有變量的取值************/voidforbid_data(){ if((old_total_distance+new_total_distance)>9999) { new_total_distance=old_total_distance=0; } if(new_part_distance>999) { new_part_distance=0; write_total_distance(); read_total_distance(); } if(new_speed>99) new_speed=0; if(new_acceleration>99) new_acceleration=0; if(calorie>999) calorie=0;}/***********LCD顯示畫面0********************/voidpicture_show0(){ uchari; i=0; lcd_wr_command(0x82); //設(shè)置液晶屏的顯示位置 while(data1[i]!=0) { lcd_wr_data(data1[i]); i++; } i=0; lcd_wr_command(0x91); while(data2[i]!=0) { lcd_wr_data(data2[i]); i++; } i=0; lcd_wr_command(0x8A); while(data3[i]!=0) { lcd_wr_data(data3[i]); i++; } i=0; lcd_wr_command(0x99); while(data4[i]!=0) { lcd_wr_data(data4[i]); i++; } i=0; lcd_wr_command(0x9C); while(data5[i]!=0) { lcd_wr_data(data5[i]); i++; }}/**************LCD畫面1********************/voidpicture_show1(){ uchari,flag=0; uinttemp; i=0; lcd_wr_command(0x81); //設(shè)置液晶屏的顯示位置 while(data6[i]!=0) { lcd_wr_data(data6[i]); i++; } lcd_wr_command(0x84); temp=(new_total_distance+old_total_distance); if(temp/1000==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/1000]); //顯示數(shù)據(jù)(字符) flag=1; } temp%=1000; if((temp/100)!=0||flag==1) { lcd_wr_data(data_show[temp/100]); //顯示數(shù)據(jù)(字符) flag=1; } else lcd_wr_data(''); temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x86); lcd_wr_data('m'); i=0; flag=0; lcd_wr_command(0x91); while(data7[i]!=0) { lcd_wr_data(data7[i]); i++; } lcd_wr_command(0x94); temp=new_part_distance; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); //顯示數(shù)據(jù)(字符) flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x96); lcd_wr_data('m'); i=0; flag=0; lcd_wr_command(0x89); while(data8[i]!=0) { lcd_wr_data(data8[i]); i++; } lcd_wr_command(0x8B); temp=new_speed; if(temp/10==0) lcd_wr_data(''); else lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x8C); lcd_wr_data('m'); lcd_wr_data('/'); lcd_wr_data('s'); i=0; old_speed=new_speed; lcd_wr_command(0x99); while(data12[i]!=0) { lcd_wr_data(data12[i]); i++; }}/**************LCD畫面2********************/voidpicture_show2(){ uchari,flag=0; uinttemp; i=0; lcd_wr_command(0x81); while(data9[i]!=0) { lcd_wr_data(data9[i]); i++; } lcd_wr_command(0x84); temp=new_acceleration; if(temp/10==0) lcd_wr_data(''); else lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x85); lcd_wr_data('m'); lcd_wr_data('/'); lcd_wr_data('s'); lcd_wr_data('2'); i=0; flag=0; lcd_wr_command(0x91); while(data10[i]!=0) { lcd_wr_data(data10[i]); i++; } lcd_wr_command(0x93); temp=new_ascent; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); //顯示數(shù)據(jù)(字符) flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x95); lcd_wr_data(0x09); i=0; flag=0; lcd_wr_command(0x89); while(data11[i]!=0) { lcd_wr_data(data11[i]); i++ ; } lcd_wr_command(0x8C); temp=calorie; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //顯示數(shù)據(jù)(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //顯示數(shù)據(jù)(字符) lcd_wr_command(0x8E); lcd_wr_data('k'); i=0; flag=0; lcd_wr_command(0x99); while(data12[i]!=0) { lcd_wr_data(data12[i]); i++ ; }}/***************LCD初始化************************/voidlcd_int(){ ret=0; //液晶屏復(fù)位 delayms_lcd(2); ret=1; delayms_lcd(2); lcd_wr_command(0x30); //啟動(dòng)液晶屏基本指令集并開啟繪圖顯示功能 lcd_wr_command(0x0c); //開顯示,關(guān)光標(biāo),不閃爍 lcd_wr_command(0x06);//字符進(jìn)入模式為:字符不動(dòng),光標(biāo)右移,地址加一 lcd_wr_command(0x01);//清屏 delayms_lcd(2);//等待清屏完成}/**********向液晶屏寫入命令子函數(shù)******************/voidlcd_wr_command(ucharcom){ en=0;//關(guān)閉通信,為設(shè)置參數(shù)做準(zhǔn)備 rs=0;//選擇指令寄存器 rw=0;//寫入液晶 en=1;//為開始通信做準(zhǔn)備 lcd_port=com; delay_n10_us(8);//大于72us的延時(shí)(根據(jù)手冊) en=0;//數(shù)據(jù)送如液晶屏并關(guān)閉通信(en的下降沿液晶屏接收數(shù)據(jù))}/********向液晶屏輸入數(shù)據(jù)子函數(shù)************/voidlcd_wr_data(uchardat){ en=0;//關(guān)閉通信,為設(shè)置參數(shù)做準(zhǔn)備 rs=1;//選擇數(shù)據(jù)寄存器 rw=0;//寫入液晶 en=1;//為開始通信做準(zhǔn)備 lcd_port=dat; delay_n10_us(8);//大于72us的延時(shí)(根據(jù)手冊) en=0;//數(shù)據(jù)送如液晶屏并關(guān)閉通信(en的下降沿液晶屏接收數(shù)據(jù))}/***********毫秒延時(shí)函數(shù),延時(shí)1ms***********/voiddelayms_lcd(uintms){ uchari; while(ms--) { for(i=0;i<121;i++); }}/***********10微秒延時(shí)函數(shù)(n*10us)***********/voiddelay_n10_us(uintn){ while(n--) { _nop_(); _nop_(); }}/*************LCD顯示畫面選擇********************/voidpicture_select(){ if(old_j==new_j) ; else { switch(new_j) { case1: lcd_int(); picture_show1(); old_j=new_j; break; case2: lcd_int(); picture_show2(); old_j=new_j; break; } }} /*************按鍵相關(guān)判斷********************/voidkey_select(){ if(key1==0) { delayms_lcd(7); if(key1==0) { new_j=2; while(key1==0); } } if(key2==0) { delayms_lcd(7); if(key2==0) { old_total_distance+=new_total_distance; new_total_distance=0; write_total_distance(); control_flag=1; while(key2==0); } } if(key3==0) { delayms_lcd(7); if(key3==0) { new_j=1; while(key3==0); } } if(key4==0) { delayms_lcd(7); if(key4==0) { old_total_distance+=new_total_distance; new_part_distance=0; while(key4==0); } }}/*************中斷函數(shù)參數(shù)設(shè)定**************/voidinterrupt_set(){ TMOD=0x11; //00010001T1、T0工作在定時(shí)方式1 TH1=(65536-10000)/256; //T1定時(shí)時(shí)間為10毫秒(10000微秒) TL1=(65536-10000)%256; TH0=(65536-20000)/256; TL0=(65536-20000)%256; ET1=1; //啟動(dòng)T1中斷允許位 ET0=1; EA=1; //啟動(dòng)總中斷允許位 TR1=1; //啟動(dòng)T1 TR0=1;}/*************T1中斷函數(shù)**************/voidtimer1()interrupt3using1{ ET1=0; //關(guān)閉T1中斷允許位 TH1=(65536-10000)/256; //重設(shè)T1定時(shí)時(shí)間為10毫秒(10000微秒) TL1=(65536-10000)%256; if(A3145_OUT==0) { part_flag=1; } ET1=1; //開啟T1中斷允許位}/*************T0中斷函數(shù)**************/voidtimer2()interrupt1using2{ TH0=(65536-20000)/256; TL0=(65536-20000)%256; time++;}/*************寫入24C02中數(shù)據(jù)************/voidwrite_total_distance(){ start_24C02(); write_one_char(0xa0); wait_ack(); write_one_char(0x01); wait_ack(); write_one_char(old_total_distance/256); wait_ack(); stop_24C02(); delayms_lcd(100); start_24C02(); write_one_char(0xa0); wait_ack(); write_one_char(0x02); wait_ack(); wr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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

提交評論