|
1、任務(wù)名稱:時鐘萬年歷。
2、功能要求:第一行顯示年月日,第二行顯示時間,并可以設(shè)定日期和時間。
3、硬件要求:單片機(jī)芯片采用AT89C51,液晶屏選用LM016L。
4、任務(wù)提交:在Keil uVision中完成程序設(shè)計并提交工程文件電子檔;在Protues中完成電路設(shè)計并提交工程文件電子檔。
部分單片機(jī)代碼:
#include<1602.h>
unsigned charcount,hour=10,min=10,sec=0,month=11,day=10,flag;
unsigned intyear=2010;
unsigned char codedays_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
main()
{
unsigned charis_leapyear(unsigned char year);
unsigned chardays_of_month(unsigned char month);
voiddisplay(unsigned char mode);
EA=1; // 開總中斷
ET1=1;
EX0=1; // 開總外斷0
IT0=1; // 外 中斷1 下降沿觸發(fā)
TMOD=0X11; // 定時器工作在方式1,定時方式
TL1=0Xaf; //設(shè)置定時器0初值,5ms
TH1=0X3C;
TR1=1; // 啟動定時器
LCD_initial();
while(1)
{
display(flag);
}
}
void timer1() interrupt 3 //定時中斷函數(shù)
{
TL1=0Xaf;
TH1=0X3C;
count++;
if(count==20)
{count=0;
sec++;
if(sec==60)
{min++;sec=0;
if(min==60)
{ hour++;min=0;
if(hour==24)
{hour=0;
day++;
if(day==days_of_month(month)+1)
{day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
}
}
}
}
void int0() interrupt 0 //外中斷0函數(shù) ,時間和日期設(shè)定
{
if(T0==1 )
{ flag++;
if(flag==7)
flag=0;
}
else if(T1==1 )
{ switch(flag)
{
case1: year++;if(year==100) year=0;break;
case 2: month++;if(month==13)month=1;break;
case 3:day++;if(day==days_of_month(month)+1) day=1;break;
case 4: hour++;if(hour==24)hour=0;break;
case 5: min++;if(min==60) min=0;break;
case 6: sec++;if(sec==60) sec=0;break;
default:break;
}
}
else if( WR==1 )
{ switch(flag)
{
case1: year--;if(year==255) year=99;break;
case 2: month--;if(month==0)month=12;;break;
case 3: day--;if(day==0)day=days_of_month(month);break;
case 4: hour--;if(hour==255)hour=23;break;
case 5: min--;if(min==255) min=59;break;
case 6: sec--;if(sec==255) sec=59;break;
default:break;
}
}
else
{
flag=0;
}
}
void delay()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<60;j++);
}
|
評分
-
查看全部評分
|