找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2660|回复: 12
收起左侧

51单片机的有关问题,小白求教,main重复出错,源码已贴出

[复制链接]
ID:658466 发表于 2019-12-10 17:53 | 显示全部楼层 |阅读模式
本帖最后由 爱自由O 于 2019-12-10 17:59 编辑

一个矩阵键盘控制蜂鸣器,一个数码管程序,怎么合并使用,源码已贴出,
  1. #include "reg52.h"
  2. #include "key.h"

  3. sbit led=P2^5;

  4. unsigned int Tab_F[]={440,494,554,220,
  5.                                                                                         440,494,554,220,
  6.                                                                                         554,587,659,554,
  7.                                                                                         587,659,999,};

  8. unsigned char key_num;

  9. unsigned int Pinlv,Shichang;

  10. bit beep;

  11. void Timer0Init()
  12. {
  13.         TMOD|=0X01;
  14.   TH0=(65536-92)/256;
  15.         TL0=(65536-92)%256;         
  16.         ET0=1;                                                                                   //T0中断
  17.         EA=1;                                                                                   //cpu总中断
  18.         TR0=1;        
  19. }


  20. void main()
  21. {        
  22.         Timer0Init();  
  23.         while(1)
  24.         {
  25.                 key_num=KeyDown();
  26.                
  27.                 if(key_num!=0xff)
  28.                 {
  29.                         Pinlv=Tab_F[key_num];  
  30.                   beep=1;
  31.                         Shichang=0;
  32.                         EA=1;
  33.                 }
  34.         };
  35.         
  36. }


  37. void Timer0() interrupt 1
  38. {
  39.         static unsigned int i;
  40.         TH0=(65536-92)/256;        
  41.         TL0=(65536-92)%256;         
  42.         
  43.         i++;
  44.         if(i>(5000/Pinlv))
  45.         {
  46.                                 if(beep==1)
  47.                                         {led=~led;}
  48.                  i=0;        
  49.         }        
  50.         
  51.         Shichang++;
  52.         if(Shichang==1000)
  53.           {
  54.                         beep=0;
  55.                         led=0;
  56.                         EA=0;
  57.                 }
  58. }
  59. //===========================分隔//
  60. #include "key.h"

  61. unsigned char KeyValue=0;

  62. void delay(unsigned int i)
  63. {
  64.         while(i--);        
  65. }


  66. unsigned char KeyDown(void)
  67. {
  68.         char a=0;
  69.         GPIO_KEY=0x0f;

  70.         if(GPIO_KEY!=0x0f)
  71.         {
  72.                 delay(1000);
  73.                 if(GPIO_KEY!=0x0f)
  74.                 {        
  75.                         
  76.                         GPIO_KEY=0X0F;
  77.                         switch(GPIO_KEY)                                                                   //lie
  78.                         {
  79.                                 case(0X07):        KeyValue=0;break;//   0111
  80.                                 case(0X0b):        KeyValue=1;break;//   1011
  81.                                 case(0X0d): KeyValue=2;break; //  1101
  82.                                 case(0X0e):        KeyValue=3;break;//   1110
  83.                         }
  84.                         
  85.                         GPIO_KEY=0XF0;                                                                    //hang
  86.                         switch(GPIO_KEY)
  87.                         {
  88.                                 case(0X70):        KeyValue=KeyValue;break;   //0111
  89.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  90.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  91.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  92.                         }
  93.                         while((a<50)&&(GPIO_KEY!=0xf0))         
  94.                         {
  95.                                 delay(1000);
  96.                                 a++;
  97.                         }
  98.                         
  99.                 }
  100.         }
  101.         else
  102.         {
  103.                 KeyValue=0xff;
  104.         }
  105.         
  106.         return KeyValue;
  107. }
  108. //===========================分隔//
  109. #include <reg52.h>
  110. typedef unsigned char uchar;
  111. typedef unsigned int uint;
  112. sbit LSA=P2^2;                                         
  113. sbit LSB=P2^3;
  114. sbit LSC=P2^4;
  115. uchar smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  116. 0x7f,0x6f};
  117. void delay(uint a)
  118. {
  119.   while(a--);
  120. }

  121. void dig_Disp()
  122. {
  123. uchar i=0;
  124. for(;i<8;i++)
  125.         {
  126.         switch(i)
  127.       {
  128.         case 0:
  129.                        LSA=0;LSB=0;LSC=0;P0=smg[0];break;
  130.                 case 1:
  131.                        LSA=1;LSB=0;LSC=0;P0=smg[1];break;
  132.             case 2:
  133.                        LSA=0;LSB=1;LSC=0;P0=smg[2];break;
  134.                 case 3:
  135.                        LSA=1;LSB=1;LSC=0;P0=smg[1];break;
  136.             case 4:
  137.                        LSA=0;LSB=0;LSC=1;P0=smg[9];break;
  138.                 case 5:
  139.                        LSA=1;LSB=0;LSC=1;P0=smg[1];break;
  140.                 case 6:
  141.                        LSA=0;LSB=1;LSC=1;P0=smg[0];break;
  142.                 case 7:
  143.                        LSA=1;LSB=1;LSC=1;P0=smg[2];break;
  144.            }
  145.            delay(100);
  146.            P0=0x00;
  147.           }
  148.    }
  149.    void main()
  150.    {
  151.    while(1)
  152.    {
  153.    dig_Disp();
  154.    }
  155.    }
