//12M晶振
//共阴数码管
#include <reg51.h>
sbit red=P1^0
sbit green=P1^1
sbit yellow=P1^2
bit flag=1
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
unsigned char code wei[ ]={0xfd,0xfe}
unsigned char time=35
void main()
{
void show_time()
void show_light()
EA=1
ET0=1
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
TR0=1
red=0
while(1)
{
show_time()
show_light()
}
}
void show_time()
{
void delay()
unsigned char num=time,i
for(i=0i<2++i)
{
P2=wei[i]
P0=duan[num%10]
delay()
P0=0x00
num/=10
}
}
void delay()
{
int i
for(i=1000ii--)
}
void show_light()
{
if(flag)
{
if(!time)
{
flag=0
red=1
green=0
time=35
}
}
else
{
if(time>0&&time<4)
{
green=1
yellow=0
液数轮 }
毕并 if(!time)
{
yellow=1
red=0
flag=1
time=35
}
}
}
void dec_sec() interrupt 1
{
static count=0
TH0=(65536-50000)/256
TL0=(65536-50000)%256
if(++count==20)
{
闹信 count=0
time--
}
}
#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段的数码管显示时间。如果需要详细的继续追问。
代码修改如下,经keil编译,proteus仿真结果为 P1.0亮10秒,然后P1.1亮2秒,然后P1.2亮10秒,最后P1.0亮10秒,,,
#include <reg51.h>sbit R=P1^0//HONG
sbit W=P1^1//HUANG
sbit L=P1^2//LV
unsigned int a,b=0
//unsigned char code c[]={0xfe,0xfc,0xfb}//1110,1100,1011
unsigned char code c[]={0xfe,0xfD,0xfb,0xfd}//1110,1101,1011,1101//红 黄 绿 黄//修正黄灯的值,增加一个状态
void timer10s () interrupt 1
{
if (a<2000)
{
TH0=0xec//5ms
TL0=0x78
a++
// b=0//这里不能对b赋值
TR0=1
TR1=0//【增加】
}
if (a>=2000)
{
TH0=0xec
TL0=0x78
a=0
b++//b=1
if(b==4) b=0//【增加】
TR1=1
TR0=0//【增加】
}
}
void timer2s ()interrupt 3
{
if (a<400)
{
TH1=0xec
TL1=0x78
a++
TR1=1
TR0=0
}
if (a>=400)
{
TH1=0xec
TL1=0x78
a=0
b++//b=2
//
if(b==4) b=0//【增加】
TR0=1
TR1=0//【增加】
}
}
void main ()
{
EA=1
ET0=1
ET1=1
TMOD=0X11
TH0=0xec//5MS
TL0=0x78
TH1=0xec
TL1=0x78
TR0=1
TR1=0
P1=c[0]
b=0////【增加】
while (1)
{
switch (b)
{
case 0x00:P1=c[0]break
case 0x01:P1=c[1]break
case 0x02:P1=c[2]break
case 0x03:P1=c[3]break//增加一个状态
}
}
}
以上代码可以优化,如下:
#include <reg51.h>
sbit R=P1^0//HONG
sbit W=P1^1//HUANG
sbit L=P1^2//LV
unsigned int a,b=0
unsigned char code c[]={0xfe,0xfD,0xfb,0xfd}
void timer10s () interrupt 1
{
TH0=0xec//5ms
TL0=0x78
a++
if(TR1==1) TR1=0
if (a>=2000)
{
a=0
b++
if(b==4) b=0
TR1=1
TR0=0
}
}
void timer2s ()interrupt 3
{
TH1=0xec
TL1=0x78
a++
if(TR0==1) TR0=0
if (a>=400)
{
a=0
b++
if(b==4) b=0
TR0=1
TR1=0
}
}
void main ()
{
EA=1
ET0=1
ET1=1
TMOD=0X11
TH0=0xec//5MS
TL0=0x78
TH1=0xec
TL1=0x78
TR0=1
TR1=0
a=0//
b=0//
while (1)
{
switch (b)
{
case 0x00:P1=c[0]break
case 0x01:P1=c[1]break
case 0x02:P1=c[2]break
case 0x03:P1=c[3]break
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)