| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6482 人关注过本帖
标题:请高手帮忙修改单片机加减计数器程序
只看楼主 加入收藏
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
这样行不行?
还不行我也没办法了,你确定原理图正确吗?连线乱七八糟的。
程序代码:
#include<reg52.h>


#define uchar unsigned char
#define uint unsigned int

//=======================================================================
void sendbyte(uint Num);

 void delay( int ms);

 //=======================================================================
 unsigned char code LED_table[]={       //使用附带“51单片机工具箱”可以很容易编码
 0x3f,                             //"0"
 0x06,                             //"1"
 0x5b,                             //"2"            AAAA
 0x4f,                             //"3"           F    B
 0x66,                             //"4"           F    B
 0x6d,                             //"5"            GGGG
 0x7d,                             //"6"           E    C
 0x07,                             //"7"           E    C
 0x7f,                             //"8"            DDDD    H
 0x6f,                             //"9"
 0x00,                             //black
 0x80                             //dot
 };

#define black 10                // 空白
#define dot   11                // 小数点

//                   定义通信端口
//===========================================================================
 sbit COM3=P1^0;

 sbit COM2=P1^6;                //对应口线由硬件确定
 sbit COM1=P1^5;

 sbit COM0=P1^4;

 //===========================================================================


 sbit k1=P1^1;//定义加加
 sbit k2=P3^4;//定义减减
 sbit k3=P3^5;//定义设置
 sbit k4=P1^2;//定义设置
 sbit k5=P1^3;//定义清零
 sbit CLK=P3^0;//164模拟时钟端
 sbit DAT=P3^1;//164模拟数据端
 uint z = 0;

 
void delay(uint t)//延时函数
{
      uint x,y;
      for(x=t;x>0;x--)
      for(y=120;y>0;y--);
}

 
void sendbyte(uint b)//传送显示字节函数
{
      uchar num,c;
    COM0 = COM1 =COM2 = COM3 = 1;    //熄灭数码管

    COM0 = 0;
      num=LED_table[b%10];//个位
      for(c=0;c<8;c++)//依次传送8位
    {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
    }

    COM0 = 1;

    COM1 = 0;
      num=LED_table[b%100/10];//十位
      for(c=0;c<8;c++)//依次传送8位
    {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
    COM1 = 1;

    COM2 = 0;
   num=LED_table[b%1000/100] | 0x20;//百位,加上小数点
   for(c=0;c<8;c++)//依次传送8位
   {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
   COM2 = 1;

   COM3 = 0;
   num=LED_table[b/1000];//千位
   for(c=0;c<8;c++)//依次传送8位
   {
       CLK=0;
       DAT=num&0x01;
       CLK=1;
       num>>=1;
   }
   COM3 = 1;
}    


 void key()

 {
  if(k1==0)
  {
      delay(3);
      if(k1==0)
       {
           //TR0=0;
           z++;
           if(z==10000)
            z=0;
           //sendbyte(z);
       }
      while(!k1);//放开按钮
    }
  if(k2==0)
  {
      delay(3);
      if(k2==0)
       {
           //TR0=1;
           z--;
           if(z<0)
            z=0;
           //sendbyte(z);
       }
      while(!k2);//放开按钮
  }
  if(k5==0)
  {
      delay(3);
      if(k5==0)
       {
           //TR0=1;
           z=0;
           //sendbyte(z);
       }
      while(!k5);//放开按钮
  }
  sendbyte(z);
  delay(10);

 }

 void main()

 {
      TMOD=0X01;//定时器0定时方式1
      TH0=0XD8;//晶振12MHZ,定时10ms
      TL0=0XF0;
      EA=1;
      ET0=1;
      TR0=1;
      COM0 = COM1 =COM2 = COM3 = 0;    //点亮数码管
      sendbyte(0);
      while(1)
      key();
   

 }

 void time()interrupt 1//定时器中断
 {
      uint count;
      TH0=0XD8;
      TL0=0XF0;
      count++;
      if(count==100)//10毫秒X100=1秒
      {
       count=0;
       #if 1    //计时功能,不用
       z++;
       if(z==10000)
       {
       z=0;
       }
       sendbyte(z);//刷新显示
       #endif
      } 

 }



[此贴子已经被作者于2017-4-26 10:45编辑过]

2017-04-26 10:39
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
回复 11楼 grmmylbs
原理图我检查很多次了,应该没问题
2017-04-26 10:48
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
回复 11楼 grmmylbs
现在笔画和小数点不定的在交替闪烁,好像没规律性
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-04-26 11:02
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
按加减有显示没
2017-04-26 12:14
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
你把最后一个函数改一下按加减测试

 void time()interrupt 1//定时器中断
 {
       uint count;
       TH0=0XD8;
       TL0=0XF0;
       count++;
       if(count==100)//10毫秒X100=1秒
      {
        count=0;
       #if 0    //计时功能,不用
       z++;
        if(z==10000)
        {
        z=0;
        }
        sendbyte(z);//刷新显示
       #endif
       }
  }
2017-04-26 12:15
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
从你实际结果来看,原理图应该是有问题的,至少数码管的COM口1,2,3,4的顺序不对
2017-04-26 12:16
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
不改最后一个函数仿真:四位数上的笔画没规律性闪烁
改了最后一个函数后仿真:只在十位上的一笔在闪烁
图片附件: 游客没有浏览图片的权限,请 登录注册

烧到单片机里去没反应,什么也不显示,按按键也没反应没显示
2017-04-26 12:28
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
以下是引用grmmylbs在2017-4-26 12:16:17的发言:

从你实际结果来看,原理图应该是有问题的,至少数码管的COM口1,2,3,4的顺序不对


原理图是我按照实物测量了画出来的,我对照过好多次了,应该不会错

刚才又认真测量了一下,COM口1,2,3,4的顺序也没错

[此贴子已经被作者于2017-4-26 12:44编辑过]

2017-04-26 12:30
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
仿真应该是根据你画的原理图来的吧?为啥是倒数第二个数在闪烁?
如果不改最后一个函数,我是每隔一段时间显示+1,应该是最后一位变化。但超过十次后,倒数第二位也会+1,你仿真的时候数数看?看看有没有规律。因为除了COM口,abcd...等的连线也是乱的,数字显示就会不对。找到规律才好改。
2017-04-26 15:04
mllwj
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2017-4-19
收藏
得分:0 
好的,我在认真看看电路图有没画错
2017-04-26 15:45
快速回复:请高手帮忙修改单片机加减计数器程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019730 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved