单片机课程设计 设计制作一个24小时制多功能数字钟

1.基本要求  (1)具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能。(2)数字显示小时、分钟,有AM、PM指示器,闹钟就绪灯,蜂鸣器。(备注:不采用时钟芯片)

第1个回答  2013-07-19
额。。。。。这个东西就是零碎的东西加起来变成一个一个整体的啊,讲个思路,写个中断服务程序,里面的是led灯亮的程序,和1秒的计时程序,写个beep子程序控制蜂鸣器,写个display子程序,控制icl0809,主程序循环控制,显示数码管,显示am,过了12,进入中断,显示pm,这个其实很简单的,我才大三,单片机才学了四个星期,我都会做,相信你能行的。。。
第2个回答  2013-07-19
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND & (1<<PD0))==0x00)
#define k2() ((PIND & (1<<PD1))==0x00)
#define k3() ((PIND & (1<<PD2))==0x00)
#define k4() ((PIND & (1<<PD3))==0x00)
#define k5() ((PIND & (1<<PD4))==0x00)
#define k6() ((PIND & (1<<PD5))==0x00)
#define k7() ((PIND & (1<<PD6))==0x00)
#define k8() ((PIND & (1<<PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};
INT8U ja;
INT8U key=0xff;
INT8U h,m,s,y,m1,d;
void hour1()
{
if (++h>23) {h=0;day();}
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
} void minute1()
{
if (++m>59)
{m=0;<br> hour1();<br> }
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
} void second1() {
if (++s>59)
{ s=0;
minute1();
}
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
}
void year()
{if (++y>99) y=0;<br> <br> <br> seg11[0]=seg[y/10];<br> seg11[1]=seg[y%10];<br> } void month1()
{
if (++m1>12)
{m=10;<br> year();<br> }
seg11[3]=seg[m1/10];
seg11[4]=seg[m1%10];
} void day() {
if (++d>30)
{ d=0;
month1();
}
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
} //时间函数
void time()
{
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
PORTA=0x00;
PORTA=seg11[ja]; PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(5); }
//日期
void date()
{ seg11[0]=seg[y/10];
seg11[1]=seg[y%10];
seg11[3]=seg[m1/10];
seg11[4]=seg[m1%10];
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
seg11[2]=seg11[5]=0x00;
PORTA=0x00;
PORTA=seg11[ja];
PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(3);
}
int main()
{ INT8U ja=0;
DDRA=0xff; PORTA=0xff;
DDRB=0xff; PORTB=0xff;
DDRD=0x00; PORTD=0xff;PIND=0x00;

MCUCR=0X0A;//MCU 控制寄存器- MCUCR
GICR=0XC0; //通用中断控制寄存器- GICR ASSR=0x08;
TCCR2=0x04;
TCNT2=0;
TIMSK=_BV(TOIE2)|_BV(TOIE0); d=y=m1=06;
h=m=s=12;
sei();
while(1)
{ time();

// if(k1())
// { while(k1()); hour1(); }

// if(k7())
//{ while(k7());
//

// while(2)//日期循环
// {

// date();
// if(k7())
// {while(k7());break;} // }
// }
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00;
}

else
{ seg11[2]=seg11[5]=0x40;
second1();
}
}

ISR(INT1_vect)
{ switch (PIND)
{ case 0b10000111 : minute1();break;

case 0b10010111 : hour1();break;
case 0b10100111 : second1();break;

} }本回答被网友采纳
第3个回答  2013-07-19
我以前做过一个类似的设计,你看看有没有帮助
第4个回答  2013-07-19
带闹钟智能电子钟
电路特点
以一片AT89C2051单片机为主体,其显示数据从P3.0-P3.7口输出,P1口输出对应的六位位选信号。电子钟程序设计时使用了T0作为计时,T1为调整时显示用。只要对程序稍加更改,可以很容易的实现8路定时功能。
电子钟只用一个轻触式按键来完成所有的设置。为了使闹钟音量足够大,采用了PNP型三极管8550来驱动蜂鸣器,驱动电阻用1K的,蜂鸣器为5V小型蜂鸣器。若用NPN来驱动蜂鸣器音量要小一点。LED数码管位驱动用8850,电子钟采用自制的3A开关电源供电。如图1。供电效率高,可和7-24V的直流电源直接连接,电子钟工作电流20MA左右。 http://www.5umcu.com/content.asp?id=337