![]() |
感謝樓主 |
好用 謝謝 |
樓主好人 |
樓主好人 |
非常有用 |
感謝大佬的分享 |
請問為什么運行以后,液晶屏上一直是閃爍的,全暗或者全亮。 |
zyq2367503734 發(fā)表于 2019-6-16 06:09 軟件里面你自己看懂了就會設置了,超級簡單 |
感謝大佬 |
學習一下,謝謝LZ。! |
感謝大佬![]() |
好用· |
可以使用 |
為什么鎖定倒計時只能30秒,后邊就無限循環(huán)了 |
為什么程序燒到普中的51單片機上數(shù)碼管不能完全顯示出來 |
好資料,51黑有你更精彩!! |
感謝分享 正愁著沒有思路 |
感謝大佬 |
附錄一 程序源代碼 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; #define GPIO_DIG P0 //數(shù)碼管送數(shù)據(jù) #define GPIO_KEY P1 //矩形按鍵 sbit LSA=P2^0; //數(shù)碼管位選 sbit LSB=P2^1; sbit LSC=P2^2; sbit k1=P2^3; //獨立按鍵 sbit k2=P2^4; sbit beep=P3^0; //蜂鳴器 sbit led=P3^1; //LED開鎖 char srmm[8]= //輸入密碼 {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08}; char ysmm[8]= //原始密碼1111 1111 {0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06}; u8 code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; u16 b,n,x,y,i,mm,ss,m1,m2,s1,s2,z=0,j=1,s=0,m=0,t=0; u8 Mima; // 存放密碼 u8 KeyValue; // 按鍵值定義 void delay(u16 i) //延時函數(shù) {while(i--);} void shuoding() //鎖定 { mm=1;ss=30; m2=mm/10;m1=mm%10; s2=ss/10;s1=ss%10; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t++; if(t==20) { t=0;ss--; if(ss==0) {j=1;} } m2=mm/10;m1=mm%10; s2=ss/10;s1=ss%10; } void bep() //蜂鳴器函數(shù) { for(b=0;b<100;b++) { beep=~beep; delay(50); } b=0; } void xgmm() //修改密碼顯示函數(shù) { for(n=0;n<=7;n++) {srmm[n]=0x01;} } void dsmm() //待輸入密碼顯示函數(shù) _ _ _ _ _ _ _ _ { for(n=0;n<=7;n++) {srmm[n]=0x08;} } void mmzq() //密碼正確顯示函數(shù) - - - - - - - - { for(n=0;n<=7;n++) {srmm[n]=0x40;} } void DigDisplaysr() //輸入顯示函數(shù) {for(i=0;i<8;i++) {switch(i) { case(0):LSA=0;LSB=0;LSC=0;P0=srmm[0];break;//顯示第0位 case(1):LSA=1;LSB=0;LSC=0;P0=srmm[1];break;//顯示第1位 case(2):LSA=0;LSB=1;LSC=0;P0=srmm[2];break;//顯示第2位 case(3):LSA=1;LSB=1;LSC=0;P0=srmm[3];break;//顯示第3位 case(4):LSA=0;LSB=0;LSC=1;P0=srmm[4];break;//顯示第4位 case(5):LSA=1;LSB=0;LSC=1;P0=srmm[5];break;//顯示第5位 case(6):LSA=0;LSB=1;LSC=1;P0=srmm[6];break;//顯示第6位 case(7):LSA=1;LSB=1;LSC=1;P0=srmm[7];break;//顯示第7位 }delay(100);P0=0x00; } } void daojishi() //鎖定后倒計時顯示 { for(i=0;i<8;i++) { switch(i) { case(0): LSA=0;LSB=0;LSC=0;P0=0x00;break; case(1): LSA=1;LSB=0;LSC=0;P0=0x00;break; case(2): LSA=0;LSB=1;LSC=0;P0=table[m2];break; case(3): LSA=1;LSB=1;LSC=0;P0=table[m1];break; case(4): LSA=0;LSB=0;LSC=1;P0=0x40;break; case(5): LSA=1;LSB=0;LSC=1;P0=table[s2];break; case(6): LSA=0;LSB=1;LSC=1;P0=table[s1];break; case(7): LSA=1;LSB=1;LSC=1;P0=0x00;break; }delay(100);P0=0x00; } } void key() //獨立按鍵掃描 { if(k1==0) { delay(100); if(k1==0) {j=1;dsmm();led=0;} while(!k1); } if(k2==0) { delay(2); if(k2==0) {j=2;xgmm();led=0;} while(!k2); } } void KeyDownsr(void) //矩形按鍵掃描 { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) //讀取按鍵是否按下 { delay(1000); //延時10ms進行消抖 if(GPIO_KEY!=0x0f) //再次檢測鍵盤是否按下 { GPIO_KEY=0X0F; //測試列 switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } GPIO_KEY=0XF0; //測試行 switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測 {delay(1000);a++;} switch(KeyValue) //給相應的按鍵賦值 { case(0):Mima=0x06; break; case(1):Mima=0x5b; break; case(2):Mima=0x4f; break; case(3):break; case(4):Mima=0x66; break; case(5):Mima=0x6d; break; case(6):Mima=0x7d; break; case(7):break; case(8):Mima=0x07; break; case(9):Mima=0x7f; break; case(10):Mima=0x6f; break; case(11):Mima=0x3f; break; case(12):break; case(13):break; case(14):break; case(15):break; case(16):break; }srmm[s]=Mima;s++;bep(); } } } void main() { led=0; while(1) { key(); if(j==1) { do { KeyDownsr();DigDisplaysr(); if(s==8) { s=0;m=0; if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7]) {mmzq();led=1;z=0;} else { z++;dsmm(); if(z==3) {led=0;z=0;shuoding(); while(mm!=0||ss!=0) {daojishi();} } } } }while(m==8);if(m==8){m=0;} } if(j==2) { while(m<8) {KeyDownsr();DigDisplaysr(); if(s==8) { s=0;m=0; if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7]) {mmzq();z=0;led=1; while(m<8) { KeyDownsr();DigDisplaysr(); if(s==8) { for(x=0;x<=7;x++) {ysmm[x]=srmm[x];} s=0;led=0; } }j=1;dsmm(); } else {z++;xgmm(); if(z==3) {z=0;shuoding(); while(mm!=0||ss!=60) {daojishi();} } }s=0; } } if(m==8)m=0; } } } |
電氣信息學院 設計任務書 名稱 電子密碼鎖設計 時間 一、任務及要求 設計任務: 本課題要求以MCS-51系列單片機為核心,設計一個簡易電子密碼鎖。 (1)具備密碼輸入、密碼修改功能; (2)*其它功能 設計要求: (1)確定系統(tǒng)設計方案; (2)進行系統(tǒng)的硬件設計; (3)完成應用程序設計; (4)應用系統(tǒng)的硬件和軟件的調試。 二、進度安排 第一周: 周一:集中布置設計任務和相關事宜,查資料確定系統(tǒng)總體方案。 周二~周三:完成硬件設計和電路連接 周四~周日:完成軟件設計 第二周: 周一~周三:程序調試 周四~周五:設計文檔撰寫。周五進行和設計結果檢查。 三、參考資料 1、王迎旭等.單片機原理及及應用[M]. 2版.機械工業(yè)出版社,2011 2、胡漢才.單片機原理及其接口技術[M].3版.清華大學出版社,2010 目 錄 第一章 設計任務及要求 1 1.1 設計任務 1 1.2 設計要求 1 第二章 系統(tǒng)方案設計 1 2.1 設計框圖 1 2.2 框圖簡介 1 第三章 系統(tǒng)硬件電路設計 2 3.1 單片機最小系統(tǒng) 2 3.2 按鍵電路 2 3.3 顯示電路 3 3.4 LED指示開鎖燈、蜂鳴器 4 第四章 系統(tǒng)軟件設計 4 4.1 程序流程圖 4 4.2 程序簡介 5 第五章 系統(tǒng)仿真及調試 5 5.1 軟件仿真及調試 5 5.2 實物調試 6 第六章 總結與設計調試體會 8 附錄一 程序源代碼 9 附錄二 硬件電路圖 14 第七章 電氣信息學院設計評分標準 15 |
Powered by 單片機教程網(wǎng)