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

📄 tc2_1.c

📁 arm的功能测试模块
💻 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 + -