📄 rtc.c
字号:
/******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* 实时时钟演示程序 */
/* 作者:ntzwq@wx88.net */
/* 2002年5月12日 */
/* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
/******************************************/
//说明:ATMEGA8只有在使用内部RC振荡器,T2使用异步时钟的
// 情况下,外接的32.768KHZ的晶振才起作用。
#include<iom8v.h>
#include<macros.h>
#include"uart.h"
unsigned char hour;
unsigned char minute;
unsigned char second;
/* 调整时间 */
void time(void)
{
if (second<60)
return;
else
{
second-=60;
if (minute<59)
minute++;
else
{
minute=0;
if (hour<23)
hour++;
else
hour=0;
}
}
}
//初始化
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(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')
{
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 + -