|
一.硬件电路图仅供参考
二.软件实现
/*****************************************************************************************
本程序是用CODEVISIONAVR编写的闹钟程序。当前时间和闹钟时间可以自由设定,由于本程序使用了较少的
库函数,所以往不同的开发平台移植较容易。比如往WINAVR上移植,只需编写DELAY函数即可。
TARGET CHIP;ATMEGA8
PORTD作为LED的数据端,PORTC.5&PORTC.5 PORTB.7&PORTB.6作为4个LED的片选
PORTC.1.PORTC.2作为设定当前时间和闹铃键
作者:谢长才
QQ:363236498(随风往事)
联系方式:X_CHC@EYOU.COM OR X_CHC@YAHHOO.COM.CN
时间:2005年6月
北京信息工程学院信息与通信系 *****************************************************************************************/
#include <mega8.h>
#include <delay.h>
static unsigned char g_bCount=0; //计数值
const unsigned char segled [10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //LED字符表
unsigned char ledbuff[10]={0,1,2,3,4,5,6,7,8,9}; //LED缓冲
unsigned char hh=0,hl=0,mh=0,ml=0,sh=0,sl=0,sec=0,minu=0,hr=0,timeh=7,tihh=0,tihl=0,timem=30, //全局变量
timh=0,timl=0;
void ledtest (void) //测试LED从0记到9
{
unsigned char i;
DDRC=0xf1;
PORTC=0x00;
DDRD=0xff;
DDRB=0xf1;
PORTB =0xff;
delay_ms(500);
PORTB =0x00;
for(i=1;i<=10;i++)
{
PORTD=segled[ledbuff[i-1]];
delay_ms(400);
} PORTD=0x00;
PORTB=0xf1;
PORTC|=0xf0;
}
void alarm(void) //音响提示1
{
unsigned char x,y,m;
for(m=0;m<8;m++) {
for(y=1;y<20;y++)
{
for(x=1;x<15;x++)
{
PORTC.0=1; PORTB.0 =1;
delay_us(75);
PORTC.0=0; PORTB.0 =0;
delay_us(75);
}
}
for(y=1;y<25;y++)
{
for(x=1;x<20;x++)
{
PORTC.0=1;
delay_us(400);
PORTC.0=0;
delay_us(400);
}
} }
}
void alarml(void) //音响提示2
{
unsigned char x,y,m;
for(m=0;m<8;m++) {
for(y=1;y<35;y++)
{
for(x=1;x<25;x++)
{
PORTC.0=1; PORTB.0 =1;
delay_us(175);
PORTC.0=0; PORTB.0 =0;
delay_us(705);
}
}
for(y=1;y<35;y++)
{
for(x=1;x<25;x++)
{
PORTC.0=1;
delay_us(1000);
PORTC.0=0;
delay_us(900);
}
}
}
}
void timedisplay (void) //显示当前闹铃设定时间
{ unsigned int i,j;
j=timem/10;
if(j>=6)
{ timh=j-6;
timeh++;
if(timeh>=24)
timeh-=24;
timem-=60;
}
else
timh=j;
timl=timem%10;
tihh=timeh/10;
tihl=timeh%10;
for (i=0;i<100;i++){
PORTB.7=0;
PORTD=segled[ledbuff[tihh]];
delay_ms(6);
PORTB.7=1;
PORTB.6=0;
PORTD=segled[ledbuff[tihl]];
delay_ms(6);
PORTB.6=1;
PORTC.5=0;
PORTD=segled[ledbuff[timh]];
delay_ms(6);
PORTC.5=1;
PORTC.4=0;
PORTD=segled[ledbuff[timl]];
delay_ms(6);
PORTC.4=1;}
}
void timeplay (void) //显示当前时间
{ unsigned int i,j;
j=minu/10;
if(j>=6)
{mh=j-6;
hr+=1;
if(hr>=24)
hr-=24;
minu-=60;
}
else
mh=j;
ml=minu%10;
hh=hr/10;
hl=hr%10;
for (i=0;i<100;i++){
PORTB.7=0;
PORTD=segled[ledbuff[hh]];
delay_ms(6);
PORTB.7=1;
PORTB.6=0;
PORTD=segled[ledbuff[hl]];
delay_ms(6);
PORTB.6=1;
PORTC.5=0;
PORTD=segled[ledbuff[mh]];
delay_ms(6);
PORTC.5=1;
PORTC.4=0;
PORTD=segled[ledbuff[ml]];
delay_ms(6);
PORTC.4=1;}
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //中断程序
{
TCNT0=0x00;
if(++g_bCount >14)
{
g_bCount=0;
sec++;
if(sec>=60) //秒判断
{
sec=0; minu++;
if(minu>=60) //分判断
{
minu=0;
hr++;
if(hr>=24) //小时判断
{
hr=0;
}
hh=hr/10;
hl=hr%10;
}
mh=minu/10;
ml=minu%10;
}
sh=sec/10;
sl=sec%10;
}
if((hr==timeh)&&(minu==timem)) //与闹铃设定的时间相同时报警
{alarm();
alarml();}
}
void main (void)
{
OSCCAL=0xa0; //振荡校验
ledtest(); //开机测试
DDRC=0xf1;
TCNT0=0; // T/C0开始值
TCCR0|=0x05; // 预分频 ck/1024 ,计数允许
TIMSK=0x01;
#asm("sei")
timedisplay (); //显示闹铃设定时间
while (1) //检测按键
{ if (PINC.1==1)
{ minu+=10; timeplay(); //当前时间加
delay_ms(70); }
if (PINC.2==1)
{ timem+=10; timedisplay(); //当前闹铃加
delay_ms(70); }
else //动态显示
{PORTB.7=0;
PORTD=segled[ledbuff[hh]];
delay_ms(7);
PORTB.7=1;
PORTB.6=0;
PORTD=segled[ledbuff[hl]];
delay_ms(7);
PORTB.6=1;
PORTC.5=0;
PORTD=segled[ledbuff[mh]];
delay_ms(7);
PORTC.5=1;
PORTC.4=0;
PORTD=segled[ledbuff[ml]];
delay_ms(7);
PORTC.4=1;
} }
}
-----此内容被x_chc于2005-06-15,22:47:58编辑过
-----此内容被x_chc于2005-06-15,22:55:15编辑过
-----此内容被x_chc于2005-06-16,23:04:00编辑过
-----此内容被x_chc于2005-06-16,23:15:32编辑过 |
|