此程序模擬普通的電子表的功能,實現(xiàn)了時,分,秒的顯示,并有調(diào)表功能.程序簡單,好多地方并沒有注意細(xì)節(jié),只是實現(xiàn)了部分功能.
/************************************************************************/
/*程序:單片機(jī)模擬交通燈
/*日期:2008-5-11
/*作者:河南大學(xué)gys
/*yongsheng.gys@163.com
/************************************************************************/
//數(shù)碼管為8位七段共陽數(shù)碼管,數(shù)據(jù)端接在P0口,選擇端接P2口
//外部中斷0,選擇調(diào)時,分或秒,并閃爍,外部中斷1,閃爍位加1,實現(xiàn)調(diào)表
//注:些程序只是模擬,并無精確校準(zhǔn)
#include
unsigned charLED7Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0x0c6,0xa1,0x86,0x8e,
0xbf,//'-'
}; //七段共陽數(shù)碼管的編碼0-f
unsigned char LED7Addr[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //數(shù)碼管的地址
unsigned char flag=0;
unsigned char loop=0;
unsigned char second=0;
unsigned char minute=0;
unsigned char hour=0;
void delay(unsigned int n)//n=10000,延時90.05毫秒
{
while(n--);
}
void display(unsigned char addr,unsigned char LEDCode)//通用顯示函數(shù)
{
P2=LED7Addr[addr];//P2送數(shù)碼管的地址
P0=LED7Code[LEDCode];//P0送要顯示的數(shù)據(jù)
delay(500);//延時
}
void INT_EX0() interrupt 0
{
delay(2000);
if (!P3_2)
{
if(flag++>=3) flag=0;
}
}
void INT_EX1() interrupt 2
{
delay(2000);
if (!P3_3)
{
if(flag==1) second++;
if(flag==2) minute++;
if(flag==3) hour++;
}
}
void INT_T0() interrupt 1//定時器0
{
TL0=0xb0;//裝入初值,15536,定時50000us
TH0=0x3c;
loop++;
}
void main()
{
TMOD=0x01;//定時器0,工作方式2,16位定時器
TL0=0xb0;//裝入初值,15536,定時50000us
TH0=0x3c;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
IT0=1;//跳變方式
IT1=1;
EA=1;
while (1)
{
if(loop>=20)
{
second++;
loop=0;
}
if (second>=60)
{
second=0;
minute++;
}
if (minute==60)
{
minute=0;
hour++;
}
if (!(flag==3&&loop<10))
{
display(0,hour/10);
display(1,hour%10);
}
display(2,16);
if (!(flag==2&&loop<10))
{
display(3,minute/10);
display(4,minute%10);
}
display(5,16);
if (!(flag==1&&loop<10))
{
display(6,second/10);