圖片預覽:
作品簡介:
智能里程速度防盜報警器是傳統機械式里程速度表的一種替代。它利用數字電子技術準確的測出車所行駛的即時速度和所行駛的里程。由于傳統機械式里程速度表是通過金屬軟軸連通車輪和機械里程表的,軟軸反復扭轉易斷裂損壞,導致里程表不能工作。而智能測速里程防盜報警器不僅僅具有傳統機械式里程速度表的所有功能,它還具備一下功能:
★智能語音播報
儀器可以智能檢測車所行駛的速度,每到10km/h的整倍數時,系統會語音提示駕駛者現在的速度(主要服務于疲勞駕車和酒后駕車人員),它不僅僅能播報速度,還有其它一系列的人性化的語音。
★防盜報警
當車被移動的時候,防盜報警系統首先會發出語音提示不明身份者,與車保持適當距離,如果車仍被移動防盜報警系統就會發出警報聲,同時還可以智能撥出車主手機,在第一時間通知車的主人。
(由于大賽時間緊迫,如果時間充裕的話計劃在車主接通車所撥打的電話時,車主可以通過電話向車通話,裝設在車上的揚聲器把車主的話語傳達給不明身份者。)
★電子密碼鎖
用戶可以自己設定/修改密碼鎖的密碼。
用戶可以設置三種鎖定模式:
? 用戶可以直接用鑰匙就能打開車,同時取消報警。
? 用戶可以設置為密碼鎖和鑰匙同時打開時,車才能打開同時取消報警。
? 用戶可以用密碼和鑰匙,其中的一種方式就打開車同時取消報警。
三種模式設置如下:
ü 當密碼最后一位定為 1 時,啟用第一種模式;
ü 當密碼最后一位定為 2 時,啟用第二種模式;
ü 當密碼最后一位定為 3時,啟用第三種模式。
★區間計程/計時功能
能測量從a地到b地距離和所用的時間。
★數字時鐘顯示
顯示一天中的時刻。(由于時間緊,時間語音的設計暫時取消。)
圖一(內部構造圖)
原理簡介:2 電子測速里程防盜報警器核心是由單片機控制。外圍設備有12864LCD,ISD4004語音芯片,霍爾傳感器,AT93C66存儲塊,4*4鍵盤,手機模塊等。(如圖一,內部構造圖)
2 單片機是儀器的大腦,它負責接收來自外圍設備的信息,經處理后輸出到控制外圍設備。
2 霍爾傳感器檢測車所行駛的速度,把脈沖信號發給單片機,由單片機分析后輸出控制其它外圍設備。
2 如圖二(語音錄制電路)
12864LCD是儀器的顯示器,它接受由單片機傳來的指令,來顯示相應的數據文字。2 ISD4004語音芯片,它接受由單片機傳來的指令,發出相應的語音或警報。(如圖二,語音錄制電路)
2 AT93C66存儲塊是用來存放用戶設定的密碼和里程記錄,防止因掉電所有數據丟失。
2 手機模塊是用來向車主發盜車信號的,它接收到單片機發出的指令時撥通車主所設定手機號碼,通知車被盜。
2 4*4鍵盤是用來輸入密碼、調整時間、解鎖、加鎖、密碼修改、計程/計時復位。
作品的推廣前景:
現在很多汽車,摩托車用的都是機械式里程表,而且大部分電動車測速是通過測量馬達所加電壓的大小來判斷速度的,準確性欠佳。而智能里程速度防盜報警器克服了其所有缺點,準確性高,不具有機械磨損,而且集成了人性化的報警系統。很適合裝設在汽車,摩托車,電動車等機動車.
以下是此項目的程序代碼,由于本文篇幅有限完整的代碼我壓縮為rar文件傳上了服務器提供下載: http://www.zg4o1577.cn/ziliao/file/yybhhq.rar 由于學識有限有諸多不完善的地方,本人十分渴望各路大蝦多多指教,共同探討提高!謝謝!
本人還希望各路英雄也能貢獻出自己的程序代碼,讓每一個人相互借鑒,相互提高!
程序代碼如下:
//****************************************** // 標題:電子測速里程防盜報警器 */ // 作者:蓋書永 */ // 單片機選用AT89S52 8內存 */ // 語音芯片選用ISD4004-8pm */ // 數據存儲塊選用AT89C66 2k */ // 采用4*4掃描鍵盤 */ // 電子測速里程防盜報警器是傳統機械式里程速度 // 表的一種替代。它利用數字電子技術準確的測出車 // 所行駛的即時速度和所行駛的里程。但它并不是單 // 純的里程速度表,它還具備其它功能: // 智能語音播報 // 防盜報警 // 電子密碼鎖 // 區間計程/計時功能 // 數字時鐘顯示 //***************************************** #include<reg51.h> #include<intrins.h> void speed(); void put_str_xy(unsigned char x,unsigned char y,unsigned char code *s); #define CS p0^0 #define SK p0^1 #define DI P0^2 #define DO P0^3 sbit ss=P1^6; sbit sclk=P3^1; sbit mosi=P3^0; sbit miso=P1^7; sbit CSPIN = P1^4; sbit RSTPIN= P1^3; sbit A0PIN = P1^2; sbit SCLPIN= P1^1; sbit SIPIN = P1^0; //************************************** #define READ 0X0C00 #define EWEN 0X0980 #define WRITE 0X0A00 #define EWDS 0X0800 #define shiftbit 4 #define LCD_CMD_ON 0xaf #define LCD_CMD_PAGE 0xb0 #define LCD_CMD_COL 0x40 #define LCD_LEFT 0 #define LCD_TOP 0 #define LCD_RIGHT 127 #define LCD_BOTTOM 63 unsigned char counter[4]={0,0,0,0}, timer_tick[2]={0,0}, mile[3]={0,0,0},v=0,operation,lock,z,y, second,minute,hour,minute1,hour1; unsigned char password[5]={1,2,3,4,5}; unsigned char guess[5]={0,0,0,0,0}; unsigned char temp[5]={0,0,0,0,0}; code unsigned char key_code[]={0XD7,0XEE,0XDE,0XBE, 0XED,0XDD,0XBD,0XEB, 0XDB,0XBB,0XE7,0XB7, 0X7E,0X7D,0X7B,0X77 }; code unsigned char ksp[4]={0X7F,0XBF,0XDF,0XEF}; //***************************************** //****************************************** //初始化定時器0 //***************************************** static void timer0_initialize(void) {EA=0; TR0=0; TMOD=0X01; TL0=(0XEE11&0X00FF); TH0=(0XEE11>>8); PT0=0; ET0=1; TR0=1; EA=1; } //*************************************** //外部中斷初始化 //*************************************** static void xint0_initialize(void) {EA=0; IT0=0; EX0=1; EA=1; } //**************************************** //0.05秒中斷一次,且一秒時停止脈沖計數 //***************************************** static void timer0_isr(void)interrupt 1 using 1 {TR0=0; TL0=(0XEE11&0X00FF); TH0=(0XEE11>>8); TR0=1; timer_tick[0]++; if(timer_tick[0]==200) {timer_tick[0]=0; counter[4]=counter[0]; counter[0]=0; speed(); //時間部分 second++;; if(second==60) { second=0;minute++;minute1++; if(minute==60) {minute=0;hour++; if(hour==24) hour=0; } } if(operation==0) {put_str_xy(0,0,"hour:minute:second"); put_str_xy(0,0,"minute1"); } } //********************************************** //外部中斷累加脈沖程序里程計算 //********************************************** static void t0_isr(void) interrupt 0 { counter[0]++; counter[1]++; counter[2]++; if(counter[1]==242) //半公里所需的脈沖數 { if(operation==0) {put_str_xy(0,0,"5"); put_str_xy(0,0,"5"); } } if(counter[1]==484) //一公里所需的脈沖數 {counter[1]==0; mile[0]++;mile[1]++; if(operation==0) {put_str_xy(0,0,"mile[0]"); put_str_xy(0,0,"mile[1]"); } write_bety(x,mile1); } if(lock==0) {if(counter==_____?_____) p3^7=1; counter2=0; } } //************************************ //速度計算程序 //************************************ void speed() {if(operation==0) put_str_xy(0,0,"counter[4]"); swich(counter[4]) {case 10 : isd_setpaly(0X00.0X00);break; case 20 : isd_setpaly(0X00.0X00);break; case 30 : isd_setpaly(0X00.0X00);break; case 40 : isd_setpaly(0X00.0X00);break; case 50 : isd_setpaly(0X00.0X00);break; case 60 : isd_setpaly(0X00.0X00);break; case 70 : isd_setpaly(0X00.0X00);break; case 80 : isd_setpaly(0X00.0X00);break; case 90 : isd_setpaly(0X00.0X00);break; case 100 : isd_setpaly(0X00.0X00);break; case 110 : isd_setpaly(0X00.0X00);break; case 120 : isd_setpaly(0X00.0X00);break; } } //************************************* //時間調整函數 //調整時程序 //************************************* void key(void) {if(p2==_____________) hour++; if(hour>=24) hour=0; } //***************************************** //調整分程序 //***************************************** void key1(void) {if(p2==_____________) minite++; if(minite>=60) minite=0; } //***************************************** //電子防盜和密碼鎖程序 //***************************************** unchar getsecret(uchar x,uchar y) {char keys; do{put_str_xy(0,0,"_"); keys=gotkey(); put_str_xy(0,0,"*"); }while(keys>9) return(keys); } //*************************************** void get_password() {unsigned char i; for(i=0;i<5;i++) guess{i}=getsecret(x,i); } //**************************************** uchar check_password() {unsigned char i; i=0; if(p0^6=1) return(1); while((guess==password)&&(i<5))i++; if(i==5) return(1); else return(0); } //***************************************** uchar input_new_password() {unsigned char i,j; lcdfill(0X00); delay(5000); put_str_xy(0,0,"new_password"); for(i=0;i<5;i++) temp=getsecret(x,i); lcdfill(0X00); delay(5000) put_str_xy(0,0,"cofirm"); for(i=0;i<5;i++) guess=getsecret(x,i); i=0; while((guess==temp)&&(i<5)) i++; if(i==5); {for(j=0;j<5;j++) {password[j]=temp[j]; write_byte(j,paaword[j]); } return(1); } else return(0); }