先说下程序中的几个错误吧:
一、显示函数部分,void display(uchar shi,uchar ge),既然函数已经指定了变量名,调用此函数的时候就不可以再使用该函数定义的变量名 shi,ge,主循环中有错误
二、定时器1的中断部分,if(num==100); ,这一句判断根本没起作用,因为后面你加了个语句的结束符 ; 这就使此句语句直接结束了
三、中断内的计数判断语句 if(num==20),尽量不要这么写,万一程序溢出就麻烦了,就是说计数值从19就跳到21,则此句就不会执行。虽然程序是逐步运行的,看似没什么必要,但作为一个程序员,就要避免任何可能性的存在,所有都会这样写 if(num>=20)
四、中断内赋值时的运算,尽量使用括号,这样可以控制程序的运算顺序,避免出错,例如这一句 shi=num/10; ,应该写成 shi=(num/10); ,用括号括起来就保证了此句先进行运算后赋值
五、还是显示部分,P0=0; ,这样写是完全不对的写法,应使用十六进制的写法 P0=0x00;,只有一个数字0的,那是十进制表示法,只适合单个位单个端口的赋值,P0是八位的端口集合,所以只可以用十六进制表示法,例如P0全部置0,则要写成P0=0x00,P0的第0位置1,就写成P0=0x01,
另外,要实现此功能,只需利用一个定时器即可,使用两个太浪费了,也增加了系统的运行速度和可靠性等
帮忙改了下,看是否运行正常,这边硬件测试通过了,只是数码管的编码部分用的不一样
#include
#define uchar unsigned char
#define uint unsigned int
uint num,shi,ge;
sbit dula=P1^0;
sbit wela=P1^1;
uchar code table[]={0x3f,0x5b,0x66,0x7d,0x7f};
void display();
void delayms(uint xms);
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display();
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display()
{
dula=0;
P0=table[shi];
delayms(5);
dula=1;
wela=0;
P0=table[ge];
delayms(5);
wela=1;
}
void T1_time()interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
num++;
if(num>=1000)//1000等于1秒
{
num=0;
ge++;
if(ge>9){ge=0;shi++;}
if(shi>9){shi=0;}
}
}
你好!原理图发一下看看,程序可以帮你重写