|
本帖最后由 liyihang 于 2020-4-4 16:50 編輯
51單片機(jī) 麻煩大佬幫忙看看這些問題怎么解決
電路工程文件和源程序在附件里
要實(shí)現(xiàn)的功能如下:
密碼檢測(cè)狀態(tài):系統(tǒng)啟動(dòng)時(shí),進(jìn)入密碼檢測(cè)狀態(tài),默認(rèn)顯示PA----
若正確輸入4位密碼時(shí),進(jìn)入學(xué)號(hào)顯示狀態(tài)
若輸入密碼錯(cuò)誤,數(shù)碼管顯示EE----,蜂鳴器在密碼錯(cuò)誤時(shí)發(fā)生報(bào)警,仍處于密碼檢測(cè)狀態(tài)
學(xué)號(hào)顯示狀態(tài):學(xué)號(hào)顯示nE+學(xué)號(hào)后四位,一直閃爍直到離開本狀態(tài)
按下按鍵*,可實(shí)現(xiàn)工作狀態(tài)切換
編譯時(shí)錯(cuò)誤如下圖所示:
error.png (70.73 KB, 下載次數(shù): 23)
下載附件
2020-4-4 15:45 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- sbit BEEP=P2^3;
- sbit DACS=P2^4;
- sbit DAWR=P2^5;
- sbit DULA=P2^6;
- sbit WELA=P2^7;
- //共陰數(shù)碼管段碼
- unsigned char code segCC[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //共陽數(shù)碼管段碼
- unsigned char code segCA[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //延時(shí)函數(shù)
- void Delay(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {
- for(j=0;j<32;j++); //延時(shí)
- }
- }
- //3-1、增加狀態(tài)變量,修改顯示函數(shù)Display0()
- unsigned char segWE6[]={0x01,0x02,0x04,0x08,0x10,0x20};
- unsigned char segDU6[]={0x8C,0x88,0xBF,0xBF,0xBF,0xBF};
- unsigned char segDU2[]={0xAB,0x86,0xC0,0xF9,0xA4,0xB0};
- //關(guān)鍵性變量
- unsigned char sysflg; //系統(tǒng)狀態(tài)變量,0-密碼檢測(cè),1-密碼錯(cuò)誤檢測(cè),2-學(xué)號(hào)顯示,3-DAC轉(zhuǎn)換
- //-----------------------顯示密碼檢測(cè)界面-----------------------//
- void Display0()
- {
- char i;
- for(i=0;i<6;i++)
- {
- DULA=0;WELA=0;
- P0=segWE6[i];WELA=1;WELA=0;
- P0=segDU6[i];DULA=1;DULA=0;
- Delay(5);
- }
- }
- //按鍵掃描函數(shù),返回值為對(duì)應(yīng)的按鍵編碼
- unsigned char GetKey()
- { unsigned char i,j,k=0,l;
- unsigned char KeyScanCode[]={0xef,0xdf,0xbf,0x7f}; //行列掃描的行列碼
- unsigned char KeyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};
-
- P3=0x0f;
- if(P3!=0x0f) //如果有按鍵被按下
- {
- for(i=0;i<4;i++) //依次進(jìn)行掃描
- {
- P3=KeyScanCode[i];
- for(j=0;j<3;j++)
- {
- k=i*3+j; //計(jì)算對(duì)應(yīng)的按鍵編碼
- if(P3==KeyCodeTable[k])
- {
- l=k+1; //根據(jù)鍵值調(diào)整到對(duì)應(yīng)按鍵
- if(l==11) l=0; //按鍵0,調(diào)整鍵值為0
- if(l==12) l=11; //按鍵#,調(diào)整鍵值為11,按鍵*鍵值仍為10
- return l; //返回按鍵編碼
- }
- }
- }
- }
- else
- {
- return 0xFF; //或者返回0xff
- }
- }
- void main()
- {
- //-----數(shù)碼管顯示部分-----//
- if(sysflg==0)
- {
- segDU6[0]=0x8C;
- segDU6[1]=0x88;
- Display0();
- }
- else if(sysflg==1)
- {
- segDU6[0]=0x86;
- segDU6[1]=0x86;
- Display0();
- BEEP=0;
- Delay(5);
- BEEP=1;
- Delay(3);
- }
- //-----按鍵檢測(cè)部分-----//
- keyA=GetKey();
- if(keyB!=keyA)
- {
- keyB=keyA;
- if((keyA>=0) && (keyA<10) && (sysflg<=1))
- { }
- else if(keyA==10)
- { }
- else if(keyA==11)
- { }
- }
- }
- //存儲(chǔ)的密碼
- unsigned char code pwd[]={1,2,3,4};
- if((keyA>=0) && (keyA<10) && ((sysflg<=1))
- {
- segDU6[segidx+2]=segCA[keyA];
- if(keyA!=pwd[segidx]) errflg=1;
- segidx++;
- if(segidx==4)
- {
- segidx=0;
- if(errflg==1) sysflg=1;
- else if(errflg==1) sysflg=2;
- errflg=0;
- }
- }
- //-----------------------顯示學(xué)號(hào)界面-----------------------//
- void Display2()
- {
- char i;
- for(i=0;i<6;i++)
- {
- DULA=0;WELA=0;
- P0=segWE6[i];WELA=1;WELA=0;
- P0=segDU2[i];DULA=1;DULA=0;
- Delay(5);
- }
- }
- else if(sysflg==2)
- {
- if(sysCNT<200) Display2();
- else
- {
- DULA=0;WELA=0;
- P0=0;WELA=1;WELA=0;
- P0=0;DULA=1;DULA=0;
- }
- }
-
- //====3、延時(shí)計(jì)數(shù)部分====
- sysCNT++;
- if(sysCNT==500) sysCNT=0;
- Delay(5);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī).rar
(38.91 KB, 下載次數(shù): 8)
2020-4-4 15:45 上傳
點(diǎn)擊文件名下載附件
|
-
電路圖.png
(194.15 KB, 下載次數(shù): 20)
下載附件
2020-4-4 16:38 上傳
|