📄 tc2_1.c
字号:
/*****************************************************
**** AVR T/C2 使用范例1(TC2用作实时时钟) ****
**** 作者: liugangdi ****
**** 编译器:WINAVR20050214 ****
**** 日期:2005.11.27 ****
******************************************************/
/*说明: TC2的基本功能与TC0相同,只是多了异步的晶振时钟,由
来自PC6(TOSC1)、PC7(TOSC2)的32768HZ的晶振提供,少了外部
脉冲信号的输入作为时钟源。
此程序功能简介:TC2的时钟源来自PC6(TOSC1)、PC7(TOSC2)的
32768HZ的晶振。对其128分频,计满256溢出1次,刚好为1s。允许
TC2溢出中断,在中断服务程序中,每秒加1,满60s,分加1,秒清0;
满60分,时加1,分清0,满24时,时清零。将时、分、秒寄存器中的
数转换成十进制数,在6位数码管中显示出来。PD0~PD5接6个为线,
PB0~PB7接字线。可利用proteus仿真,或者利用通用板接外围电路。*/
//仿真说明:仿真中用的数码管是共阴的,而我的mega16实验板是共阳的。
//所以要注意数码管字段的不同。仿真时每位的变化都会显示,实际中每秒
//显示30遍以上,人眼就可以看见稳定的5为数字。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdio.h>
#include <avr/delay.h>
#define uchar unsigned char
//#define uint unsigned int
uchar b_s=0,b_m=0,b_h=0;
uchar i_sh,i_g;
uchar d_s_g,d_s_sh,d_m_g,d_m_sh,d_h_g,d_h_sh;
uchar num_g,num_sh,num_b,num_q,num_w,num_sw;
//二转十子程序
void b8td(uchar n)
{
for (i_sh=0;n>=10;)
{n=n-10;
i_sh=i_sh+1;
}
i_g=n;
}
//延迟方法实现动态扫描显示函数
void smiao(void)
{PORTD=0XFE; //送个位位线
PORTB=num_g; //个位的BCD码送字线
_delay_ms(1); //延迟1MS
PORTD=0XFD; //送十位位线
PORTB=num_sh;
_delay_ms(1);
PORTD=0XFB; //送百位位线
PORTB=num_b;
_delay_ms(1);
PORTD=0XF7; //送千位位线
PORTB=num_q;
_delay_ms(1);
PORTD=0XEF; //送万位位线
PORTB=num_w;
_delay_ms(1);
PORTD=0XDF; //送十万位位线
PORTB=num_sw;
_delay_ms(1);
}
//TC2的初始化子程序
void init_timer2(void)
{
TIFR=0XFF; //写1清零
ASSR=0X08; //使用异步时钟
TCCR2=0X05; //128分频,1s中断一次
TCNT2=0X00; //TC2置初值0
TIMSK=0X40; //溢出中断使能
}
//TC2溢出中断服务程序
SIGNAL(SIG_OVERFLOW2)
{
b_s++; //秒增加1
if(b_s==60) {b_s=0;b_m++;} //到60秒,秒清零,分增加1
if(b_m==60) {b_m=0;b_h++;} //到60分,分清零,时增加1
if(b_h==24) b_h=0; //到24时,时清零
}
//主程序
int main(void)
{
uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
DDRB=0XFF;
DDRD=0XFF; //定义B口、D口的方向
init_timer2();
sei();
while(1)
{
b8td(b_s); //调用二转十子程序
d_s_g=i_g; num_g=tab[d_s_g];
d_s_sh=i_sh; num_sh=tab[d_s_sh]; //查处相应的7段数码管显示的数据
b8td(b_m);
d_m_g=i_g; num_b=tab[d_m_g];
d_m_sh=i_sh; num_q=tab[d_m_sh];
b8td(b_h);
d_h_g=i_g; num_w=tab[d_h_g];
d_h_sh=i_sh; num_sw=tab[d_h_sh];
smiao(); //调用动态扫描程序
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -