标题:
51单片机 几个未定义错误 麻烦大佬帮忙看看具体怎么定义
[打印本页]
作者:
liyihang
时间:
2020-4-12 15:17
标题:
51单片机 几个未定义错误 麻烦大佬帮忙看看具体怎么定义
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)
2020-4-12 15:11 上传
点击文件名下载附件
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1