野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4272|回复: 5

同一个程序,用 keil2 成功但用 keil5 不行?

[复制链接]
发表于 2022-10-21 17:05:53 | 显示全部楼层 |阅读模式
本帖最后由 dtam22 于 2022-10-21 17:07 编辑

你好,51 新手,下了个keil5 ,拷了学习程序,用keil2转出的 .hex 能成功。
但用keil5 转出的.hex 出来效果完全不一样。

用了keil5 出来的,没有消隐效果,会闪,到了006 就停了。
不会再加数。
(keil5 会有warning,但keil2 没有)

有大神能帮忙看看?
谢谢


回复

使用道具 举报

 楼主| 发表于 2022-10-21 17:06:28 | 显示全部楼层
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uint num,disnum;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管段选编码
display(uint);  //数码管显示函数声明
delay(uchar);  //延时函数声明
void main()
{
        EA=1;
        ET0=1;
        TMOD=0X01;
        TH0=(65536-50000)/256;  //给定时器0装初值,12M晶振定时时间为50ms
        TL0=(65536-50000)%256;
        TR0=1;
        while(1)
        {
                if(num==20)   //如果到了20次,说明1秒时间到了
                {
                        num=0;   //然后把num的值清0,让它重新再计20次
                        if(disnum==1000)   //这个数用来送到数码管显示,到1000后归0
                        disnum=0;
                        disnum++;        //每到1秒钟,disnum的值加1
                }
                display(disnum);   //数码管显示
        }
}

void time0() interrupt 1     
{
        TH0=(65536-50000)/256;   //重装初值,12M晶振隔间50ms重装一次
        TL0=(65536-50000)%256;
        num++;   //每中断一次,num的值加1
}

display(uint disnum)   //数码管显示函数
{
          P0=0xff;       //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
        wela=1;
        wela=0;
        P0=table_du[disnum/100];    //百位上的数
        dula=1;
        dula=0;
        P0=0xfe;   //第1个数码管位选值
        wela=1;
        wela=0;
        delay(10);   //延时

           P0=0xff;       //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
        wela=1;
        wela=0;
        P0=table_du[disnum%100/10];   //十位上的数
        dula=1;
        dula=0;
        P0=0xfd;    //第2个数码管位选值
        wela=1;
        wela=0;
        delay(10);

        P0=0xff;       //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
        wela=1;
        wela=0;
        P0=table_du[disnum%100%10];    //个位上的数
        dula=1;
        dula=0;
        P0=0xfb;    //第3个数码管位选值
        wela=1;
        wela=0;
        delay(10);
}

delay(uchar x)   //延时函数
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}
回复 支持 反对

使用道具 举报

发表于 2022-10-22 08:47:29 | 显示全部楼层
有一段时间没有摸51系列的芯片了,这种问题应该与程序无关,还是编译环境及其设置的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-22 13:55:24 | 显示全部楼层
羊烊 发表于 2022-10-22 08:47
有一段时间没有摸51系列的芯片了,这种问题应该与程序无关,还是编译环境及其设置的问题。 ...

感觉也是,因为独独就是这个动态显示的程序有问题,数字跳变出问题,去到006 就不跳了。闪频又出现。希望有一天我能深入了解51 和keil 。亲自解决这个问题~
回复 支持 反对

使用道具 举报

发表于 2022-11-13 04:15:08 | 显示全部楼层
学了51,再学32,就把51忘了惭愧
回复 支持 反对

使用道具 举报

发表于 2023-2-7 16:38:52 | 显示全部楼层
很明显你这代码有问题, display执行的时间太长,if(num==20) 很有可能会错过。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-3-29 15:04 , Processed in 0.028753 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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