|
本帖最后由 liyihang 于 2020-4-4 16:50 编辑
51单片机 麻烦大佬帮忙看看这些问题怎么解决
电路工程文件和源程序在附件里
要实现的功能如下:
密码检测状态:系统启动时,进入密码检测状态,默认显示PA----
若正确输入4位密码时,进入学号显示状态
若输入密码错误,数码管显示EE----,蜂鸣器在密码错误时发生报警,仍处于密码检测状态
学号显示状态:学号显示nE+学号后四位,一直闪烁直到离开本状态
按下按键*,可实现工作状态切换
编译时错误如下图所示:
单片机源程序如下:
- #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)
|
|