基于单片机用数码管显示的电子时钟设计论文

跪求!!
2025-01-04 08:18:13
推荐回答(3个)
回答1:

#include /*定义头文件*/
/************************************************************************************/
typedef unsigned char BYTE; /*自定义字节类型*/
/************************************************************************************/
#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/
#define HD7279_TEST 0xbf //测试
#define HD7279_RLC 0xa3 //循环左移
#define HD7279_RRC 0xa2 //循环右移
#define HD7279_RL 0xa1 //左移
#define HD7279_RR 0xa0 //右移
#define DECODE0 0x80 //译码方式0
#define HD7279_DECODE1 0xc8 //译码方式1
#define UNDECODE 0x90 //译码方式2: 不译码
#define HD7279_HIDE 0x98 //消隐
#define HD7279_FLASH 0x88 //闪烁
#define HD7279_SEGON 0xe0 //段亮
#define HD7279_SEGOFF 0xc0 //段灭
#define CMD_READ 0x15 //读

/************************************************************************************/
void Led_On(BYTE); /*定义点亮LED灯函数*/
void Led_Off(BYTE); /*定义熄灭LED灯函数*/
void write7279(BYTE,BYTE); /*定义HD7279写函数*/
BYTE read7279(BYTE); /*定义HD7279读函数*/
void Send_Byte(BYTE); /*定义HD7279发送字节函数*/
BYTE Receive_Byte(void); /*定义HD7279接收字节函数*/
void Short_Delay(void); /*定义短延时函数*/
void Long_Delay(void); /*定义长延时函数*/
void Mcu_Init(void); /*定义MCU初始化函数*/
void Delay_200_mS(void); /*定义200ms延时函数*/
void distime(void);//显示时间
void discalendar(void);//显示日历
void disweek(void);//显示星期
void disclock(void);//显示时钟
/************************************************************************************/
BYTE Key_number; /*定义键值变量*/
unsigned char second,minute,hour,weekday,cs=6,cm=00,ch=0,nextcs;//时间闹钟变量
unsigned int day=27,month=11,year=2009,Flag=0,mark=0,XQ,i,j,clock,wait_cnter=0;//年月日等变量
/************************************************************************************/
sbit key=P3^3; /*定义HD7279中断硬件连接--->INT1*/
sbit HD7279_Clk=P1^0; /*定义HD7279时钟硬件连接*/
sbit HD7279_Data=P1^1; /*定义HD7279数据硬件连接*/
sbit HD7279_CS=P2^6;
sbit D1=P1^4;//闹钟标志
/************************************************************************************/
void main(void)
{
Mcu_Init();
/*i=((year/1000)*10+(year/100)%10);
j=((year/10)%10+year%10);
XQ=(j+(j/4)+(i/4)-2*i+(26*(month+1)/10)+day-1)%7;*/
while(1)
{
if(clock==20)
{clock=0;
second++;}
if(second==60)
{second=0;
minute++;}
if(minute==60)
{minute=0;
hour++;}
if(hour==24)
{hour=0;

day++;
}
if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月
{if(month==2)
if(month==2)
{
if(day==29)
{
if(year%4==0&&year%100!=0||year%400==0)
mark=1; //mark闰年标志位
else
mark=2; }

if(mark==2) //2月为28天的
{
day=1;
month++;
if(month==13)
{
month=1;
year++; }
}
else //2月为29天的
{
if(day==30)
{
day=1;
month++; }
if(month==13)
{
month=1;
year++; }
}
}
if (day==31)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}

if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月
{if (day==32)
{ day=1;
month++;}
if (month==13)
{ month=1;
year++;
}
}
if(cs==60)
cs=0;
if(cm==60)
cm=0;
if(ch==24)
ch=0;
if(month==13)
{month=1;}
if(XQ==8)
{XQ=1;}
if(Flag==0)//显示日历
{discalendar();
}
if(Flag==2)//显示时间
{distime();

}
if(Flag==4)//显示星期
{if(month==1||month==2)//1,2特殊算法
{month+=12;
year--;
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
if(month==13||month==14)
{month=month-12;
year++;
}}
XQ=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
XQ=XQ+1;
disweek();}
if(Flag==6)//显示闹钟
{disclock();}
if(second==cs&&minute==cm&&hour==ch)
{D1=0;
nextcs=cs+30;}
if(second==nextcs&&minute==cm&&hour==ch)//定时30s
D1=1;
}
}

void Mcu_Init(void) /*MCU初始化函数*/
{
Set_Bit(EX1); /*外部中断1使能*/
Set_Bit(IT1); /*外部中断1下降沿触发*/
Set_Bit(ET0);
Set_Bit(TR0);
Set_Bit(EA); /*中断使能*/
TMOD=0X01;
TH0=0X4C;
TL0=0X00;
HD7279_CS=0;
Send_Byte(0xa4); /*HD7279复位*/

}
/************************************************************************************/