复制代码


代码.png

程序.rar

30.4 KB, 下载次数: 5

回复

使用道具 举报

ID:658466 发表于 2019-12-10 18:00 | 显示全部楼层
工程架构不知道正确不,这个控制数码管的程序一直实现不过
回复

使用道具 举报

ID:601478 发表于 2019-12-11 09:23 | 显示全部楼层
不清楚你放的这三个程序是什么关系,我也是初学的,不过大概看了一下好像找不到shuxian这个东东,报错提示你的main里面没有用到这个shuxian,还有那两个重复定义的提示,建议还是先看清楚程序哪里漏了什么东西吧,慢慢找原因总能解决的
回复

使用道具 举报

ID:278179 发表于 2019-12-11 13:19 | 显示全部楼层
这是两个程序代码段,合并很简单,要写出你想要显示哪些内容或者要达到什么目的,下面是合并的结果:
#include "reg52.h"
#include "key.h"
/////////移到这里//////////////////////
//#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LSA=P2^2;                                         
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
/////////////////////////////////

sbit led=P2^5;

unsigned int Tab_F[]={440,494,554,220,
                                                                                        440,494,554,220,
                                                                                        554,587,659,554,
                                                                                        587,659,999,};

unsigned char key_num;

unsigned int Pinlv,Shichang;

bit beep;

void Timer0Init()
{
        TMOD|=0X01;
  TH0=(65536-92)/256;
        TL0=(65536-92)%256;         
        ET0=1;                                                                                   //T0中断
        EA=1;                                                                                   //cpu总中断
        TR0=1;        
}

/*/////////////下面这段声明移到最后面的main主程序里面
void main()
{        
        Timer0Init();  
        while(1)
        {
                key_num=KeyDown();
               
                if(key_num!=0xff)
                {
                        Pinlv=Tab_F[key_num];  
                  beep=1;
                        Shichang=0;
                        EA=1;
                }
        };
        
}
//////////////////////*/

void Timer0() interrupt 1
{
        static unsigned int i;
        TH0=(65536-92)/256;        
        TL0=(65536-92)%256;         
        
        i++;
        if(i>(5000/Pinlv))
        {
                                if(beep==1)
                                        {led=~led;}
                 i=0;        
        }        
        
        Shichang++;
        if(Shichang==1000)
          {
                        beep=0;
                        led=0;
                        EA=0;
                }
}
//===========================分隔//
#include "key.h"

unsigned char KeyValue=0;

void delay(unsigned int i)
{
        while(i--);        
}


unsigned char KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;

        if(GPIO_KEY!=0x0f)
        {
                delay(1000);
                if(GPIO_KEY!=0x0f)
                {        
                        
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)                                                                   //lie
                        {
                                case(0X07):        KeyValue=0;break;//   0111
                                case(0X0b):        KeyValue=1;break;//   1011
                                case(0X0d): KeyValue=2;break; //  1101
                                case(0X0e):        KeyValue=3;break;//   1110
                        }
                        
                        GPIO_KEY=0XF0;                                                                    //hang
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;   //0111
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         
                        {
                                delay(1000);
                                a++;
                        }
                        
                }
        }
        else
        {
                KeyValue=0xff;
        }
        
        return KeyValue;
}
//===========================分隔//
/*/////////////下面这段声明移到前面开头的声明
//#include <reg52.h>
//typedef unsigned char uchar;
//typedef unsigned int uint;
//sbit LSA=P2^2;                                         
//sbit LSB=P2^3;
//sbit LSC=P2^4;
//uchar smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
//0x7f,0x6f};
//////////////////////*/

void delay(uint a)
{
  while(a--);
}

