⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cx.txt

📁 一个用Atemga8开发的闹钟程序
💻 TXT
字号:
二.软件实现 
/***************************************************************************************** 
本程序是用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;  
    } } 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -