?? rtc._c
字號:
/******************************************/
/* 目標MCU:MEGA8 晶振:內部RC(INT) 8MHZ */
/******************************************/
//說明:ATMEGA8只有在使用內部RC振蕩器,T2使用異步時鐘的
// 情況下,外接的32.768KHZ的晶振才起作用。
#include<iom8v.h>
#include<macros.h>
#define fosc 8000000
#define baud 19200
unsigned char m;
unsigned char hour;
unsigned char minute;
unsigned char second;
unsigned char day;
unsigned char month;
unsigned int year;
unsigned char mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/* 調整時間 */
void putchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
/* 字符輸入函數 */
unsigned char getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/* 字符串輸出函數 */
void puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0a);//回車換行
putchar(0x0d);
}
/* UART初始化 */
void uart_init(void)
{
// OSCCAL=read_flash(osc_address);
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允許發送和接收
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數據+1位STOP位
}
void time(void)
{
if (second<60)
return;
else
{
second-=60;
if (minute<59)
minute++;
else
{
minute=0;
if (hour<23)
hour++;
else
{ hour=0;
if(day<mon[m-1])
{ day++;
if(((((year%4)==0)&&((year%100)!=0))||((year%400)==0))&&(m==4))
mon[1]=28; }
else
{
day=0;
if(m<12)
m++;
else
year++;
if((((year%4)==0)&&((year%100)!=0))||((year%400)==0))
mon[1]=29;
}
}
}
}
}
//初始化
void timer2_init(void)
{
TCCR2 = 0x00;
ASSR = 1<<AS2; //異步時鐘
TCNT2 = 0xE0; //定時時間1秒
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分頻比1024,0x07
}
#pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0xE0;
second++;
}
void put_time(void)
{
putchar(year/1000+0x30);
putchar(year/100+0x30);
putchar(year/10+0x30);
putchar(year%10+0x30);
putchar(':');
putchar(month/10+0x30);
putchar(month%10+0x30);
putchar(':');
putchar(day/10+0x30);
putchar(dayr%10+0x30);
putchar(':');
putchar(hour/10+0x30);
putchar(hour%10+0x30);
putchar(':');
putchar(minute/10+0x30);
putchar(minute%10+0x30);
putchar(':');
putchar(second/10+0x30);
putchar(second%10+0x30);
}
//UART接收中斷
#pragma interrupt_handler uart0_rx_isr:iv_USART_RXC
void uart0_rx_isr(void)
{
unsigned i;
i=UDR;
if (i=='t')
{
year=(getchar()-0x30)*1000;
year=(getchar()-0x30)*100;
year=(getchar()-0x30)*10;
year=year+(getchar()-0x30);
month=(getchar()-0x30)*10;
month=month+(getchar()-0x30);
day=(getchar()-0x30)*10;
day=day+(getchar()-0x30);
hour=(getchar()-0x30)*10;
hour=hour+(getchar()-0x30);
minute=(getchar()-0x30)*10;
minute=minute+(getchar()-0x30);
second=(getchar()-0x30)*10;
second=second+(getchar()-0x30);
}
}
//main程序
void main(void)
{
unsigned char second_old;
uart_init();
timer2_init();
TIMSK =1<<TOIE2;
SEI();
while(1)
{
if (second!=second_old)
{
time();
second_old=second;
put_time();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -