【正文】
圖20 主程序流程圖5 系統(tǒng)仿真與硬件調(diào)試 系統(tǒng)仿真和調(diào)試方案根據(jù)上述各個(gè)模塊的功能以及PCB設(shè)計(jì)可用PROTEUS來進(jìn)行仿真,修改程序。因此,先寫矩陣鍵盤控制密碼鎖的程序。一般按鍵如果電路正確,并且程序和硬件都無差錯則在仿真中運(yùn)行正確實(shí)物也可以輕松實(shí)現(xiàn)器功能。經(jīng)過對程序的調(diào)試,讓此時(shí)存儲器隨機(jī)出現(xiàn)的密碼顯示到1602上,然后再在開鎖時(shí)鍵入對應(yīng)的密碼,此時(shí)密碼正確。 調(diào)試結(jié)果本次設(shè)計(jì)整體調(diào)試結(jié)果:給電路板送入+5V電源,1602第一行中間顯示wele,然后按解鎖鍵,1602第一行顯示input code 此時(shí)輸入密碼再按確定鍵。由于相同功能的芯片有很多,經(jīng)過對比其實(shí)用性,是否易操作,外圍電路以及程序設(shè)計(jì)難易等等來選擇較合理的芯片。另外,還要感謝趙老師,總是在百忙之余指導(dǎo)我,幫我解決了不少難題,讓我順利完成了設(shè)計(jì)。/****紅外延時(shí)函數(shù)聲明*****/void delay(uint)。//蜂鳴器void delay(unsigned char x) //x*{ unsigned char i。uchar key=0,keycounts=0,t_num=0。uchar code tab8[]={Complete! }。sbit led=P2^3。 for(x=t。 LCD_Data=WDLCD。 en=0。= 0xF。}/*******************1602按指定位置顯示一串字符函數(shù)*********************/void DisplayListChar(uchar X, uchar Y, uchar code *DData){ uchar ListLength。)//若到達(dá)字串尾則退出 { if (X = 0xF)//X坐標(biāo)應(yīng)小于0xF { DisplayOneChar(X, Y, DData[ListLength])。 delay11()。 scl=0。(i250)) i++。 scl=0。 sda=1。i8。 write_byte(AddWr)。 start()。 indata=read_byte()。0xff。 dword indata=0。 delay2(1)。}/*****************************24C02驅(qū)動*********************************//***************************定時(shí)器1中斷*********************************/void IR_IN() interrupt 1{ unsigned char j,k,N=0。 } //確認(rèn)IR信號出現(xiàn)/**/ while (!IRIN) //等IR變?yōu)楦唠娖?,跳過9ms的前導(dǎo)低電平信號。} while (!IRIN) //等 IR 變?yōu)楦唠娖? delay(1)。 //數(shù)據(jù)最高位補(bǔ)“1” } N=0。 if(IRCOM[6]9) { IRCOM[6]=IRCOM[6]+0x37。break。led=1。 //串口發(fā)送08 case 0x41:key=9。//改密 (CH) case 0x47:key=10。 temp_h=keypadamp。 return 1。temp)) { switch(temp) { case 0xee:key=0。 case 0xed:key=3。 //鎖定鍵 break。//改密碼 break。//確定 default: break。 if((!getkeycode(amp。i++){ temp=(DData(8*i))amp。 delay(3000)。 refresh_display(0,1,cls)。*39。keycounts==PASSWORD_LENGTH)break。 else dispassword_=0。INPUT_PASSWORD)。 return。 while(status){ refresh_display(0,1,cls)。 //temp=get_preserve_password()。 if(input_password(amp。 //refresh_display(0,1,cls)。 case 14:PasswordUnLock()。 TR0=1。 WrToROM_dword(PASSWORD_ADDR,default_passwords)。 //else refresh_display(0,0,tab3)。 //refresh_display(0,1,cls)。 yi)。against the disciplinary action your employer has taken against you. However, if you win your case, the tribunal may reduce any pensation awarded to you as a result of your failure to appeal.Remember that in most cases you must make an application to an employment tribunal within three months of the date when the event you are plaining about happened. If your application is received after this time limit, the tribunal will not usually accept it.If you are worried about how the time limits apply to you, take advice from one of the organisations listed underTo find your nearest CAB, including those that give advice by , click onfor the racist behaviour of their fans during總覺得自己自己似乎應(yīng)該去做點(diǎn)什么,或者寫點(diǎn)什么。s actions.CSKA said they were surprised and disappointed by Toure39。s 150th anniversary celebrations and will attend City39。t charge you more than 35% of your pensation your employer dismisses you and you think that you have been dismissed unfairly.For more information about dismissal and unfair dismissal, see _nop_()。 //refresh_display(0,1,tab1)。} refresh_display(0,1,cls)。 //refresh_display(0,0,message[tempamp。 LCD_Init()。 TH0=(6553650000)/256。 delay2(1000)。 preserve_set_password(SETUP_PASSWORD1)。 delay2(1000)。SETUP_PASSWORD1)。 delay(1000)。 delay2(1000)。}void PasswordUnLock(){ dword INPUT_PASSWORD=0。amp。 } } if(key==12){ keycounts=0。 if(key=0amp。*/}/***********************待擴(kuò)展**************************************///void DO_OTHERTHING()。 delay2(1000)。}void preserve_set_password(dword passwords){ WrToROM_dword(PASSWORD_ADDR,passwords)。 } } else if(keystatusflagamp。 // 解鎖 break。 break。 case 0xbd:key=5。 case 0xbe:key=2。amp。 temp_l=keypadamp。 } EX1 = 1。//解鎖(CH—) case 0x09:key=11。 //串口發(fā)送06 case 0x42:key=7。break。0x0f))。 0x0F。 return。j++) //收集四組數(shù)據(jù) { for (k=0。 EX1 = 0。}void init_24C02() //初始化{ sda=1。i++){ temp=RdFromROM_Byte(address+3i)。 WrToROM_Byte(address+i,temp)。 //refresh_display(0,1,cls)。 respons()。 write_byte(indata)。 scl=0。 delay11()。 scl=1。 temp=indata。 scl=1。 scl=1。 delay11()。 X amp。// 算出指令碼 LCD_WriteCommand(X)。 //讀寫一個(gè)字符后,地址指針及光標(biāo)加一,且光標(biāo)加一整屏顯示不移動 LCD_WriteCommand(0x80)。 rw=0。y)。void DisplayOneChar(uchar X, uchar Y, uchar DData)。uchar code message[16]={0123456789abcdef}。uchar code tab4[]={Wele enter }。sbit scl=P2^5。void delay1(int ms)。_nop_()。每一次失敗都會離成功又進(jìn)一步。若兩次密碼相同,則1602顯示plete。4)紅外遙控模塊首先寫一個(gè)紅外遙控發(fā)送接收程序,看是否將字符正確顯示到1602上。此時(shí)程序中還要進(jìn)行密碼的對比,若正確,led亮,說明鎖已經(jīng)打開。將1602的顯示程序通過學(xué)習(xí)板燒到做好的電路板中,檢測1602是否正常顯示,若1602只亮屏不顯示字符此時(shí)調(diào)節(jié)滑動變阻器改變對比度。實(shí)際電路中,管腳3應(yīng)接10K滑動變阻器,管腳15接10歐電阻。所以,當(dāng)密碼錯誤時(shí),給IO口送低電平即可達(dá)到報(bào)警效果。先寫24c02的驅(qū)動程序,時(shí)鐘信號,讀寫數(shù)據(jù)等等,要考慮怎么將密碼寫入到24c02中,以及從中讀取等問題。電源部分采用的是USB給單片機(jī)提供+5V的電源,發(fā)光二極管來指示有沒有給單片機(jī)供電。外觀如下: 圖15 紅外接收頭VS_1838b由于密碼采用雙控模式,在主控模塊采用矩陣鍵盤進(jìn)行密碼的輸入及修改,因此,將紅外接收端接到單片機(jī)的外部中斷1來檢測是否有紅外信號,進(jìn)而判斷遙控器是否有按鍵按下,并進(jìn)行密碼的輸入與修改。管腳圖如圖7所示: 圖7 AT24c02管腳圖表1 AT24c02管腳功能管腳名稱管腳功能A0、AA2器件地址選擇SDA串行數(shù)據(jù)/地址SCL串行時(shí)鐘WP寫保護(hù)Vcc+Vss接地圖8存儲器地址位下圖為24C02在硬件中的的連接圖,根據(jù)各個(gè)管腳功能只需把A0、AAwp接地,按照I2C協(xié)議,時(shí)鐘線SCL和數(shù)據(jù)線SDA需接10K上拉電阻。LCD1602具有很高的性價(jià)比,且應(yīng)用很廣泛。最小系統(tǒng)包括上電復(fù)位電路和晶振電路【