找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教大侠们仿制ID95809大侠制做的STC15计数器为什么不能计数

[复制链接]
跳转到指定楼层
楼主
仿制了ID95809大侠制做的STC15计数器,数码管可以正常显示,但是按按键无法计数没有反应,要把程序里的K3按键程删除才能正常计数,各位大侠们帮忙看下程序是哪里的问题单片机源程序如下:
  1.     #include <STC15.h>
  2.     #define uchar unsigned char
  3.     #define uint unsigned int
  4.     sbit FMQ=P3^4;//蜂鸣器
  5.     sbit K1=P3^2; //按键加
  6.     sbit K2=P3^5; //按键减
  7.     sbit K3=P3^2; //复位
  8.     bit flag_KEY=0; //按键松开标志位
  9.     sbit DS1=P1^3;//数码管第1位
  10.     sbit DS2=P1^1;//数码管第2位
  11.     sbit DS3=P1^0;//数码管第3位
  12.     sbit DS4=P1^2;//数码管第4位
  13.     unsigned char ScanTime=1;
  14.     unsigned int Num=0;
  15.     //共阴数码管段码表,段接P2.0-2.7,位接P1.0-1.3
  16.     unsigned char code SEG_Tab[]={
  17.             0x3F,/*0*/
  18.             0x06,/*1*/
  19.             0x5B,/*2*/
  20.             0x4F,/*3*/
  21.             0x66,/*4*/
  22.             0x6D,/*5*/
  23.             0x7D,/*6*/
  24.             0x07,/*7*/
  25.             0x7F,/*8*/
  26.             0x6F,/*9*/
  27.     };
  28.     /*---------------------数码管显示---------------------------------------*/
  29.     void display()
  30.     {        //数码管初始化
  31.             P2=0x00;//P2=00000000
  32.             P1=0xFF;//P1=11111111
  33.       switch(ScanTime)
  34.             {
  35.               //----------数码管第1位--------------
  36.                     case 1:
  37.                             if(Num==0)
  38.                             {
  39.                                     P2=0x40;
  40.                             }
  41.                             else
  42.                             {
  43.                                     P2=SEG_Tab[Num/1000];
  44.                             }
  45.                                     DS1=0;
  46.                     break;
  47.               //-----------数码管第2位-------------
  48.                     case 2:
  49.                             if(Num==0)
  50.                             {
  51.                                     P2=0x40;
  52.                             }
  53.                             else
  54.                             {
  55.                                     P2=SEG_Tab[Num/100%10];
  56.                             }
  57.                             DS2=0;
  58.                     break;
  59.                     //-----------数码管第3位-------------
  60.                     case 3:
  61.                             if(Num==0)
  62.                             {
  63.                                     P2=0x40;
  64.                             }
  65.                             else
  66.                             {
  67.                                     P2=SEG_Tab[Num/10%10];
  68.                             }
  69.                               DS3=0;
  70.                     break;
  71.                     //-----------数码管第4位-------------
  72.                     case 4:
  73.                             if(Num==0)
  74.                             {
  75.                                     P2=0x40;
  76.                             }
  77.                             else
  78.                             {
  79.                                     P2=SEG_Tab[Num%10];
  80.                             }
  81.                             DS4=0;
  82.                     break;
  83.              //------------------default---------------
  84.                     default: break;
  85.             }
  86.             //-----数码管循环------
  87.             ScanTime++;
  88.             if(ScanTime>4)
  89.             {
  90.                     ScanTime=1;//循环扫描
  91.             }
  92.     }
  93.     /*-------------------------------------
  94.                                 按键扫描
  95.     ---------------------------------------*/
  96.     void keyscan()
  97.     {
  98.             if(K1==0)
  99.             {
  100.                     if(flag_KEY==1)//按键只响应1次
  101.                     {
  102.                             flag_KEY=0;
  103.                             if(Num<999)
  104.                             {
  105.                                     Num++;
  106.                             }
  107.                     }
  108.             }
  109.             else if(K2==0)
  110.             {
  111.                     if(flag_KEY==1)//按键只响应1次
  112.                     {
  113.                             flag_KEY=0;
  114.                             if(Num>0)
  115.                             {
  116.                                     Num--;
  117.                             }
  118.                     }
  119.             }
  120.                     else if(K3==0)
  121.             {
  122.                     if(flag_KEY==1)//按键只响应1次
  123.                     {
  124.                             flag_KEY=0;
  125.                             if(Num>0)
  126.                             {
  127.                                     Num=0;
  128.                             }
  129.                     }
  130.             }
  131.       else//按键松开
  132.       {
  133.               flag_KEY=1;
  134.       }
  135.     }
  136.     void delay_ms(unsigned int ms)// 延时子程序
  137.     {
  138.       unsigned int a,b;
  139.       for(a=ms;a>0;a--)
  140.       for(b=123;b>0;b--);
  141.     }
  142.     /*-------------------------------------
  143.                                 主函数
  144.     ---------------------------------------*/
  145.     void main()
  146.     {
  147.             P1M1 = 0x00; P1M0 = 0xFF; //P1口推挽模式
  148.             P2M1 = 0x00; P2M0 = 0xFF; //P2口推挽模式
  149.             while(1)
  150.             {
  151.                     display();
  152.                     keyscan();
  153.                     delay_ms(10);
  154.                     if(Num>=100)
  155.                     {
  156.                             FMQ=0;
  157.                     }
  158.                     else
  159.                     {
  160.                             FMQ=1;
  161.                     }
  162.             }
  163.     }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:352736 发表于 2024-9-13 17:58 | 只看该作者
