51单片机,基本功能已全部完成,有几个未定义错误,麻烦大佬帮忙看看具体怎么定义谢谢!
电路工程文件和源程序在附件里
要实现的功能如下:
密码检测状态:系统启动时,进入密码检测状态,默认显示PA----
若正确输入4位密码时,进入学号显示状态
若输入密码错误,数码管显示EE----,蜂鸣器在密码错误时发生报警,仍处于密码检测状态
学号显示状态:学号显示nE+学号后四位,一直闪烁直到离开本状态
按下按键*,可实现工作状态切换
DAC输出状态:DAC输出状态启动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};//共阴数码管段码
- unsigned char code segCA[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳数码管段码
- //关键性变量
- unsigned char sysflg; //系统状态变量,0-密码检测,1-密码错误检测,2-学号显示,3-DAC转换
- //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 segDU3[] = { 0xA1, 0x88, 0xC6, 0xA4, 0x92, 0x92};
- void Delay(unsigned int i)//延时函数
- {
- 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);
- }
- }
- //-----------------------显示学号界面-----------------------//
- 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);
- }
- }
- //------------按键扫描函数,返回值为对应的按键编码--------------//
- 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
- }
-
- 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、数码管显示部分-----//
- 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; //关闭DAC
- DACS=1;
- DAWR=1;
-
- //闪烁显示学号
- 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、延时计数部分-----//
- sysCNT++;
- if(sysCNT == 500) sysCNT = 0;
- Delay(5);
- }
- }
- }
复制代码
所有资料51hei提供下载:
2020.4.12.rar
(39.5 KB, 下载次数: 13)
|