找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大神求帮忙!!!关于51单片机数码管问题

  [复制链接]
跳转到指定楼层
楼主
ID:93574 发表于 2015-10-30 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>          //程序目的:从0计时到9999(数码管一位一位的打开)
#define uchar unsigned char
#define uint unsigned int
sbit K0=P3^0;sbit K1=P3^1;sbit K2=P3^2;sbit K3=P3^3;
uint counter,time_counter=0;
uchar code du[]={
                                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F  //"9"
                                };         //每个数码管显示
void delay(uint z)//延时函数
{
        uchar x,y;
        for(x = z;x > 0;x--)
        for(y = 110;y >0;y--);
       
}
void init()        //定时初始函数
{
        TMOD = 0X10;
        TH1 = (65536-46082)/256;
        TL1 = (65536-46082)%256;
//        TR1 = 1;
}
void display(uint time_counter)  //数码管显示函数
{
        uchar ge,shi,bai,qian;
        ge = time_counter%1000%100%10;
        shi = time_counter%1000%100/10;
        bai = time_counter%1000/100;
        qian = time_counter/1000;
        if(0 <= time_counter <= 9)        //计时9之内
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
        }
        if(9 < time_counter <= 99)        //计时9至99之间
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
        }
        if(99 < time_counter <= 999)  //计时99至999之间
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
                P1 = 0xfb;
                P0 = du[bai];
                delay(1);
                P0 = 0X00;                       
        }
          if(time_counter > 999)                //计时999以上
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
                P1 = 0xfb;
                P0 = du[bai];
                delay(1);
                P0 = 0X00;
                P1 = 0xf7;
                P0 = du[qian];
                delay(1);
                P0 = 0X00;                       
        }
}
void main()
{
        init();
        while(1)
        {
        if(TF1 == 1)
        {
                 TF1 = 0;
                TH1 = (65536-46082)/256;
                TL1 = (65536-46082)%256;
                counter++;                           //延时50ms后counter+1
        }
        if(counter == 1)  
        {
                counter = 0;
                time_counter++;        //20次后即一秒time——counter+1
        }
                if( time_counter == 9999)
                {
                  while(1);
                }
                if(K0 == 0)
                {
                        delay(10);
                        if(K0 == 0)
                        {
                                TR1 = 1;
                                while(!K0);
                        }
                }
                if(K1 == 0)
                {
                        delay(10);
                        if(K1 == 0)
                        {
                                TR1 = 0;
                                while(!K1);
                        }
                }
                if(K2 == 0 && TR1 == 0)
                {
                        delay(10);
                        if(K2 == 0)
                        {
                                time_counter++;
                                while(!K2);
                        }
                }
                if(K3 == 0 && TR1 == 0)
                {
                        delay(10);
                        if(K3 == 0)
                        {
                                time_counter--;
                                while(!K3);
                        }
                }

                display(time_counter);
        }
}
我想实现数码管一位一位的亮(0-9999)~他却前三位都亮了~直到999开始才是我要的。

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

使用道具 举报

沙发
ID:18867 发表于 2015-10-30 20:39 | 只看该作者
应该是你的位驱动有问题,当小于10时只显示个位,小于100时显示个位和十位,小于1000是就显示个位、十位百位。你加个else语句试试!
回复

使用道具 举报

板凳
ID:93574 发表于 2015-10-30 21:57 | 只看该作者
PLA 发表于 2015-10-30 20:39
应该是你的位驱动有问题,当小于10时只显示个位,小于100时显示个位和十位,小于1000是就显示个位、十位百 ...

在哪个if后面加else接下来的if语句就不会运行了。不会显示其他位了T_T,
回复

使用道具 举报

地板
ID:79544 发表于 2015-10-31 11:27 | 只看该作者
程序的问题
回复

使用道具 举报

5#
ID:93574 发表于 2015-10-31 12:52 | 只看该作者

哪里啊?
回复

使用道具 举报

6#
ID:103849 发表于 2016-1-20 08:32 | 只看该作者
你好,我也遇到了这个问题,请问你解决了吗?
回复

使用道具 举报

7#
ID:103865 发表于 2016-1-20 11:09 | 只看该作者
程序的问题吧,好好检查检查
回复

使用道具 举报

8#
ID:97249 发表于 2016-1-20 12:33 | 只看该作者
本帖最后由 红尘有你 于 2016-1-20 12:56 编辑

if(0 <= time_counter <= 9) 表达式可以这样写吗?应这样 if( time_counter <10)把那几个表达式改过来试试
回复

使用道具 举报

9#
ID:103889 发表于 2016-1-20 15:27 | 只看该作者
程序的问题。
回复

使用道具 举报

10#
ID:104559 发表于 2016-2-25 17:42 | 只看该作者
程序问题,检查一下时序
回复

使用道具 举报

11#
ID:74145 发表于 2016-2-25 19:16 | 只看该作者
应该是程序的问题
回复

使用道具 举报

12#
ID:18297 发表于 2016-2-25 21:05 | 只看该作者
本帖最后由 zjjhtony 于 2016-2-25 21:08 编辑

改2个地方:
1)   红色为添加的;        if( time_counter <10)        //计时9之内
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
        }
        else if(time_counter <100)        //计时9至99之间
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
        }
        else if(time_counter <1000)  //计时99至999之间
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
                P1 = 0xfb;
                P0 = du[bai];
                delay(1);
                P0 = 0X00;                        
        }
        else if(time_counter >1000)                //计时999以上
        {
                P1 = 0xfe;
                P0 = du[ge];
                delay(1);
                P0 = 0X00;
                P1 = 0xfd;
                P0 = du[shi];
                delay(1);
                P0 = 0X00;
                P1 = 0xfb;
                P0 = du[bai];
                delay(1);
                P0 = 0X00;
                P1 = 0xf7;
                P0 = du[qian];
                delay(1);
                P0 = 0X00;                        
        }
2)上面的判断语句要改改;
      如0 <= time_counter <= 9 改成  time_counter <10。其他雷同
仿真结果可行。

修改后程序.rar

940 Bytes, 下载次数: 3

回复

使用道具 举报

13#
ID:36525 发表于 2016-2-29 20:47 | 只看该作者
参考一下0-99计数器的程序网上有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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