#include "STC15.h"
//#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8,sheding,huan,jiaohuan,fuhao; //LED1到LDE8对应8个数码管,顺序从左到右 ,sheding用于调节变灯闪烁时间
u8 TIME; //huan用于红绿灯的切换
u8 code smgduan[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x01,0x40,0x08,0X49,0X00}; //前面9位显示数字,后面4位显示红绿灯交替
sbit beep=P2^0;
sbit key1=P2^1; //定义闪烁时间+
sbit key2=P2^2; //定义闪烁时间-
void delay(void) //延时20 us 误差0 us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=7;a>0;a--);
}
void delay500us(void) //误差 0us
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void DigDisplay()
{
/************东西时间变化***************/
if(jiaohuan==0) //jiaohuan是选择交通信号灯切换
{
P1=0XFE;
P0=(smgduan[LED8]|0x80);
delay();
P0=0X00;
P1=0XFD;
P0=(smgduan[LED7]);
delay();
P0=0X00;
/****************************/
P1=0X7F; //7F
P0=(smgduan[LED1]|0x80);
delay();
P0=0X00;
P1=0XBF; //BF
P0=(smgduan[LED2]);
delay();
P0=0X00;
}
/***********************************/
if(jiaohuan==1) //jiaohuan是选择交通信号灯切换
{
P1=0XFE;
P0=(smgduan[LED8]);
delay();
P0=0X00;
P1=0XFD;
P0=(smgduan[LED7]|0x80);
delay();
P0=0X00;
/****************************/
P1=0X7F;
P0=(smgduan[LED1]);
delay();
P0=0X00;
P1=0XBF; //BF
P0=(smgduan[LED2]|0x80);
delay();
P0=0X00;
}
/***************东西红 黄 绿**********************/
P1=0XFB;
P0=smgduan[LED6];
delay();
P0=0X00;
/***************东西红 黄 绿**********************/
P1=0XDF;
P0=(smgduan[LED3]);
delay();
P0=0X00;
}
void Timer0Init()
{
TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XD8; //给定时器赋初值,定时10ms
TL0=0XF0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void beep_up()
{
u8 i;
for(i=0;i<10;i++)
{
beep=~beep;
delay500us();
}
beep=1;
}
void timer_calculate() //时钟计算函数
{
/********************************************/
TIME--; //定时用
fuhao=3; //黄灯亮前三秒闪
LED7=TIME%10;
LED8=TIME/10;
LED1=LED7;
LED2=LED8;
if(TIME==0)
{
TIME=60;
jiaohuan=!jiaohuan;
}
if(TIME==2)
{
LED6=17;
LED3=17;
}
/*****************************************/
/**********************************************/
if(TIME<=sheding)
{
if(TIME>=fuhao)
{
huan=!huan;
if(jiaohuan==1)
{
switch(huan)
{
case 0: LED6=18; LED3=16;break;
case 1: LED6=20; LED3=20;break;
}
}
if(jiaohuan==0)
{
switch(huan)
{
case 0: LED6=16; LED3=18;break;
case 1: LED6=20; LED3=20;break;
}
}
}
}
/************************************************/
/*****************************************/
if(TIME==60)
{
beep_up();
if(jiaohuan==0)
{
LED6=16;
LED3=18;
}
if(jiaohuan==1)
{
LED6=18;
LED3=16;
}
}
}
void key_button()
{
if(key1==0)
{
delay10ms();
if(key1==0)
{
sheding++;
}
}
while(key1==0);
if(key2==0)
{
delay10ms();
if(key2==0)
{
sheding--;
}
}
while(key2==0);
if(sheding<=0||sheding>=56)sheding=10; //固定按键设定范围
}
void main()
{
Timer0Init();
key1=1;
key2=1;
LED1=9;// 秒针第一位,初始化
LED2=5;// 秒针第二位,初始化
LED4=0;// 分针第一位,初始化
LED5=0;// 分针第二位,初始化
LED7=9;// 时针第一位,初始化
LED8=5;// 时针第二位,初始化
LED6=16;
LED3=18;
jiaohuan=0;
TIME=59;
sheding=10;
huan=0;
P0M1=0X00;
P0M0=0X00;
P1M0=0X00;
P0M0=0X00;
while(1)
{
DigDisplay(); //数码管显示函数
// dengzhuan();
key_button();
}
}
void Timer0() interrupt 1
{
static u16 i=0;
TH0=0XD8; //给定时器赋初值,定时10ms
TL0=0XF0;
i++;
if(i==100)
{
i=0;
timer_calculate(); //时钟计算函数
}
} |