honami520 2008-4-15 23:32
用新买的51单片机试验板做的秒表
图片当然是没有的!我只能发个电路图,和相关代码。其中P0输出是共阳极8个LED。其他的电路图上都有!
4个数码管是通过74HC595来驱动的。
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code tab[]=
{ 0x3F,0x06,0x5B,0x4F, //"0","1","2","3"
0x66,0x6D,0x7D,0x07, //"4","5","6","7"
0x7F,0x6F,0x77,0x7c, //"8","9","A","B"
0x39,0x5e,0x79,0x71, //"C","D","E","F"
} ;
sbit dat=P1^0;
sbit clk=P1^1;
sbit lat=P1^2;
sbit gw=P1^3;
sbit sw=P1^4;
sbit bw=P3^3;
sbit qw=P3^4;
uchar a=0,g=0,s=0,b=0,q=0,temp=0xfe;
void delay(uchar z)
{
uint i,j;
for(z;z>0;z--)
for(i=20;i>0;i--)
for(j=25;j>0;j--);
}
roll(uchar j) //移位寄存
{
uchar i;
for(i=0;i<8;i++) //8位数,移动8次
{
dat=j&0x80; //接受1位
clk=1; //来个时钟沿数据传送过去
clk=0;
j<<=1; //数据左移
}
lat=1; //锁存
lat=0;
}
void display()
{
while(q<17)
{
roll(tab[g]);
gw=0;
delay(1);
gw=1;
roll(tab[s]);
sw=0;
delay(1);
sw=1;
roll(tab[b]);
bw=0;
delay(1);
bw=1;
roll(tab[q]);
qw=0;
delay(1);
qw=1;
}
}
void ext0() interrupt 1 //T0定时中断
{
a++;
TH0=(65536-50000)/256; //定时50ms
TL0=(65536-50000)%256;
if(a==20) //20次中断合计1秒后
{ a=0;
g++;
P0=temp;
temp=_crol_(temp,1);
if(g==10)
{ g=0;
s++;
}
if(s==10)
{ s=0;
b++;
}
if(b==10)
{
b=0;
q++;
}
if(q==10)
{
q=0;
}
}
}
void main()
{ TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display();
}
}
girlyal 2008-8-20 21:43
办公家具
*** 作者被禁止或删除 内容自动屏蔽 ***