要将这段程序删了才能正常计数,麻烦大侠们帮忙改下
  else if(K3==0)
        {
                if(flag_KEY==1)//按键只响应1次
                {
                        flag_KEY=0;
                        
                        if(Num>0)
                        {
                                Num=0;
                        }
                }
        }
回复

使用道具 举报

板凳
ID:68189 发表于 2024-9-14 08:18 | 只看该作者
key1 和 key3 都定义成了P32,是不是这个原因呢?
回复

使用道具 举报

地板
ID:1109793 发表于 2024-9-14 09:31 | 只看该作者
wpppmlah 发表于 2024-9-14 08:18
key1 和 key3 都定义成了P32,是不是这个原因呢?

就算一样,也只是只执行KEY1的部分吧。
回复

使用道具 举报

5#
ID:352736 发表于 2024-9-15 07:22 来自手机 | 只看该作者
wpppmlah 发表于 2024-9-14 08:18
key1 和 key3 都定义成了P32,是不是这个原因呢?

改了还是一样,要把k3的那段程序删了才能计数,不删的话按键没反应
回复

使用道具 举报

6#
ID:1109793 发表于 2024-9-15 14:35 | 只看该作者
软件模拟了一下,不用删除,也好用啊,话说你这都没有消斗,是不是和按键抖动有关?
回复

使用道具 举报

7#
ID:849913 发表于 2024-9-15 20:08 | 只看该作者
#在         P0M0 = 0x00;     P0M1 = 0x00;     P1M0 = 0x00;     P1M1 = 0x00;     P2M0 = 0x00;     P2M1 = 0x00;     P3M0 = 0x00;     P3M1 = 0x00;     P5M0 = 0x00;     P5M1 = 0x00;    这里快速回复#
回复

使用道具 举报

8#
ID:849913 发表于 2024-9-15 20:09 | 只看该作者

        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
   P3口没设置 设置一下试试
回复

使用道具 举报

9#
ID:1109793 发表于 2024-9-16 08:40 | 只看该作者
老董 发表于 2024-9-15 20:09
P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;

他包含的是STC15,默认好像就标准IO的吧
回复

使用道具 举报

