单片机期末实训---- 密码锁和交通灯
生活随笔
收集整理的這篇文章主要介紹了
单片机期末实训---- 密码锁和交通灯
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
交通燈匯編代碼:
ORG 0000H LJMP MAIN A_BIT EQU 20H B_BIT EQU 21H C_BIT EQU 22H D_BIT EQU 23H TEMP1 EQU 24H TEMP2 EQU 25H TEMP3 EQU 26H TEMP4 EQU 27HORG 0003H LJMP INTER0ORG 0013H LJMP INTER1ORG 0050H MAIN: ;定義中斷MOV SP,#60HSETB IT0 ;邊沿觸發(fā)SETB EX0;允許外部中斷0SETB EX1;允許外部中斷1SETB EA;允許總中斷START: MOV R4,#00;初始自由模式還是控制模式MOV P1,#0FFHMOV P2,#0FFHMOV TEMP1,#10MOV TEMP2,#15MOV TEMP3,#15;南北顯示MOV TEMP4,#10;東西顯示MOV R3,#20;定時(shí)50ms循環(huán)次數(shù)MOV TMOD,#01H;定時(shí)器0方式一MOV TH0,#3CHMOV TL0,#0B0HSETB TR0;啟動T1;南北通行20sSETB P1.5CLR P1.4CLR P1.3SETB P1.0CLR P1.1CLR P1.2SETB P1.7;控制蜂鳴器;顯示時(shí)間 STL0P0:;軟件查詢中斷ACALL TESTACALL DISPLAY ;調(diào)用顯示DEC TEMP1DEC TEMP2MOV A,TEMP1CJNE A,#0,STL0P0;南北黃燈通行5sCLR P1.5SETB P1.4CLR P1.3SETB P1.0CLR P1.1CLR P1.2CLR P1.7;控制蜂鳴器MOV TEMP1,#05MOV TEMP2,#05;顯示時(shí)間 STL0P1:;軟件查詢中斷ACALL TESTACALL DISPLAY ;調(diào)用顯示DEC TEMP1DEC TEMP2MOV A,TEMP1CJNE A,#0,STL0P1;東西向通行5sCLR P1.5CLR P1.4SETB P1.3CLR P1.0CLR P1.1SETB P1.2SETB P1.7;顯示時(shí)間 STL0P2:;軟件查詢中斷ACALL TESTACALL DISPLAY1 ;調(diào)用顯示DEC TEMP3DEC TEMP4MOV A,TEMP4CJNE A,#0,STL0P2;東西向黃燈CLR P1.5CLR P1.4SETB P1.3CLR P1.0SETB P1.1CLR P1.2CLR P1.7;控制蜂鳴器MOV TEMP3,#05MOV TEMP4,#05;顯示時(shí)間 STL0P3:;軟件查詢中斷ACALL TESTACALL DISPLAY1 ;調(diào)用顯示DEC TEMP3DEC TEMP4MOV A,TEMP4 CJNE A,#0,STL0P3LJMP MAINDISPLAY: MOV A,TEMP1; TEMP1,#20HMOV B,#10DIV ABMOV A_BIT,BMOV B_BIT,A ;B_BIT是十位MOV A,TEMP2 ; TEMP2,#20HMOV B,#10DIV ABMOV C_BIT,A MOV D_BIT,BMOV DPTR,#NUMT LP1: ;顯示南北個十位MOV A,A_BITMOVC A,@A+DPTRMOV P0,ASETB P2.4ACALL D1MSCLR P2.4MOV A,B_BITMOVC A,@A+DPTRMOV P0,ASETB P2.5ACALL D1MSCLR P2.5;顯示東西個十位MOV A,D_BITMOVC A,@A+DPTRMOV P0,ASETB P2.6ACALL D1MSCLR P2.6MOV A,C_BITMOVC A,@A+DPTRMOV P0,ASETB P2.7ACALL D1MSCLR P2.7;查詢計(jì)數(shù)溢出JBC TF0,LP2SJMP LP1LP2: MOV TH0,#03CHMOV TL0,#0B0H ;軟件查詢中斷ACALL TEST DJNZ R3,LP1 ;未到1S,繼續(xù)循環(huán),20*50MS=1000MS=1SMOV R3,#20RETDISPLAY1:MOV A,TEMP3MOV B,#10DIV ABMOV A_BIT,BMOV B_BIT,AMOV A,TEMP4MOV B,#10DIV ABMOV C_BIT,A MOV D_BIT,BMOV DPTR,#NUMT LP3: ;顯示南北個十位MOV A,A_BITMOVC A,@A+DPTRMOV P0,ASETB P2.4ACALL D1MSCLR P2.4MOV A,B_BITMOVC A,@A+DPTRMOV P0,ASETB P2.5ACALL D1MSCLR P2.5;顯示東西個十位MOV A,D_BITMOVC A,@A+DPTRMOV P0,ASETB P2.6ACALL D1MSCLR P2.6MOV A,C_BITMOVC A,@A+DPTRMOV P0,ASETB P2.7ACALL D1MSCLR P2.7;查詢計(jì)數(shù)溢出JBC TF0,LP4SJMP LP3LP4: MOV TH0,#03CHMOV TL0,#0B0H;軟件查詢中斷ACALL TESTDJNZ R3,LP3 ;未到1S,繼續(xù)循環(huán),20*50MS=1000MS=1SMOV R3,#20RETINTER0:MOV R4,#01RETI ;中斷返回 INTER1:MOV R4,#00RETISTART1: ;南北通行SETB P1.5CLR P1.4CLR P1.3SETB P1.0CLR P1.1CLR P1.2RETSTART2:;東北通行CLR P1.5CLR P1.4SETB P1.3CLR P1.0CLR P1.1SETB P1.2RETK1K: ACALL START2SJMP KEY1;選擇模式 KEY0:CJNE R4,#01,K1K;當(dāng)R4=00或02是東西通行ACALL START1;當(dāng)01是南北通行KEY1: ACALL DELAY1;軟件查詢中斷MOV P3,#0FFHMOV A,P3CJNE A,#0FFH,PL1SJMP KEY0 PL1: ACALL DELAY1MOV P3,#0FFHMOV A,P3CJNE A,#0FFH,PL2SJMP KEY0 PL2: JNB ACC.4,K8K;定義多一個k8k,目的要遠(yuǎn)距離地址調(diào)用,如果直接跳到START,會出現(xiàn)address out rangeSJMP KEY0K8K: LJMP START;K0軟件查詢 TEST:MOV P3,#0FFHMOV A,P3CJNE A,#0FFH,L2P1RET L2P1: ACALL DELAY1MOV P3,#0FFHMOV A,P3CJNE A,#0FFH,L2P2RET L2P2: JNB ACC.4,KEY0RETD1MS: MOV R7,#250DJNZ R7,$RETDELAY1:MOV R5,#255 D1: MOV R6,#255DJNZ R6,$DJNZ R5,D1RETNUMT: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHNUMT1: DB 0C0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90HENDC語言版:
/************************************************************************************** * 交通燈實(shí)驗(yàn) * 實(shí)現(xiàn)現(xiàn)象:下載程序后,按照視頻操作正確接線,呈現(xiàn)交通燈現(xiàn)象 注意事項(xiàng): ***************************************************************************************/#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義 typedef unsigned char u8;static u16 R4=0; // static u16 flag=0; //模式切換標(biāo)志位//--定義使用的IO口--// #define GPIO_DIG P0 #define GPIO_TRAFFIC P1sbit P25 = P2^5; sbit P24 = P2^4; sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15 = P1^5; sbit P17 = P1^7; //中斷 sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值u8 DisplayData[8]; u8 Second;int interr_P33(); void _mode(); void west_east(); void north_th();/******************************************************************************* * 函 數(shù) 名 : delay * 函數(shù)功能 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us *******************************************************************************/ void delay(u16 i) {while(i--); }/******************************************************************************* * 函 數(shù) 名 : DigDisplay * 函數(shù)功能 : 數(shù)碼管動態(tài)掃描函數(shù),循環(huán)掃描8個數(shù)碼管顯示 *******************************************************************************/ void DigDisplay() {u8 i;for(i=0;i<2;i++){switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,{case(0):P25=1; P24=0 ; break;//顯示第0位case(1):P24=1; P25=0; break;//顯示第1位}GPIO_DIG=DisplayData[i];//發(fā)送段碼delay(100); //間隔一段時(shí)間掃描 GPIO_DIG=0x00;//消隱} }/******************************************************************************* * 函 數(shù) 名 : Timer0Init * 函數(shù)功能 : 定時(shí)器0初始化 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Timer0Init() {TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動。TH0=0X3C; //給定時(shí)器賦初值,定時(shí)1msTL0=0X0B0; ET0=1;//打開定時(shí)器0中斷允許IT0=1;//邊沿觸發(fā)EX0=1;//允許外部中斷0EX1=1;//允許外部中斷1EA=1;//打開總中斷TR0=1;//打開定時(shí)器 }/******************************************************************************* * 函 數(shù) 名 : main * 函數(shù)功能 : 主函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main() { Second = 1;Timer0Init();while(1){if(Second == 78){Second = 1;}//--東西通行,10秒--//if(flag==0){if(Second < 35){DisplayData[1] = smgduan[( 34- Second) % 100 / 10];DisplayData[0] = smgduan[(34 - Second) %10];DigDisplay();//--東西通行--//GPIO_TRAFFIC = 0x00; //將所有的燈熄滅P12 = 1;P11 = 0;P10 = 0;//南北紅燈P13= 1; // P14= 0; //P15 = 0; //P17 = 1;//蜂鳴器關(guān)閉}//--黃燈等待切換狀態(tài),5秒--//else if( Second < 40) {DisplayData[1] = smgduan[( 39- Second) % 100 / 10];DisplayData[0] = smgduan[(39 - Second) %10];DigDisplay();//--黃燈階段--//GPIO_TRAFFIC = 0x00; //將所有的燈熄滅P12 = 0;P11 = 1;P10 = 0;//南北紅燈P13= 1; // P14= 0; //P15 = 0; //P17 = 0;//蜂鳴器打開}//--南北通行--//else if( Second < 74) {DisplayData[1] = smgduan[( 73- Second) % 100 / 10];DisplayData[0] = smgduan[( 73 - Second) %10];DigDisplay();//--東西紅燈階段--//GPIO_TRAFFIC = 0x00; //將所有的燈熄滅P12 = 0;P11 = 0;P10 = 1;//南北綠燈P13= 0; // P14= 0; //P15= 1; //P17 = 1;//蜂鳴器關(guān)閉}//--黃燈等待切換狀態(tài),5秒--//else if( Second < 79) {DisplayData[1] = smgduan[( 78- Second) % 100 / 10];DisplayData[0] = smgduan[(78 - Second) %10];DigDisplay();//--東西紅燈--//GPIO_TRAFFIC = 0x00; //將所有的燈熄滅P12 = 0;P11 = 0;P10 = 1;//南北黃燈P13= 0; // P14= 1; //P15= 0; //P17 = 0;//蜂鳴器打開}}else if(flag==1){_mode();P17 = 1;//蜂鳴器關(guān)閉}interr_P33(); //每50ms掃描P3^4}}/******************************************************************************* * 函 數(shù) 名 : Int0() interrupt 0 * 函數(shù)功能 : 外部中斷0的中斷函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int0() interrupt 0 {delay(1000);if(P32==0){R4=1;//東西通行}}/******************************************************************************* * 函 數(shù) 名 : Int1() interrupt 0 * 函數(shù)功能 : 外部中斷1的中斷函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int2() interrupt 2 {delay(1000);if(P33==0){R4=0;//南北通行}}//程序掃描端口中斷 int interr_P33() {if(P34==0){delay(1000);if(P34==1){ return 0; }else{ TR0 = !TR0;flag=!flag;while(P34==0);return 0 ;}}return 0 ; } //自由模式 void _mode() {if(R4==0)west_east();else if(R4==1) north_th();}/******************************************************************************* * 函 數(shù) 名 : void Timer0() interrupt 1 * 函數(shù)功能 : 定時(shí)器0中斷函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Timer0() interrupt 1 {static u16 i;TH0=0X3C; //給定時(shí)器賦初值,定時(shí)50msTL0=0X0B0;i++;if(i==20){i=0;Second ++; } }//東西通行 void west_east() {//--東西通行--//P12 = 1;P11 = 0;P10 = 0;//南北紅燈P13= 1; // P14= 0; //P15 = 0; // }//南北通行 void north_th() {//--東西紅燈階段--//P12 = 0;P11 = 0;P10 = 1;//南北綠燈P13= 0; // P14= 0; //P15= 1; //}密碼鎖匯編代碼:
ORG 0000H LJMP MAIN ;定義EEPROM特殊功能寄存器 ISP_DATA DATA 0E2H ISP_ADDRH DATA 0E3H ISP_ADDRL DATA 0E4H ISP_CMD DATA 0E5H ISP_TRIG DATA 0E6H ISP_CONTR DATA 0E7H;定義ISP/IAP命令及等待時(shí)間 ISP_IAP_BYTE_READ EQU 1 ISP_IAP_BYTE_PROGRAM EQU 2 ISP_IAP_SECTOR_ERASE EQU 3 WAIT_TIME EQU 0;----89c51引腳定義----- TEMP EQU 20H RS EQU P3.7 RW EQU P3.6 E EQU P3.5 TIME EQU 23H PASSWORD EQU 2000H;EEROM起始地址 ORG 0070HMAIN: ACALL LCDMOV TEMP,#0AHMOV R4,#0;初始8位密碼輸入MOV P2,#00HSETB P2.2MOV 25H,#50H;初始保存密碼起始地址MOV 26H,#0MOV R6,#0;修改密碼標(biāo)志位;時(shí)鐘定時(shí)初始MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HACALL DISPLAYINPUTMOV 40H,#0 KEYSCAN:MOV P1,#0FFHMOV P1,#0F0H;設(shè)定高位為行線,低位為列線MOV A,P1CJNE A,#0F0H,M;判斷是否有鍵按下,有延時(shí)去抖動 SJMP KEYSCANM: ;去抖動ACALL DELAYMOV P1,#0F0HMOV A,P1CJNE A,#0F0H,MM;判斷是否有鍵還在按下,SJMP KEYSCANMM:MOV 21H,A;行為輸入,并記錄MOV P1,#0FH;設(shè)置列線為輸入MOV 31H,P1;等按鍵松開 MMM:MOV P1,#0F0HMOV A,P1CJNE A,#0F0H,MMM ;查詢行號MOV A,21HJNB ACC.4,E1JNB ACC.5,E2JNB ACC.6,E3JNB ACC.7,E4 ;設(shè)置行號初值 E1:MOV 22H,#0LJMP KEYH E2:MOV 22H,#4LJMP KEYH E3:MOV 22H,#8LJMP KEYH E4:MOV 22H,#0CHLJMP KEYRESET ;查詢列好 KEYH:MOV A,31HJNB ACC.0,D0JNB ACC.1,D1JNB ACC.2,D2JNB ACC.3,D3 ;計(jì)算鍵值 D0:CJNE R4,#8,CONTINUE;不等繼續(xù)輸,每輸入一位,減一LJMP PASS CONTINUE:MOV A,25HADD A,R4 ;R2保存密碼的地址MOV R0,AMOV A,#0ADD A,22HMOV @R0,A ;保存當(dāng)前輸入值MOV TEMP,AACALL DISPLAYNUM;顯示當(dāng)前輸入值INC R4CJNE R4,#8,RETURNLJMP PASSD1:CJNE R4,#8,CONTINUE1;不等繼續(xù)輸,每輸入一位,減一LJMP PASS CONTINUE1:MOV A,25HADD A,R4 ;R2保存密碼的地址MOV R0,AMOV A,#1ADD A,22HMOV @R0,A ;保存當(dāng)前輸入值MOV TEMP,AACALL DISPLAYNUM;顯示當(dāng)前輸入值INC R4CJNE R4,#8,RETURNLJMP PASSD2:MOV A,#2ADD A,22HCJNE A,#0AH,DD2;符合第三行SJMP DELETE DD2:CJNE R4,#8,CONTINUE2;不等繼續(xù)輸,每輸入一位,減一LJMP PASS CONTINUE2:MOV A,25HADD A,R4 ;R2保存密碼的地址MOV R0,AMOV A,#2 ADD A,22HMOV @R0,A ;保存當(dāng)前輸入值MOV TEMP,AACALL DISPLAYNUM;顯示當(dāng)前輸入值INC R4CJNE R4,#8,RETURNLJMP PASSD3:MOV A,#3ADD A,22HCJNE A,#0BH,DD3;符合第三行LJMP ENTER DD3:CJNE R4,#8,CONTINUE3;不等繼續(xù)輸,每輸入一位,減一LJMP PASS CONTINUE3:MOV A,25HADD A,R4 ;R2保存密碼的地址MOV R0,AMOV A,#3ADD A,22HMOV @R0,A ;保存當(dāng)前輸入值MOV TEMP,AACALL DISPLAYNUM;顯示當(dāng)前輸入值INC R4CJNE R4,#8,RETURNLJMP PASSRETURN:ACALL DISPLAYINPUTLJMP KEYSCANKEYRESET:MOV A,31HJNB ACC.0,SET0JNB ACC.1,NOSET SET0:;修改密碼MOV A,26HJNZ SET2;判斷是否進(jìn)入密碼確定狀態(tài)LJMP KEYSCAN SET2: ACALL DISPASSWORDRESETACALL DELAYTIMEMOV R4,#0;使能鍵盤能正常輸入MOV 25H,#60H;MOV R6,#1;進(jìn)入密碼修改狀態(tài)ACALL DISPLAYCLLLJMP KEYSCANNOSET:MOV A,40HCJNE A,#1,NOSET2MOV A,26HJNZ NOSET1;判斷是否進(jìn)入密碼確定狀態(tài) NOSET2:LJMP KEYSCAN NOSET1:LJMP MAIN;按了delete DELETE:CJNE R4,#0,DELETE2LJMP KEYSCAN DELETE2:CJNE R4,#8,DELETE3LJMP KEYSCAN;如果等于8,就是沒有輸入任何密碼來 DELETE3:MOV TEMP,#0AHACALL DISPLAYNUMDEC R4 MOV R0,25HMOV A,R4ADD A,R0 ;R2保存密碼的地址MOV R0,AMOV @R0,#0;刪了密碼,需要顯示器重新顯示ACALL DISPLAYNUMACALL BUSYMOV A,#83HADD A,R4MOV P0,A;第一韓第三個位置ACALL ENABLELJMP KEYSCAN ;密碼修改 PASSRESETOK:ACALL DISPLAYRESETOKMOV 25H,#50H;恢復(fù)保存地址MOV R6,#0;退出密碼修改狀態(tài)ACALL PASSSAVEACALL DELAYTIME;延時(shí)3sMOV 26H,#0;退出密碼修改狀態(tài)LJMP MAIN ;用戶按了enter ENTER:CJNE R4,#8,RETURN;不等于8,跳轉(zhuǎn)CJNE R6,#0,PASSRESETOK;按了確認(rèn)鍵就會跳轉(zhuǎn)到這里 PASSMATCH:MOV R3,#0ACALL ISP_READMOV R0,#50HMOV R1,#60H MATCH:MOV A,@R0MOV B,@R1CLR CSUBB A,BJNZ MATCHNOINC R0INC R1CJNE R0,#59H,MATCHSJMP MATCHYESPASSSAVE:ACALL ISP_ERASEACALL ISP_WRITERETMATCHYES:ACALL DISPLAYTRUEMOV TIME,#0SETB P2.0CLR P2.1MOV 26H,#1;密碼輸入正確狀態(tài)ACALL DELAYTIMEACALL DOYOUSETMOV 40H,#1ACALL YESORNOLJMP KEYSCANMATCHNO:ACALL DISPLAYFALSESETB P2.1CLR P2.0CLR P2.2ACALL DELAYTIMECLR TR0SETB P2.2LJMP MAIN;用戶輸入了8個密碼,繼續(xù)按其他數(shù)字按鍵無效 PASS:MOV A,26HJNZ LPLACALL DISPLAYENTERLJMP KEYSCAN LPL:CJNE R6,#1,LPL2ACALL DISPLAYENTERLJMP KEYSCAN LPL2:ACALL DISPLAYTRUELJMP KEYSCAN DELAYTIME:;顯示3s,開定時(shí)中斷MOV R5,#60SETB TR0MOV TH0,#03CHMOV TL0,#0B0H SECOND:JBC TF0,SECOND1SJMP SECOND SECOND1:MOV TH0,#03CHMOV TL0,#0B0HDJNZ R5,SECONDRETDISPLAYENTER:;顯示please enterMOV R7,#10HMOV DPTR,#PLEASEENTERACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP4:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP4;顯示完之后就跳轉(zhuǎn)RETDISPLAYNUM:;顯示數(shù)字的ACALL BUSYMOV A,#84HADD A,R4MOV P0,A;第一韓第三個位置ACALL ENABLEMOV DPTR,#NUMBERACALL BUSYMOV A,TEMPMOVC A,@A+DPTRMOV P0,AACALL DATAS;顯示數(shù)據(jù)RETDISPLAYCLL:ACALL BUSYMOV A,#80H CLL:INC AMOV P0,A;第一韓第三個位置ACALL ENABLEACALL BUSYMOV P0,#20HACALL DATAS;顯示數(shù)據(jù)CJNE A,#90H,CLLACALL BUSYMOV A,#84HADD A,R4MOV P0,A;第一韓第三個位置ACALL ENABLERETDISPLAYINPUT:;顯示input passwordMOV R7,#10HMOV DPTR,#INPUTPASSWORDACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP1:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP1;顯示完之后就跳轉(zhuǎn)RETDISPLAYTRUE:;password TRUEMOV R7,#10HMOV DPTR,#PASSWORDTRUEACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP2:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP2;顯示完之后就跳轉(zhuǎn)RETDISPLAYFALSE:;password FALSEMOV R7,#10HMOV DPTR,#PASSWORDFALSEACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLE LOOP3:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRCJNE R7,#01H,RELOOP3SJMP DISFALSETIME RELOOP3:DJNZ R7,LOOP3;顯示完之后就跳轉(zhuǎn)RETDISFALSETIME:ACALL BUSYMOV A,#0CFHMOV P0,A;第一韓第三個位置ACALL ENABLEINC TIME;輸入錯誤一次,加一MOV DPTR,#NUMBERMOV A,TIMEMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)SJMP RELOOP3DISPASSWORDRESET:;顯示修改密碼MOV R7,#10HMOV DPTR,#PASSWORDRESETACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP6:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP6;顯示完之后就跳轉(zhuǎn)RETDISPLAYRESETOK:MOV R7,#10HMOV DPTR,#PLAYRESETOKACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP9:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP9;顯示完之后就跳轉(zhuǎn)RETLCD:MOV R0,#8ACALL BUSYMOV P0,#00000001BACALL ENABLEACALL BUSYMOV P0,#00111100BACALL ENABLEACALL BUSYMOV P0,#00001111BACALL ENABLEACALL BUSYMOV P0,#00000110BACALL ENABLERETDOYOUSET:MOV R7,#10HMOV DPTR,#DOYOUSETTABACALL BUSYMOV A,#080HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP22:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP22;顯示完之后就跳轉(zhuǎn)RET YESORNO:MOV R7,#10HMOV DPTR,#YESORNOTABACALL BUSYMOV A,#0C0HMOV P0,A;第一韓第三個位置ACALL ENABLELOOP11:MOV A,#00HMOVC A,@A+DPTRACALL BUSYMOV P0,AACALL DATAS;顯示數(shù)據(jù)INC DPTRDJNZ R7,LOOP11;顯示完之后就跳轉(zhuǎn)RET ENABLE:SETB E;E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。CLR RS;RS和RW都為0,就是對應(yīng)那些指令執(zhí)行CLR RW;RW為1就是讀,為0就是寫CLR ERETBUSY:CLR EMOV P0,#0FFH;CLR RS;RS為0和RW為1,就是讀取忙標(biāo)志AC地址內(nèi)容的指令執(zhí)行,RW為1就是讀,為0就是寫SETB RWSETB E;E從0到1變化,看時(shí)序圖就能明白JB P0.7,BUSY;如果p1.7為高電平表示忙綠就循環(huán)等待,忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或數(shù)據(jù),如果為低電平表示不忙。RET DATAS:SETB ESETB RSCLR RWCLR ERETDELAY:MOV R2,#3 DE:MOV R3,#255DJNZ R3,$DJNZ R2,DERET;字節(jié)讀 ISP_READ:MOV 29H,#9MOV 27H,#60HMOV 28h,#00H READLP:MOV ISP_ADDRH,#20h ;地址高字節(jié)MOV ISP_ADDRL,28H ;地址低字節(jié)CLR EAMOV ISP_CONTR,#WAIT_TIMEMOV ISP_CONTR,#10000000BMOV ISP_CMD,#ISP_IAP_BYTE_READMOV ISP_TRIG,#46HMOV ISP_TRIG,#0B9HNOPMOV A,ISP_DATASUBB A,#10JC READLP2MOV A,#00MOV ISP_DATA,A READLP2:MOV R0,27HMOV @R0,ISP_DATAINC 27HINC 28h;以下語句可不用,只是出于安全考慮而已SETB EADJNZ 29H,READLPRET;字節(jié)編程 ISP_WRITE:MOV 29H,#9MOV 27H,#60HMOV 28H,#00H WRITELP:MOV R0,27HMOV A,@R0MOV ISP_DATA,AMOV ISP_ADDRH,#20h ;地址高字節(jié) MOV ISP_ADDRL,28H ;地址低字節(jié)CLR EAMOV ISP_CONTR,#WAIT_TIMEMOV ISP_CONTR,#10000000BMOV ISP_CMD,#ISP_IAP_BYTE_PROGRAMMOV ISP_TRIG,#46HMOV ISP_TRIG,#0B9HNOPINC 27HINC 28H;以下語句可不用,只是出于安全考慮而已SETB EADJNZ 29H,WRITELPRET;扇區(qū)擦除 ISP_ERASE:MOV ISP_ADDRH,#20h ;扇區(qū)起始地址高字節(jié)MOV ISP_ADDRL,#00h ;扇區(qū)起始地址低字節(jié);第1扇區(qū):2000h-21ffh 第2扇區(qū):2200h-23ffh;第3扇區(qū):2400h-25ffh 第4扇區(qū):2600h-27ffh;第5扇區(qū):2800h-29ffh 第6扇區(qū):2a00h-2bffh;第7扇區(qū):2c00h-2dffh 第8扇區(qū):2e00h-2fffhCLR EAMOV ISP_CONTR,#WAIT_TIMEMOV ISP_CONTR,#10000000BMOV ISP_CMD,#ISP_IAP_SECTOR_ERASEMOV ISP_TRIG,#46HMOV ISP_TRIG,#0B9HNOP;以下語句可不用,只是出于安全考慮而已SETB EARETKEYIN:DB 01H,02H,03H,04H,05H,06H,07H,08H NUMBER:DB 030H,31H,32H,33H,34H,35H,36H,37H,38H,39H,20H PASSWORDTRUE:DB 20H,50H,61H,73H,73H,77H,6FH,72H,64H,20H,74H,72H,75H,65H,20H,20H PASSWORDFALSE:DB 50H,61H,73H,73H,77H,6FH,72H,64H,20H,66H,61H,6CH,73H,65H,30H INPUTPASSWORD:DB 20H,67H,75H,67H,75H,6FH,62H,61H,6FH,20H,49H,6EH,0F0H,75H,74H,20H PLEASEENTER:DB 20H,20H,50H,6CH,65H,61H,73H,65H,20H,45H,6EH,74H,65H,72H,20H,20H PASSWORDRESET:DB 20H,50H,61H,73H,73H,77H,6FH,72H,64H,20H,72H,65H,73H,65H,74H,20H PLAYRESETOK:DB 20H,72H,65H,73H,65H,74H,20H,20H,73H,75H,63H,63H,65H,73H,73H,20H DOYOUSETTAB:DB 20H,20H,44H,6FH,20H,79H,6FH,75H,20H,72H,65H,73H,65H,74H,20H,20H YESORNOTAB:DB 20H,20H,20H,59H,65H,73H,20H,20H,20H,20H,20H,4EH,6FH,20H,20H,20HEND單片機(jī)EEROM斷電保存密碼:
EEROM在寫數(shù)據(jù)到EEROM時(shí)(我使用的是STC-AT89C52RC),需要進(jìn)行擦寫,起始擦寫就是往扇區(qū)寫入1,必須擦寫后才能寫入數(shù)據(jù),其實(shí)內(nèi)部就是與門結(jié)構(gòu)。寫入的數(shù)據(jù)有0,就與,為1就不變。
;跳線設(shè)置:默認(rèn) ;晶振11.0592 ;STC89C52單片機(jī)內(nèi)部EEPROM測試 ;按一下51hei學(xué)習(xí)板上的S4鍵,LED燈D1點(diǎn)亮,再按一下熄滅,關(guān)機(jī)撤掉電源后下次開機(jī)可狀態(tài)保存. ;注意本程序只保存D1燈的狀態(tài),其他的幾個燈初始為何值就是何值.;定義EEPROM特殊功能寄存器 ISP_DATA DATA 0E2H ISP_ADDRH DATA 0E3H ISP_ADDRL DATA 0E4H ISP_CMD DATA 0E5H ISP_TRIG DATA 0E6H ISP_CONTR DATA 0E7H;定義ISP/IAP命令及等待時(shí)間 ISP_IAP_BYTE_READ EQU 1 ISP_IAP_BYTE_PROGRAM EQU 2 ISP_IAP_SECTOR_ERASE EQU 3 WAIT_TIME EQU 0 K1 BIT P3.6 LED BIT P0.7ORG 0000H AJMP MAIN ORG 0030HMAIN:clr P1.4 ACALL ISP_READMOV P0,A LOOP:A1:ACALL DELAYJNB K1,A1CPL LEDMOV A,P0ACALL ISP_ERASEACALL ISP_WRITE NEXT:AJMP LOOP;字節(jié)讀 ISP_READ: MOV ISP_ADDRH,#20h ;地址高字節(jié) MOV ISP_ADDRL,#00h ;地址低字節(jié) CLR EA MOV ISP_CONTR,#WAIT_TIME MOV ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_IAP_BYTE_READ MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP MOV A,ISP_DATA ;以下語句可不用,只是出于安全考慮而已 MOV ISP_CONTR,#00000000B MOV ISP_CMD,#00000000B MOV ISP_TRIG,#00000000B MOV ISP_ADDRH,#0 MOV ISP_ADDRL,#0 SETB EA RET;字節(jié)編程 ISP_WRITE: MOV ISP_DATA,A MOV ISP_ADDRH,#20h ;地址高字節(jié) MOV ISP_ADDRL,#00h ;地址低字節(jié) CLR EA MOV ISP_CONTR,#WAIT_TIME MOV ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_IAP_BYTE_PROGRAM MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP ;以下語句可不用,只是出于安全考慮而已 MOV ISP_CONTR,#00000000B MOV ISP_CMD,#00000000B MOV ISP_TRIG,#00000000B MOV ISP_ADDRH,#0 MOV ISP_ADDRL,#0 SETB EA RET;扇區(qū)擦除 ISP_ERASE: MOV ISP_ADDRH,#20h ;扇區(qū)起始地址高字節(jié) MOV ISP_ADDRL,#00h ;扇區(qū)起始地址低字節(jié) ;第1扇區(qū):2000h-21ffh 第2扇區(qū):2200h-23ffh ;第3扇區(qū):2400h-25ffh 第4扇區(qū):2600h-27ffh ;第5扇區(qū):2800h-29ffh 第6扇區(qū):2a00h-2bffh ;第7扇區(qū):2c00h-2dffh 第8扇區(qū):2e00h-2fffh CLR EA MOV ISP_CONTR,#WAIT_TIME MOV ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_IAP_SECTOR_ERASE MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP ;以下語句可不用,只是出于安全考慮而已 MOV ISP_CONTR,#00000000B MOV ISP_CMD,#00000000B MOV ISP_TRIG,#00000000B MOV ISP_ADDRH,#0 MOV ISP_ADDRL,#0 SETB EA RETDELAY: MOV R6,#14H DL1:MOV R7,#19H DJNZ R7,$ DJNZ R6,DL1 RETEND轉(zhuǎn)載于:https://www.cnblogs.com/guguobao/p/9901142.html
總結(jié)
以上是生活随笔為你收集整理的单片机期末实训---- 密码锁和交通灯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标检测 Chapter1 传统目标检测
- 下一篇: 通过设置路由器DMZ主机ip,却还是没法