|
|
本帖最后由 liyihang 于 2020-4-4 16:50 編輯
51單片機 麻煩大佬幫忙看看這些問題怎么解決
電路工程文件和源程序在附件里
要實現的功能如下:
密碼檢測狀態:系統啟動時,進入密碼檢測狀態,默認顯示PA----
若正確輸入4位密碼時,進入學號顯示狀態
若輸入密碼錯誤,數碼管顯示EE----,蜂鳴器在密碼錯誤時發生報警,仍處于密碼檢測狀態
學號顯示狀態:學號顯示nE+學號后四位,一直閃爍直到離開本狀態
按下按鍵*,可實現工作狀態切換
編譯時錯誤如下圖所示:
error.png (70.73 KB, 下載次數: 23)
下載附件
2020-4-4 15:45 上傳
單片機源程序如下:
- #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};
- //共陽數碼管段碼
- unsigned char code segCA[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //延時函數
- void Delay(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {
- for(j=0;j<32;j++); //延時
- }
- }
- //3-1、增加狀態變量,修改顯示函數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 sysflg; //系統狀態變量,0-密碼檢測,1-密碼錯誤檢測,2-學號顯示,3-DAC轉換
- //-----------------------顯示密碼檢測界面-----------------------//
- 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);
- }
- }
- //按鍵掃描函數,返回值為對應的按鍵編碼
- 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; //計算對應的按鍵編碼
- if(P3==KeyCodeTable[k])
- {
- l=k+1; //根據鍵值調整到對應按鍵
- if(l==11) l=0; //按鍵0,調整鍵值為0
- if(l==12) l=11; //按鍵#,調整鍵值為11,按鍵*鍵值仍為10
- return l; //返回按鍵編碼
- }
- }
- }
- }
- else
- {
- return 0xFF; //或者返回0xff
- }
- }
- void main()
- {
- //-----數碼管顯示部分-----//
- 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);
- }
- //-----按鍵檢測部分-----//
- keyA=GetKey();
- if(keyB!=keyA)
- {
- keyB=keyA;
- if((keyA>=0) && (keyA<10) && (sysflg<=1))
- { }
- else if(keyA==10)
- { }
- else if(keyA==11)
- { }
- }
- }
- //存儲的密碼
- 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;
- }
- }
- //-----------------------顯示學號界面-----------------------//
- 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、延時計數部分====
- sysCNT++;
- if(sysCNT==500) sysCNT=0;
- Delay(5);
- }
- }
復制代碼
所有資料51hei提供下載:
單片機.rar
(38.91 KB, 下載次數: 8)
2020-4-4 15:45 上傳
點擊文件名下載附件
|
|