void dig_Disp()
{
uchar i=0;
for(;i<8;i++)
        {
        switch(i)
      {
        case 0:
                       LSA=0;LSB=0;LSC=0;P0=smg[0];break;
                case 1:
                       LSA=1;LSB=0;LSC=0;P0=smg[1];break;
            case 2:
                       LSA=0;LSB=1;LSC=0;P0=smg[2];break;
                case 3:
                       LSA=1;LSB=1;LSC=0;P0=smg[1];break;
            case 4:
                       LSA=0;LSB=0;LSC=1;P0=smg[9];break;
                case 5:
                       LSA=1;LSB=0;LSC=1;P0=smg[1];break;
                case 6:
                       LSA=0;LSB=1;LSC=1;P0=smg[0];break;
                case 7:
                       LSA=1;LSB=1;LSC=1;P0=smg[2];break;
           }
           delay(100);
           P0=0x00;
          }
   }
   void main()
   {
   while(1)
   {
//////////////移到这里,屏蔽多余的语句                 
//void main()
//{        
//        Timer0Init();  
//        while(1)
//        {
                key_num=KeyDown();
               
                if(key_num!=0xff)
                {
                        Pinlv=Tab_F[key_num];  
                  beep=1;
                        Shichang=0;
                        EA=1;
                }
//        };
//        
//}                 
/////////////////////////////////                                                               
   dig_Disp();
   }
   }
回复

使用道具 举报

ID:658466 发表于 2019-12-11 22:48 | 显示全部楼层
PDDDF 发表于 2019-12-11 09:23
不清楚你放的这三个程序是什么关系,我也是初学的,不过大概看了一下好像找不到shuxian这个东东,报错提示 ...

一个是引用,一个是矩阵键盘对应蜂鸣器频率,shuxian是一个数码管显示的程序,好像引脚使用重复了
回复

使用道具 举报

ID:658466 发表于 2019-12-11 22:48 | 显示全部楼层
huwqly 发表于 2019-12-11 13:19
这是两个程序代码段,合并很简单,要写出你想要显示哪些内容或者要达到什么目的,下面是合并的结果:
#inc ...

好的好的,我试下程序,谢谢谢谢
回复

使用道具 举报

ID:658466 发表于 2019-12-11 23:31 | 显示全部楼层
huwqly 发表于 2019-12-11 13:19
这是两个程序代码段,合并很简单,要写出你想要显示哪些内容或者要达到什么目的,下面是合并的结果:
#inc ...

Build target 'Target 1'
assembling STARTUP.A51...
compiling gai.c...
gai.c(2): warning C318: can't open file 'key.h'
GAI.C(68): error C202: 'GPIO_KEY': undefined identifier
GAI.C(70): error C202: 'GPIO_KEY': undefined identifier
GAI.C(73): error C202: 'GPIO_KEY': undefined identifier
GAI.C(76): error C202: 'GPIO_KEY': undefined identifier
GAI.C(77): error C202: 'GPIO_KEY': undefined identifier
GAI.C(85): error C202: 'GPIO_KEY': undefined identifier
GAI.C(86): error C202: 'GPIO_KEY': undefined identifier
GAI.C(93): error C202: 'GPIO_KEY': undefined identifier
GAI.C(111): error C237: '_delay': function already has a body
GAI.C(146): error C141: syntax error near '{'
GAI.C(164): error C141: syntax error near '}'
compiling key.c...
Target not created
回复

使用道具 举报

ID:278179 发表于 2019-12-12 08:11 | 显示全部楼层
#include "key.h"这个是外部引用,你要找到你原先复制那段键盘的程序,把里面的 "key.h"复制添加到你的这个工程
回复

使用道具 举报

ID:278179 发表于 2019-12-12 08:14 | 显示全部楼层
gai.c(2): warning C318: can't open file 'key.h'
这里提示你 不能打开'key.h'
回复

使用道具 举报

