|
以下是基于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;
}
}
|
|