51單片機,基本功能已全部完成,有幾個未定義錯誤,麻煩大佬幫忙看看具體怎么定義謝謝!
電路工程文件和源程序在附件里
要實現(xiàn)的功能如下:
密碼檢測狀態(tài):系統(tǒng)啟動時,進入密碼檢測狀態(tài),默認顯示PA----
若正確輸入4位密碼時,進入學(xué)號顯示狀態(tài)
若輸入密碼錯誤,數(shù)碼管顯示EE----,蜂鳴器在密碼錯誤時發(fā)生報警,仍處于密碼檢測狀態(tài)
學(xué)號顯示狀態(tài):學(xué)號顯示nE+學(xué)號后四位,一直閃爍直到離開本狀態(tài)
按下按鍵*,可實現(xiàn)工作狀態(tài)切換
DAC輸出狀態(tài):DAC輸出狀態(tài)啟動DAC0832,實時顯示dAC+3位輸出值,默認值為255
單片機源程序如下:
- #include<reg51.h>
- sbit BEEP = P2^3;
- sbit DACS = P2^4;
- sbit DAWR = P2^5;
- sbit DULA = P2^6;
- sbit WELA = P2^7;
- 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ù)碼管段碼
- //關(guān)鍵性變量
- unsigned char sysflg; //系統(tǒng)狀態(tài)變量,0-密碼檢測,1-密碼錯誤檢測,2-學(xué)號顯示,3-DAC轉(zhuǎn)換
- //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};
- unsigned char segDU3[] = { 0xA1, 0x88, 0xC6, 0xA4, 0x92, 0x92};
- void Delay(unsigned int i)//延時函數(shù)
- {
- unsigned int j;
- while(i--)
- {
- for(j=0;j<32;j++); //延時
- }
- }
- //-----------------------顯示密碼檢測界面-----------------------//
- 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);
- }
- }
- //-----------------------顯示學(xué)號界面-----------------------//
- 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);
- }
- }
- //-----------------------顯示dac界面-----------------------//
- void Display3()
- {
- char i;
- for( i = 0; i < 6; i++)
- {
- DULA = 0;WELA = 0;
- P0 = segWE6[i]; WELA = 1; WELA = 0;
- P0 = segDU3[i]; DULA = 1; DULA = 0;
- Delay(5);
- }
- }
- //------------按鍵掃描函數(shù),返回值為對應(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++) //依次進行掃描
- {
- P3 = KeyScanCode[i];
- for( j = 0; j < 3; j++)
- {
- k = i*3+j; //計算對應(yīng)的按鍵編碼
- if(P3 == KeyCodeTable[k])
- {
- l = k+1; //根據(jù)鍵值調(diào)整到對應(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
- }
-
- return 0;
- }
- void main(void)
- {
- unsigned char code pwd[]={1,2,3,4}; //存儲的密碼
- unsigned char keyA = 0,keyB = 0,segidx = 0,errflg = 0,sysCNT = 0;
- while(1)
- {
- //-----1、數(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);
- }
- else if(sysflg == 2)
- {
- P1=0; //關(guān)閉DAC
- DACS=1;
- DAWR=1;
-
- //閃爍顯示學(xué)號
- if(sysCNT < 200)Display2();
- else
- {
- DULA = 0;WELA = 0;
- P0 = 0;WELA = 1;WELA = 0;
- P0 = 0;DULA = 1;DULA = 0;
- }
- }
- else if(sysflg == 3)
- {
- DACS=0; //開啟DAC
- DAWR=0;
- P1=DAC;
- Display3();
- }
-
-
- //-----2、按鍵檢測部分-----//
- keyA = GetKey();
- if(keyB != keyA)
- {
- keyB = keyA;
- if((keyA >= 0) && (keyA < 10))
- { if(sysflg <= 1)
- { segDU6[segidx+2] = 0xBD;
- 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;
- segDU6[2] = 0xBF;segDU6[3] = 0xBF;
- segDU6[4] = 0xBF;segDU6[5] = 0xBF;
- }
- }
- else if(sysflg == 3)
- { segDU3[segidx+3] = segCA[keyA];
- DACtmp = DACtmp*10+keyA;
-
- segidx++;
-
- if(segidx == 3)
- {
- segidx = 0;
-
- if(DACtmp >=255)
- { DACtmp = 255;
- segDU3[3] = 0xA4;
- segDU3[4] = 0x92;
- segDU3[5] = 0x92;
- }
- DAC = DACtmp;
- DACtmp = 0;
- }
- }
- else if(keyA == 10)
- {
- if(sysflg == 2) sysflg = 3;
- else if(sysflg == 3) sysflg = 2;
- }
- else if(keyA == 11)
- { }
- }
-
- //-----3、延時計數(shù)部分-----//
- sysCNT++;
- if(sysCNT == 500) sysCNT = 0;
- Delay(5);
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
2020.4.12.rar
(39.5 KB, 下載次數(shù): 13)
2020-4-12 15:11 上傳
點擊文件名下載附件
|