10#
ID:352736 发表于 2024-9-16 10:04 来自手机 | 只看该作者
xiaobendan001 发表于 2024-9-15 14:35
软件模拟了一下,不用删除,也好用啊,话说你这都没有消斗,是不是和按键抖动有关?

不删除的话按k1和k2计数按键没反应,要把k3按键这段程序删除按k1和k2计数按键才能正常计数,k3按键原程序是复位按键
回复

使用道具 举报

11#
ID:352736 发表于 2024-9-16 12:02 来自手机 | 只看该作者
xiaobendan001 发表于 2024-9-15 14:35
软件模拟了一下,不用删除,也好用啊,话说你这都没有消斗,是不是和按键抖动有关?

大师程序需要改那里?麻烦指点一下!
回复

使用道具 举报

12#
ID:849913 发表于 2024-9-16 23:16 | 只看该作者
else if(K3==0)
            {
                    if(flag_KEY==1)//按键只响应1次
                    {
                            flag_KEY=0;
                            if(Num>0)
                            {
                                    Num=0;
                            }
                    }
            }
你的程序没问题 检查一下硬件 是不是这个按键漏电了 程序一直认为你是按住了K3 这样flag_KEY==1的机会就没有了 你可以用万用表测一下K3的电压和K1 K2是不是一样 就可以判断出来
回复

使用道具 举报

13#
ID:965189 发表于 2024-9-17 08:41 来自手机 | 只看该作者
if(Num>0);{Num=0;} 这里就是要Num永远等于0。
回复

使用道具 举报

14#
ID:1109793 发表于 2024-9-17 10:46 | 只看该作者
君工创 发表于 2024-9-17 08:41
if(Num>0);{Num=0;} 这里就是要Num永远等于0。

人家前边有条件的。
不过实际上这个复位按键就是清零按键。这个if是多此一举的,直接num = 0;就好了嘛。
不过就算有if(num>0)这个脱裤子放屁的举动,也不影响结果,软件仿真是对的。
如12楼所说倒是有可能,但是有个问题,楼主刚开始是把K1和K3定义在一个IO上面了,这样这个说法似乎就不成立了。
回复

使用道具 举报

