#include<AT89X52.H>
#define LED_D P2
#define LED_S P1
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sfr P1M0=0xB2;
unsigned int m,i,post1,post2;
unsigned int k=0,nums=1,n=1;
void timer1() interrupt 1 using 1
{
i++;
TH0=0XB1; //初始化
TL0=0XE0; //初始化
post1=9-(i/50%10);
post2=2-i/500;
m=i/25;
if(m==60)
i=0;
}
void initialize()
{
P0=0XFF ;
TMOD=0X01;
TR0=1;
TH0=0XB1;
TL0=0XE0;
}
void show()
{ switch(n)
{ case 1:
LED_D=table[post1];
LED_S=0x01;
break;
case 3:
LED_D=table[post2];
LED_S=0x02;
break;
}
if(n++==4)
n=1;
switch(nums)
{
case 1:
if(m<52)
P0=0XDE;
if(m>=52&&m<59)
{P0_0=1;
if(k++>=50000)
{
P0_1=!P0_1;
k=0;
}
}
if(m==59)
nums=2;
break;
case 2:
if(m<52)
P0=0XF3;
if(m>=52&&m<59)
{
P0_3=1;
if(k++>=50000)
{
P0_4=!P0_4;
k=0;
}
}
if(m==59)
nums=1;
break;
default: break;
}
}
void main()
{
initialize();
EA=1;
P1M0=0XF0;
ET0=1;
TR0=1;
while(1)
{
show();
}
}
这是带数码管显示的红绿灯,主要用了四位8段的数码管显示时间。如果需要详细的继续追问。
void delay(int t)
{
unsigned int i, j;
j=t*60;
while(j--)
{
for(i=1000;i;i--);
}
} //约1秒延时
调用的时候调用 参数分别设为 3 15 就可以了
额。。能不能附上电路图。。
电路图网上找个 自己根据需要一下就好了 如果这个老兄都不会 单片机还一点都不会,再看看书吧
#define uchar unsigned char
void delayms(ms);
red=P0^0;
green=P0^1
yellow=P0^2;
int main(void)
{
while(1)
{
red=0;
delayms(15000);
red=1;
green=0;
delayms(15000);
green=1;
yellow=0;
delayms(3000);
}
}
return(0);
}
void delayms(ms)
{
uchar i;
for(ms;ms>0;ms--)
for(i=110;i>0;i--);
}