找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51单片机的密码锁程序 编译错误

[复制链接]
跳转到指定楼层
楼主
ID:655402 发表于 2019-12-13 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译时为什么显示缺少原函数??
在        if(compare()==-1)  那个地方

  1. #include "reg51.h"

  2. //定义IO口
  3. sbit Beep=P3^6;
  4. sbit LED1=P3^7;


  5. //定义全局变量
  6. int count=-1;
  7. int count1=0;      //用于记录输入密码错误的次数
  8. int counter;       //用于计数是定时器能够定时1分钟
  9. int counter1=0;
  10. int temp=99,signal=0;


  11. //初始化密码
  12. int key_word[4]={99,99,99,99};

  13. //用于接收按键接收的值
  14. int   get_word[4]={0,0,0,0};
  15. char  key_buf[]={0xee,0xde,0xbe,0x7e,
  16.                                 0xed,0xdd,0xbd,0x7d,
  17.                                 0xeb,0xdb,0xbb,0x7b,
  18.                 0xe7,0xd7,0xb7,0x77};       //键模
  19. //LED字模
  20. char led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9

  21. //函数声明
  22. void set_key();
  23. void show1(int);
  24. void open_key();
  25. void input_key();
  26. void show2(int);
  27. void show3();
  28. void show4();
  29. int  get_key();

  30. //延时函数
  31. void delay(int x)
  32. {
  33.         int j=0;
  34.         for(;x>0;x--)
  35.                 for(j=0;j<125;j++);
  36. }


  37. //设定密码功能
  38. void set_key()
  39. {
  40.         int i;
  41.         for(i=0;i<4;i++)
  42.         {        
  43.                 while(get_key()==-1)//等待按键按下
  44.                 {
  45.                         if(count!=0&&count!=-1)
  46.                         {
  47.                                 show1(count);//显示设置的密码
  48.                         }
  49.                 }
  50.                 if(signal==1)//将按键的值保存
  51.                 {
  52.                         key_word[i]=get_key();
  53.                         count++;
  54.                         show1(count);
  55.                         signal=0;
  56.                         temp=99;
  57.                 }
  58.                 while(temp==get_key())//一旦长时间按按键,就一直显示密码
  59.                 {        
  60.                         show1(count);
  61.                 }
  62.         }
  63. }


  64. //输入密码
  65. void input_key()
  66. {
  67.         int i;
  68.         for(i=0;i<4;i++)
  69.         {        
  70.                 while(get_key()==-1)//等待按键按下
  71.                 {
  72.                         if(count!=0&&count!=-1)
  73.                         {
  74.                                 show2(count);//显示设置的密码
  75.                         }
  76.                 }
  77.                 if(signal==1)//将按键的值保存
  78.                 {
  79.                         get_word[i]=get_key();
  80.                         count++;
  81.                         show2(count);
  82.                         signal=0;
  83.                         //temp=99;
  84.                 }
  85.                 while(temp==get_key())//一旦长时间按按键,就一直显示密码
  86.                 {        
  87.                         show2(count);
  88.                 }
  89.         }
  90. }


  91. //显示输入的密码
  92. void show2(int count)
  93. {
  94.         if(count==0)//显示1位数据
  95.         {
  96.                 P1=0x0e;
  97.                 P0=led[get_word[0]];
  98.         }
  99.         if(count==1)//显示2位数据
  100.         {
  101.                 P1=0x0e;
  102.                 P0=led[get_word[0]];
  103.                 delay(10);
  104.                 P1=0x0d;
  105.                 P0=led[get_word[1]];
  106.                 delay(10);
  107.         }
  108.         
  109.         if(count==2)//显示3位数据
  110.         {
  111.                 P1=0x0e;
  112.                 P0=led[get_word[0]];
  113.                 delay(10);
  114.                 P1=0x0d;
  115.                 P0=led[get_word[1]];
  116.                 delay(10);
  117.                 P1=0x0b;
  118.                 P0=led[get_word[2]];
  119.                 delay(10);
  120.         }
  121.         if(count==3)//显示4位数据
  122.         {
  123.                         P1=0x0e;
  124.                         P0=led[get_word[0]];
  125.                         delay(10);
  126.                         P1=0x0d;
  127.                         P0=led[get_word[1]];
  128.                         delay(10);
  129.                         P1=0x0b;
  130.                         P0=led[get_word[2]];
  131.                         delay(10);
  132.                         P1=0x07;
  133.                         P0=led[get_word[3]];
  134.                         delay(10);
  135.                         P0=0;
  136.                         //count=-1;
  137.                         signal=0;
  138.         }
  139. }



  140. //显示设置的密码
  141. void show1(int count)
  142. {
  143.         int i;
  144.         if(count==0)//显示一位数据
  145.         {
  146.                 P1=0x0e;
  147.                 i=key_word[0];
  148.                 P0=led[i];
  149.         }
  150.         if(count==1)//显示两位数据
  151.         {
  152.                 P1=0x0e;
  153.                 P0=led[key_word[0]];
  154.                 delay(10);
  155.                 P1=0x0d;
  156.                 P0=led[key_word[1]];
  157.                 delay(10);
  158.         }
  159.         
  160.         if(count==2)//显示三位数据
  161.         {
  162.                 P1=0x0e;
  163.                 P0=led[key_word[0]];
  164.                 delay(10);
  165.                 P1=0x0d;
  166.                 P0=led[key_word[1]];
  167.                 delay(10);
  168.                 P1=0x0b;
  169.                 P0=led[key_word[2]];
  170.                 delay(10);
  171.         }
  172.         if(count==3)//显示四位数据
  173.         {
  174.                 P1=0x0e;
  175.                 P0=led[key_word[0]];
  176.                 delay(10);
  177.                 P1=0x0d;
  178.                 P0=led[key_word[1]];
  179.                 delay(10);
  180.                 P1=0x0b;
  181.                 P0=led[key_word[2]];
  182.                 delay(10);
  183.                 P1=0x07;
  184.                 P0=led[key_word[3]];
  185.                 delay(10);
  186.                 P0=0;
  187.                 count=-1;
  188.                 signal=0;
  189.         }
  190. }


  191. //主函数
  192. void main()
  193. {        
  194.         int op;
  195.         LED1=0;
  196.         Beep=1;
  197.         while(1)
  198.         {
  199.                 op=get_key();
  200.                 switch(op)
  201.                 {
  202.                         case 13:
  203.                                         while(temp==get_key());       //等待选择功能按键释放后再进行设置密码
  204.                                         count=-1;                     //在使用标志位时将标志位进行初始化
  205.                                         signal=1;
  206.                                         set_key();
  207.                                         break;
  208.                         
  209.                         case 14:
  210.                                         while(temp==get_key());
  211.                                         count=-1;                    //初始化标志位
  212.                                         signal=1;
  213.                                         input_key();
  214.                                         while(get_key()!=15)         //当按下登陆键,输入的密码不再显示
  215.                                         {
  216.                                                 show2(count);
  217.                                         }
  218.                                         if(compare()==-1)
  219.                                         {
  220.                                                 count1++;
  221.                                                 while(get_key()!=14&&count1!=3)
  222.                                                 {
  223.                                                         show3();     //密码错误,显示ERR
  224.                                                 }
  225.                                                 P0=0;            //按下输入密码键后,清屏
  226.                                                 if(count1==3)
  227.                                                 {
  228.                                                         //开启定时器中断
  229.                                                         TMOD=0x01;
  230.                                                         TH0=0x9E;//装载初值25ms
  231.                                                         TL0=0x58;
  232.                                                         EA=1; //开总中断
  233.                                                         ET0=1;//开定时器0
  234.                                                         TR0=1;  //开启定时器0
  235.                                                         while(counter1<60);//只有当蜂鸣器响完一分钟之后,才能退出循环
  236.                                                         TR0=0;//关闭定时器
  237.                                              }
  238.                                         }
  239.                                         else
  240.                                         {        
  241.                                                 LED1=1;//当输入密码正确时,开启LED灯
  242.                                                 while(get_key()!=12)//直到按下退出键,屏幕一直显示on
  243.                                                 {
  244.                                                         show4();
  245.                                                 }
  246.                                                 LED1=0;//退出后关闭LED灯
  247.                                                 P0=0;//清屏
  248.                                         }
  249.                                         break;
  250.                         default:break;               
  251.                 }
  252.         }

  253. }



  254. //获取键值
  255. int get_key()
  256. {
  257.         char key_scan[]={0xef,0xdf,0xbf,0x7f};
  258.         int i=0;
  259.         int j=0;
  260.         for(i=0;i<4;i++)//判断
  261.         {
  262.                 P2=key_scan[i];
  263.                 if((P2&0x0f)!=0x0f)
  264.                 {
  265.                         for(j=0;j<16;j++)
  266.                         {
  267.                                 if(key_buf[j]==P2)
  268.                                 {
  269.                                         if(temp!=key_buf[j])//一旦长时间按键,将只会读取一次按键的值
  270.                                         {
  271.                                                 signal=1;
  272.                                                 temp=j;
  273.                                                 return j;
  274.                                         }
  275.                                         else signal=0;
  276.                                 }
  277.                         }
  278.                 }
  279.         }
  280.         return -1;
  281. }




  282. //输入的密码和设定的密码比较
  283. int compare()
  284. {
  285.         int i;
  286.         for(i=0;i<4;i++)
  287.         {
  288.                 if(get_word[i]!=key_word[i])
  289.                         return -1;     //输入密码不等于设定的密码返回-1
  290.         }
  291.         return 1;     //输入的密码等于设定密码返回1
  292. }

  293. void show3()//显示ERR
  294. {
  295.         P1=0x0e;
  296.         P0=0x79;
  297.         delay(10);
  298.         P1=0x0d;
  299.         P0=0x77;
  300.         delay(10);
  301.         P1=0x0b;
  302.         delay(10);
  303. }
  304. void show4()//显示on
  305. {
  306.         P1=0x0e;
  307.         P0=0x5c;
  308.         delay(10);
  309.         P1=0x0d;
  310.         P0=0x54;
  311.         delay(10);
  312. }



  313. //定时器中断函数,定时1分钟
  314. call_police() interrupt 1
  315. {
  316.         counter++;
  317.         if(counter==39)
  318.         {        
  319.                 counter=0;
  320.                 Beep=~Beep;
  321.                 counter1++;
  322.                 if(counter1==60)//定时一分钟
  323.                 {
  324.                         count1=0;
  325.                         Beep=1;//关闭定时器
  326.                 }
  327.         }
  328.         else
  329.         {
  330.                 TH0=0x9E;
  331.                 TL0=0x58;
  332.         }
  333. }
复制代码


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

使用道具 举报

沙发
ID:235200 发表于 2019-12-13 15:33 | 只看该作者
该函数在main函数后,main程序前的声明中未声明
回复

使用道具 举报

板凳
ID:606366 发表于 2019-12-13 16:07 | 只看该作者
函数声明要在main函数之前
回复

使用道具 举报

地板
ID:525068 发表于 2019-12-14 13:13 | 只看该作者
compare函数没声明
回复

使用道具 举报

5#
ID:663844 发表于 2019-12-14 17:44 | 只看该作者
main前没有函数申明
回复

使用道具 举报

6#
ID:655402 发表于 2019-12-14 21:28 | 只看该作者
csmyldl 发表于 2019-12-13 15:33
该函数在main函数后,main程序前的声明中未声明

好了哈哈,谢谢谢谢
回复

使用道具 举报

7#
ID:655402 发表于 2019-12-14 21:29 | 只看该作者
无敌的UUZ大人 发表于 2019-12-13 16:07
函数声明要在main函数之前

解决了,谢谢
回复

使用道具 举报

8#
ID:655402 发表于 2019-12-14 21:30 | 只看该作者
1255230 发表于 2019-12-14 13:13
compare函数没声明

好了,感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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