找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1701|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机 几个未定义错误 麻烦大佬帮忙看看具体怎么定义

[复制链接]
跳转到指定楼层
楼主
ID:656393 发表于 2020-4-12 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机,基本功能已全部完成,有几个未定义错误,麻烦大佬帮忙看看具体怎么定义谢谢!
电路工程文件和源程序在附件里
要实现的功能如下:
密码检测状态:系统启动时,进入密码检测状态,默认显示PA----
                      若正确输入4位密码时,进入学号显示状态
                      若输入密码错误,数码管显示EE----,蜂鸣器在密码错误时发生报警,仍处于密码检测状态
学号显示状态:学号显示nE+学号后四位,一直闪烁直到离开本状态
                      按下按键*,可实现工作状态切换
DAC输出状态:DAC输出状态启动DAC0832,实时显示dAC+3位输出值,默认值为255

单片机源程序如下:
  1. #include<reg51.h>

  2. sbit BEEP = P2^3;
  3. sbit DACS = P2^4;
  4. sbit DAWR = P2^5;
  5. sbit DULA = P2^6;
  6. sbit WELA = P2^7;


  7. unsigned char code segCC[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//共阴数码管段码
  8. unsigned char code segCA[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳数码管段码

  9. //关键性变量
  10. unsigned char sysflg; //系统状态变量,0-密码检测,1-密码错误检测,2-学号显示,3-DAC转换

  11. //3-1、增加状态变量,修改显示函数Display0()
  12. unsigned char segWE6[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20};
  13. unsigned char segDU6[] = { 0x8C, 0x88, 0xBF, 0xBF, 0xBF, 0xBF};
  14. unsigned char segDU2[] = { 0xAB, 0x86, 0xC0, 0xF9, 0xA4, 0xB0};
  15. unsigned char segDU3[] = { 0xA1, 0x88, 0xC6, 0xA4, 0x92, 0x92};


  16. void Delay(unsigned int i)//延时函数
  17. {
  18.                 unsigned int j;
  19.                 while(i--)
  20.                 {
  21.                                 for(j=0;j<32;j++);                //延时
  22.                 }
  23. }


  24. //-----------------------显示密码检测界面-----------------------//
  25. void Display0()
  26. {
  27.                 char i;
  28.                 for( i = 0; i < 6; i++)
  29.                 {
  30.                 DULA = 0;
  31.                 WELA = 0;
  32.                 P0 = segWE6[i]; WELA = 1; WELA = 0;
  33.                 P0 = segDU6[i]; DULA = 1; DULA = 0;
  34.                 Delay(5);
  35.                 }
  36. }

  37. //-----------------------显示学号界面-----------------------//
  38. void Display2()
  39. {
  40.         char i;
  41.         for(i = 0; i < 6; i++)
  42.         {
  43.                 DULA = 0;WELA = 0;
  44.                 P0 = segWE6[i];WELA = 1;WELA = 0;
  45.                 P0 = segDU2[i];DULA = 1;DULA = 0;
  46.                 Delay(5);
  47.         }
  48. }

  49. //-----------------------显示dac界面-----------------------//
  50. void Display3()
  51. {
  52.                 char i;
  53.                 for( i = 0; i < 6; i++)
  54.                 {
  55.                 DULA = 0;WELA = 0;
  56.                 P0 = segWE6[i]; WELA = 1; WELA = 0;
  57.                 P0 = segDU3[i]; DULA = 1; DULA = 0;
  58.                 Delay(5);
  59.                 }
  60. }

  61. //------------按键扫描函数,返回值为对应的按键编码--------------//
  62. unsigned char GetKey()
  63. {       
  64.                 unsigned char i,j,k = 0,l;
  65.                 unsigned char KeyScanCode[] = { 0xef, 0xdf, 0xbf, 0x7f};                //行列扫描的行列码
  66.                 unsigned char KeyCodeTable[] = { 0xee, 0xed, 0xeb, 0xde, 0xdd, 0xdb, 0xbe, 0xbd, 0xbb, 0x7e, 0x7d, 0x7b};
  67.                
  68.                 P3 = 0x0f;
  69.                 if(P3 != 0x0f)                //如果有按键被按下
  70.                 {
  71.                         for( i = 0; i < 4; i++)                //依次进行扫描
  72.                         {
  73.                                 P3 = KeyScanCode[i];
  74.                                 for( j = 0; j < 3; j++)
  75.                                 {
  76.                                         k = i*3+j;                                                //计算对应的按键编码
  77.                                         if(P3 == KeyCodeTable[k])
  78.                                         {
  79.                                                 l = k+1;                                                        //根据键值调整到对应按键
  80.                                                 if(l == 11)        l = 0;                //按键0,调整键值为0
  81.                                                 if(l == 12)        l = 11;                //按键#,调整键值为11,按键*键值仍为10
  82.                                                 return        l;                                        //返回按键编码
  83.                                         }
  84.                                 }
  85.                         }
  86.                 }
  87.                 else
  88.                 {
  89.                         return 0xFF;                                        //或者返回0xff
  90.                 }
  91.                
  92.                 return 0;
  93. }

  94. void main(void)
  95. {
  96.                 unsigned char code pwd[]={1,2,3,4};                                //存储的密码
  97.                 unsigned char keyA = 0,keyB = 0,segidx = 0,errflg = 0,sysCNT = 0;
  98.                 while(1)
  99.                 {
  100.                 //-----1、数码管显示部分-----//
  101.                 if(sysflg == 0)
  102.                 {
  103.                                 segDU6[0] = 0x8C;
  104.                                 segDU6[1] = 0x88;
  105.                                 Display0();
  106.                 }
  107.                 else if(sysflg == 1)
  108.                 {
  109.                                 segDU6[0] = 0x86;
  110.                                 segDU6[1] = 0x86;
  111.                                 Display0();
  112.                                 BEEP = 0;
  113.                                 Delay(5);
  114.                                 BEEP = 1;
  115.                                 Delay(3);
  116.                 }
  117.                 else if(sysflg == 2)
  118.                 {
  119.                         P1=0;                        //关闭DAC
  120.                         DACS=1;
  121.                         DAWR=1;
  122.                        
  123.                         //闪烁显示学号
  124.                         if(sysCNT < 200)Display2();
  125.                         else
  126.                         {
  127.                                 DULA = 0;WELA = 0;
  128.                                 P0 = 0;WELA = 1;WELA = 0;
  129.                                 P0 = 0;DULA = 1;DULA = 0;
  130.                         }
  131.                 }
  132.                 else if(sysflg == 3)
  133.                 {
  134.                                 DACS=0;                        //开启DAC
  135.                                 DAWR=0;
  136.                                 P1=DAC;
  137.                                 Display3();
  138.                 }
  139.                
  140.                
  141.                 //-----2、按键检测部分-----//
  142.                 keyA = GetKey();
  143.                 if(keyB != keyA)
  144.                 {
  145.                                 keyB = keyA;
  146.                                 if((keyA >= 0) && (keyA < 10))
  147.                                 {                if(sysflg <= 1)
  148.                                                 {                segDU6[segidx+2] = 0xBD;
  149.                                                                 if(keyA != pwd[segidx])        errflg = 1;
  150.                        
  151.                                                                 segidx++;
  152.                                
  153.                                                                 if(segidx == 4)
  154.                                                                 {
  155.                                                                         segidx = 0;
  156.                                        
  157.                                                                         if(errflg == 1)        sysflg = 1;
  158.                                                                         else if(errflg == 1)        sysflg = 2;
  159.                                        
  160.                                                                         errflg = 0;
  161.                                                                         segDU6[2] = 0xBF;segDU6[3] = 0xBF;
  162.                                                                         segDU6[4] = 0xBF;segDU6[5] = 0xBF;
  163.                                                                 }
  164.                                                 }
  165.                                                 else if(sysflg == 3)
  166.                                                 {                segDU3[segidx+3] = segCA[keyA];
  167.                                                                 DACtmp = DACtmp*10+keyA;
  168.                                                        
  169.                                                                 segidx++;
  170.                                
  171.                                                                 if(segidx == 3)
  172.                                                                 {
  173.                                                                         segidx = 0;
  174.                                                        
  175.                                                                         if(DACtmp >=255)
  176.                                                                         {                DACtmp = 255;
  177.                                                                                         segDU3[3] = 0xA4;
  178.                                                                                         segDU3[4] = 0x92;
  179.                                                                                         segDU3[5] = 0x92;
  180.                                                                         }
  181.                                                                         DAC = DACtmp;
  182.                                                                         DACtmp = 0;
  183.                                                                 }
  184.                                                 }
  185.                                 else if(keyA == 10)
  186.                                 {
  187.                                                 if(sysflg == 2)        sysflg = 3;
  188.                                                 else if(sysflg == 3)        sysflg = 2;
  189.                                 }
  190.                                 else if(keyA == 11)
  191.                                 {                                                        }
  192.                 }
  193.                

  194.                 //-----3、延时计数部分-----//                       
  195.                         sysCNT++;
  196.                         if(sysCNT == 500)        sysCNT = 0;
  197.                         Delay(5);
  198.                 }       
  199.         }
  200. }
复制代码

所有资料51hei提供下载:
2020.4.12.rar (39.5 KB, 下载次数: 13)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表