15#
ID:352736 发表于 2024-9-17 11:36 | 只看该作者
老董 发表于 2024-9-16 23:16
else if(K3==0)
            {
                    if(flag_KEY==1)//按键只响应1次

检查了没有漏电,现在把单片机的引脚悬空都是一样的结果
回复

使用道具 举报

16#
ID:352736 发表于 2024-9-17 11:42 | 只看该作者
君工创 发表于 2024-9-17 08:41
if(Num>0);{Num=0;} 这里就是要Num永远等于0。

这个K3是复位按键则断程序不知要怎么该了,大师麻烦指点一下!
回复

使用道具 举报

17#
ID:965189 发表于 2024-9-17 12:02 | 只看该作者
把第三个按键这里改一下,

if(Num>9999);
{
  Num=0;
}
回复

使用道具 举报

18#
ID:965189 发表于 2024-9-17 12:35 来自手机 | 只看该作者
不好意思,没详细看。按键加和复位键不能共用。重新定义这两个键的其中一个到其它端口就不用改代码。
回复

使用道具 举报

19#
ID:352736 发表于 2024-9-17 13:24 来自手机 | 只看该作者
xiaobendan001 发表于 2024-9-17 10:46
人家前边有条件的。
不过实际上这个复位按键就是清零按键。这个if是多此一举的,直接num = 0;就好了嘛。 ...

原程序K1和K3定义在一个IO口了,我把K1改在另外的IO口把K3这段程序删了加减按键计数都是正常的,把K3的这段程序加入就不正常了,加减按键都没有反应K3还是定义在原来的p3^2
回复

使用道具 举报

20#
ID:352736 发表于 2024-9-17 13:34 来自手机 | 只看该作者
君工创 发表于 2024-9-17 12:35
不好意思,没详细看。按键加和复位键不能共用。重新定义这两个键的其中一个到其它端口就不用改代码。

大师这个是原代码我直接贴出来的,实际我改了IO口的,把K1改在P3^4   K3还是在原来的P3^2
FMQ改在P3^7,因为蜂鸣器没有用就随便改了个IO口
回复

使用道具 举报

21#
ID:965189 发表于 2024-9-17 13:59 | 只看该作者
除了改代码,实际电路也要改到相应的端口上。
回复

使用道具 举报

22#
ID:161164 发表于 2024-9-17 15:03 | 只看该作者
wl20020807 发表于 2024-9-17 13:34
大师这个是原代码我直接贴出来的,实际我改了IO口的,把K1改在P3^4   K3还是在原来的P3^2
FMQ改在P3^7, ...

量一下K3的电压
回复

使用道具 举报

23#
ID:1109793 发表于 2024-9-17 15:21 | 只看该作者
wl20020807 发表于 2024-9-17 13:24
原程序K1和K3定义在一个IO口了,我把K1改在另外的IO口把K3这段程序删了加减按键计数都是正常的,把K3的这 ...

你可以尝试在main开始的地方加上一个num = 50;然后运行看看实际上显示多少,如果是0,说明你的key3的部分代码是有作用的。
回复

使用道具 举报

24#
ID:849913 发表于 2024-9-17 17:19 | 只看该作者
不信邪的我用搭载stc15的板子测试也可以运行啊 你再查查硬件吧
回复

使用道具 举报

25#
ID:352736 发表于 2024-9-17 18:48 | 只看该作者

只要加了K3这段程序,K1(加键)为高电平,K2(减键)为低电平,KI K2按键都没有反应,把K3这段程序删了,K1 K2 都为高电平了,K1 K2按键都正常可以计数,不知程序是那里出错了
回复

使用道具 举报

26#
ID:1109793 发表于 2024-9-18 07:44 | 只看该作者
wl20020807 发表于 2024-9-17 18:48
只要加了K3这段程序,K1(加键)为高电平,K2(减键)为低电平,KI K2按键都没有反应,把K3这段程序删了 ...

你的意思是加了这段代码,K2就等于一直按着了?
回复

使用道具 举报

27#
ID:352736 发表于 2024-9-18 22:45 来自手机 | 只看该作者
xiaobendan001 发表于 2024-9-18 07:44
你的意思是加了这段代码,K2就等于一直按着了?

对 ,加了k3这段程序,k2 (减健)就是低压平了,
回复

使用道具 举报

28#
ID:352736 发表于 2024-9-18 22:55 来自手机 | 只看该作者
老董 发表于 2024-9-17 17:19
不信邪的我用搭载stc15的板子测试也可以运行啊 你再查查硬件吧

大师有电路图吗?我也是用的stc15w408as搭载的板子但是它就是无法运行
回复

使用道具 举报

29#
ID:352736 发表于 2024-9-18 23:02 来自手机 | 只看该作者
老董 发表于 2024-9-17 17:19
不信邪的我用搭载stc15的板子测试也可以运行啊 你再查查硬件吧

这是原电路图,电路图IO口和程序IO口对不上,我实际把实际电路按照程序IO口改了还是不行

7b3859ae84ca7c9d567f1b427a088fac1cb6bb8baeb703213359b4ac2fdc3f79.0.JPG (290.53 KB, 下载次数: 0)

7b3859ae84ca7c9d567f1b427a088fac1cb6bb8baeb703213359b4ac2fdc3f79.0.JPG
回复

使用道具 举报

30#
ID:352736 发表于 2024-9-18 23:06 来自手机 | 只看该作者
老董 发表于 2024-9-17 17:19
不信邪的我用搭载stc15的板子测试也可以运行啊 你再查查硬件吧

大师你的stc15芯片的晶振设置的多少?我设置的11.0592MHZ
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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