/************************************************************************************/
void int1_HD7279key(void) interrupt 2 /*外部中断1函数*/
{Key_number=read7279(CMD_READ);
Key_number=Key_number&0x0f;
while(!key); wait_cnter=0;
if(Flag==0)
{
switch(Key_number)
{case 0x00: write7279(DECODE0, (day+=1)%10); write7279(DECODE0, day/10);break; //调节日
case 0x01: write7279(DECODE0+2,(month+=1)%10); write7279(DECODE0+2,month/10);break; //调节月
case 0x02: write7279(DECODE0+4, (year+=1)%10); write7279(DECODE0+4, year/10);break; //调节年
case 0x03: Flag=1; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==2)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (second+=1)%10); write7279(DECODE0, second/10);break; //调节秒
case 0x01: write7279(DECODE0+3,(minute+=1)%10); write7279(DECODE0+3,minute/10);break; //调节分
case 0x02: write7279(DECODE0+6, (hour+=1)%10); write7279(DECODE0+6, hour/10);break; //调节时
case 0x03: Flag=3; break;
default : break;
}
while(!key); wait_cnter=0;
}

if(Flag==4)
{
switch(Key_number)
{
case 0x00: ;break;
case 0x01: ;break;
case 0x02: ;break;
case 0x03: Flag=5; break; //
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==6)
{
switch(Key_number)
{
case 0x00: write7279(DECODE0, (cs+=1)%10); write7279(DECODE0, cs/10);break; //调节闹钟秒
case 0x01: write7279(DECODE0+3,(cm+=1)%10); write7279(DECODE0+3,cm/10);break; //调节闹钟分
case 0x02: write7279(DECODE0+6, (ch+=1)%10); write7279(DECODE0+6, ch/10);break; //调节闹钟时
case 0x03: Flag=0; break;
default : break;
}
while(!key); wait_cnter=0;
}
if(Flag==1)
Flag=2;
if(Flag==3)
Flag=4;
if(Flag==5)
Flag=6;
}
void int_HD7279key(void) interrupt 1 /*定时中断0函数*/
{ TH0=0X4C;
TL0=0X00;
clock++;
}

/************************************************************************************/

void Short_Delay(void) /*短延时函数*/
{
BYTE i;
for(i=0;i<0x08;i++);
}
/************************************************************************************/
void Long_Delay(void) /*长延时函数*/
{
BYTE i;
for(i=0;i<0x30;i++);
}

/************************************************************************************/
void write7279(BYTE Command,BYTE Data) /*HD7279写函数*/
{
Send_Byte(Command);
Send_Byte(Data);
}
/************************************************************************************/
BYTE read7279(BYTE Command) /*HD7279读函数*/
{
Send_Byte(Command);
return(Receive_Byte());
}
/************************************************************************************/

void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/
{
BYTE i;
Long_Delay();
for(i=0;i<8;i++)
{
if(Data_Out&0x80)
Set_Bit(HD7279_Data);
else Clear_Bit(HD7279_Data);
Set_Bit(HD7279_Clk);
Short_Delay();
Clear_Bit(HD7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(HD7279_Data);
}
/************************************************************************************/

BYTE Receive_Byte(void) /*HD7279接收字节函数*/
{
BYTE i,Data_In;
Set_Bit(HD7279_Data);
Long_Delay();
for(i=0;i<8;i++)
{
Set_Bit(HD7279_Clk);
Short_Delay();
Data_In=Data_In<<1;
if(HD7279_Data)
Data_In=Data_In|0x01;
Clear_Bit(HD7279_Clk);
Short_Delay();
}
Clear_Bit(HD7279_Data);
return(Data_In);
}
/************************************************************************************/void distime(void)
{
write7279(DECODE0, second%10);
write7279(DECODE0+1,second/10);

write7279(UNDECODE+2,0x01);

write7279(DECODE0+3,minute%10);
write7279(DECODE0+4,minute/10);

write7279(UNDECODE+5,0x01);

write7279(DECODE0+6,hour%10);
write7279(DECODE0+7,hour/10);
}
/************************************************************************************/
void discalendar(void)
{
write7279(DECODE0, day%10);
write7279(DECODE0+1,day/10);

write7279(DECODE0+2, month%10);
write7279(DECODE0+3, month/10);

write7279(DECODE0+4, year%10);
write7279(DECODE0+5, (year/10)%10);
write7279(DECODE0+6, (year/100)%10);
write7279(DECODE0+7, year/1000);
}
/************************************************************************************/
void disweek(void)
{
write7279(DECODE0, XQ%10);
write7279(DECODE0+1,0x0F);
write7279(DECODE0+2, 0x0F);
write7279(DECODE0+3, 0x0F);
write7279(DECODE0+4, 0x0F);
write7279(DECODE0+5, 0x0F);
write7279(DECODE0+6, 0x0F);
write7279(DECODE0+7, 0x0F);
}
/************************************************************************************/
void disclock(void)
{
write7279(DECODE0, cs%10);
write7279(DECODE0+1,cs/10);

write7279(UNDECODE+2,0x01);

write7279(DECODE0+3,cm%10);
write7279(DECODE0+4,cm/10);

write7279(UNDECODE+5,0x01);

write7279(DECODE0+6,ch%10);
write7279(DECODE0+7,ch/10);
}
/************************************************************************************/

回答2:

这个很简单的,论文你应该自己写,当然,也可以买别人设计好的。

回答3:

这个太简单了吧。还用跪求?