同一个程序,用 keil2 成功但用 keil5 不行?
本帖最后由 dtam22 于 2022-10-21 17:07 编辑你好,51 新手,下了个keil5 ,拷了学习程序,用keil2转出的 .hex 能成功。
但用keil5 转出的.hex 出来效果完全不一样。
用了keil5 出来的,没有消隐效果,会闪,到了006 就停了。
不会再加数。
(keil5 会有warning,但keil2 没有)
有大神能帮忙看看?
谢谢
#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; //百位上的数
dula=1;
dula=0;
P0=0xfe; //第1个数码管位选值
wela=1;
wela=0;
delay(10); //延时
P0=0xff; //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
wela=1;
wela=0;
P0=table_du; //十位上的数
dula=1;
dula=0;
P0=0xfd; //第2个数码管位选值
wela=1;
wela=0;
delay(10);
P0=0xff; //关闭所有数码管显示,防止有交替重影,专业名称叫(消隐)
wela=1;
wela=0;
P0=table_du; //个位上的数
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--);
} 有一段时间没有摸51系列的芯片了,这种问题应该与程序无关,还是编译环境及其设置的问题。 羊烊 发表于 2022-10-22 08:47
有一段时间没有摸51系列的芯片了,这种问题应该与程序无关,还是编译环境及其设置的问题。 ...
感觉也是,因为独独就是这个动态显示的程序有问题,数字跳变出问题,去到006 就不跳了。闪频又出现。希望有一天我能深入了解51 和keil 。亲自解决这个问题~ 学了51,再学32,就把51忘了惭愧 很明显你这代码有问题, display执行的时间太长,if(num==20) 很有可能会错过。
页:
[1]