ID:213173 发表于 2019-12-12 08:44 | 显示全部楼层
这两个程序本来就是一种完成基本功能的学习代码,其缺陷是非常明显的,在实际应用中很少采用。两者合并后其基本功能都有,但不完善。按键反应不灵敏,蜂鸣器工作期间明显干扰数码管显示。 无标题.jpg

  1. #include "reg52.h"
  2. #define GPIO_KEY P3
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. sbit LSA=P2^2;                                         
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit led=P2^5;
  9. uchar smg[]={
  10.         0x3f,0x06,0x5b,0x4f,0x66,
  11.         0x6d,0x7d,0x07,0x7f,0x6f};
  12. unsigned int Tab_F[]={
  13.         440,494,554,220,440,494,554,220,
  14.         554,587,659,554,587,659,999,};
  15. unsigned char key_num;
  16. unsigned int Pinlv,Shichang;
  17. unsigned char KeyValue=0;
  18. unsigned char key_num;
  19. bit beep;

  20. void delay(unsigned int i)
  21. {
  22.         while(i--);        
  23. }

  24. void Timer0Init()
  25. {
  26.         TMOD|=0X01;
  27.         TH0=(65536-92)/256;
  28.         TL0=(65536-92)%256;         
  29.         ET0=1;       //T0中断
  30.         EA=1;         //cpu总中断
  31.         TR0=1;        
  32. }

  33. unsigned char KeyDown(void)
  34. {
  35.         char a=0;
  36.         GPIO_KEY=0x0f;
  37.         if(GPIO_KEY!=0x0f)
  38.         {
  39.                 delay(1000);
  40.                 if(GPIO_KEY!=0x0f)
  41.                 {        
  42.                         GPIO_KEY=0X0F;
  43.                         switch(GPIO_KEY) //lie
  44.                         {
  45.                                 case(0X07): KeyValue=0;break;//   0111
  46.                                 case(0X0b): KeyValue=1;break;//   1011
  47.                                 case(0X0d): KeyValue=2;break; //  1101
  48.                                 case(0X0e): KeyValue=3;break;//   1110
  49.                         }

  50.                         GPIO_KEY=0XF0;    //hang
  51.                         switch(GPIO_KEY)
  52.                         {
  53.                                 case(0X70): KeyValue=KeyValue;break;   //0111
  54.                                 case(0Xb0): KeyValue=KeyValue+4;break;
  55.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  56.                                 case(0Xe0): KeyValue=KeyValue+12;break;
  57.                         }
  58.                         while((a<50)&&(GPIO_KEY!=0xf0))
  59.                         {
  60.                                 delay(1000);
  61.                                 a++;
  62.                         }
  63.                 }
  64.         }
  65.         else
  66.         {
  67.                 KeyValue=0xff;
  68.         }
  69.         return KeyValue;
  70. }
  71. void dig_Disp()
  72. {
  73.         uchar i=0;
  74.         for(;i<8;i++)
  75.         {
  76.                 switch(i)
  77.                 {
  78.                         case 0:
  79.                         LSA=0;LSB=0;LSC=0;P0=smg[0];break;
  80.                         case 1:
  81.                         LSA=1;LSB=0;LSC=0;P0=smg[1];break;
  82.                         case 2:
  83.                         LSA=0;LSB=1;LSC=0;P0=smg[2];break;
  84.                         case 3:
  85.                         LSA=1;LSB=1;LSC=0;P0=smg[1];break;
  86.                         case 4:
  87.                         LSA=0;LSB=0;LSC=1;P0=smg[9];break;
  88.                         case 5:
  89.                         LSA=1;LSB=0;LSC=1;P0=smg[1];break;
  90.                         case 6:
  91.                         LSA=0;LSB=1;LSC=1;P0=smg[0];break;
  92.                         case 7:
  93.                         LSA=1;LSB=1;LSC=1;P0=smg[2];break;
  94.                 }
  95.                 delay(100);
  96.                 P0=0x00;
  97.         }
  98. }

  99. void main()
  100. {        
  101.         Timer0Init();  
  102.         while(1)
  103.         {
  104.                 dig_Disp();
  105.                 key_num=KeyDown();
  106.                 if(key_num!=0xff)
  107.                 {
  108.                         Pinlv=Tab_F[key_num];  
  109.                         beep=1;
  110.                         Shichang=0;
  111.                         EA=1;
  112.                 }
  113.         }
  114. }

  115. void Timer0() interrupt 1
  116. {
  117.         static unsigned int i;
  118.         TH0=(65536-92)/256;        
  119.         TL0=(65536-92)%256;         

  120.         i++;
  121.         if(i>(5000/Pinlv))
  122.         {
  123.                 if(beep==1)
  124.                 {led=~led;}
  125.                 i=0;        
  126.         }        

  127.         Shichang++;
  128.         if(Shichang==1000)
  129.         {
  130.                 beep=0;
  131.                 led=0;
  132.                 EA=0;
  133.         }
  134. }

  135. //===========================分隔//
  136. /*
  137. #include <reg52.h>

  138. void delay(uint a)
  139. {
  140. while(a--);
  141. }

  142. void main()
  143. {
  144. while(1)
  145. {
  146. dig_Disp();
  147. }
  148. }
  149. */
复制代码



回复

使用道具 举报

ID:658466 发表于 2019-12-12 13:01 | 显示全部楼层
谢谢大家
回复

使用道具 举报

ID:658466 发表于 2019-12-12 13:01 | 显示全部楼层
huwqly 发表于 2019-12-12 08:11
#include "key.h"这个是外部引用,你要找到你原先复制那段键盘的程序,把里面的 "key.h"复制添加到你的这个 ...

key.h是那个矩阵键盘扫描,现在不用了,用的独立键盘
回复

使用道具 举报

ID:278179 发表于 2019-12-12 20:30 | 显示全部楼层
那你就把key.h这个语句屏蔽或者删除,不然编译肯定找不到报错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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