|
以下是基于51单片机数码管制作秒表的程序,由于是刚学单片机我找不出有错误,运行起来就这样了,一直不动,求大佬帮忙找找错误。
单片机源程序如下:
#include<reg52.h>
sbit addr0=P2^2;
sbit addr1=P2^3;
sbit addr2=P2^4;
sbit addr3=P2^5;
sbit enled=P2^6;
typedef unsigned u8;
typedef unsigned u16;
u8 code ledduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~9的值
u16 ledwei[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char count=0;//记录中断的次数。
unsigned char i=0;//动态扫描的索引。
unsigned char fragile;//一秒定时标志。
void main()
{
unsigned long sec=0;
TMOD=0x01;
TH0=0xfc;
TL0=0x67;
TR0=1;
EA=1;
ET0=1;
addr3=1;
enled=0;
while(1)
{
if(fragile==1)
{
fragile=0;
sec++;
ledwei[0]=ledduan[sec%10];
ledwei[1]=ledduan[sec/10%10];
ledwei[2]=ledduan[sec/100%10];
ledwei[3]=ledduan[sec/1000%10];
ledwei[4]=ledduan[sec/10000%10];
ledwei[5]=ledduan[sec/100000%10];
ledwei[6]=ledduan[sec/1000000%10];
ledwei[7]=ledduan[sec/10000000%10];
}
}
}
//定时器中断函数//
void time() interrupt 1
{
TH0=0xfc;
TL0=0x67;
TF0=0;
count++;
if(count==1000)
{
count=0;
fragile=1;
}
//以下完成数码管的扫描//
P0=0xff;
switch(i)
{ case 0: addr2=0;addr1=0;addr0=0;i++;P0=ledwei[0];break;
case 1: addr2=0;addr1=0;addr0=1;i++;P0=ledwei[1];break;
case 2: addr2=0;addr1=1;addr0=0;i++;P0=ledwei[2];break;
case 3: addr2=0;addr1=1;addr0=1;i++;P0=ledwei[3];break;
case 4: addr2=1;addr1=0;addr0=0;i++;P0=ledwei[4];break;
case 5: addr2=1;addr1=0;addr0=1;i++;P0=ledwei[5];break;
case 6: addr2=1;addr1=1;addr0=0;i++;P0=ledwei[6];break;
case 7: addr2=1;addr1=1;addr0=1;i=0;P0=ledwei[7];break;
default:break;
}
}
|
|