#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(); //時鐘計算函數
}
} |