51單片機(jī)模擬秒表
此程序模擬普通的電子表的功能,實(shí)現(xiàn)了時(shí),分,秒的顯示,并有調(diào)表功能.程序簡(jiǎn)單,好多地方并沒(méi)有注意細(xì)節(jié),只是實(shí)現(xiàn)了部分功能.
/************************************************************************/
/* 程序:?jiǎn)纹瑱C(jī)模擬交通燈
/* 日期:2008-5-11
/* 作者:河南大學(xué) gys
/* yongsheng.gys@163.com
/************************************************************************/
//數(shù)碼管為8位七段共陽(yáng)數(shù)碼管,數(shù)據(jù)端接在P0口,選擇端接P2口
//外部中斷0,選擇調(diào)時(shí),分或秒,并閃爍,外部中斷1,閃爍位加1,實(shí)現(xiàn)調(diào)表
//注:些程序只是模擬,并無(wú)精確校準(zhǔn)
#include
unsigned char LED7Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0x0c6,0xa1,0x86,0x8e,
0xbf, //'-'
}; //七段共陽(yáng)數(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,延時(shí)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); //延時(shí)
}
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 //定時(shí)器0
{
TL0=0xb0; //裝入初值,15536,定時(shí)50000us
TH0=0x3c;
loop++;
}
void main()
{
TMOD=0x01; //定時(shí)器0,工作方式2,16位定時(shí)器
TL0=0xb0; //裝入初值,15536,定時(shí)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);
display(7,second%10);
}
}
}