[ICCAVR C 例程]AVR单片机定时器1做一个秒表 C 程序 - 单片机应用 - 博趣

  无线电   专题策划 行业动态 测试测量 单片机 精彩制作 精品套件 基础入门 试阅与下载 往期目录 官方淘宝店 制汇节
当前位置:博趣 -> 无线电 -> 单片机应用

TOP

[ICCAVR C 例程]AVR单片机定时器1做一个秒表 C 程序
发表日期:2012-03-02 08:54:08 来源:麦克鼠单片机学习网 作者: 【 】 浏览:5621次 评论:0

AVR单片机的定时器功能丰富。对入门学习者首先应掌握其最基本的定时中断功能。本实验用单片机入门实验套件提供的两位LED 8段数码管做一个小小秒表实验。定时器1工作在计数溢出中断模式,设计定时为10毫秒,正好是动态刷新LED数码管所需的时间。中断发生100次即计满一秒后,修改显示数据。这样就构成了一个简单的妙表。使用该程序加以扩充,增加LED数码管的数量,可以很容易的开发出计时、计日系统。要求高精度,则要加外晶振。该程序用ICCAVR-V7开发,在AVR单片机Atmega48上调试通过。
本实验的详细说明和硬件搭建请参考>>

//------------------------------------------------------------------------
//------单片机入门实验 定时器1做一个秒表 C 程序------------
//------------------------------------------------------------------------
//作者: 超简单工作室
//Email: fullmous@hotmail.com
//软件版本: ICCAVR ver 7.14
//创建日期: 2008.3
//版本 V1.00
// Target : M48
// Crystal: 8.0000Mhz

#include <iom48v.h>
#include <macros.h>

//定义字型数组
#pragma data:code
const unsigned tabs[]=
{
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x98,//"9"
};

unsigned char _second; //秒变量
unsigned char _change; //中断发生计数变量
unsigned char _led; //数码管显示位标识,0 显示个位,1 显示十位
unsigned char _t; //字形码数组索引

void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;//定义端口B输出
PORTC = 0x00;
DDRC = 0x03;//定义端口C的1,2位输出
}

//TIMER1 取64分频
// 定时: 10mSec
void timer1_init(void)
{
TCCR1B = 0x00; //关定时器
TCNT1H = 0xFB; //设置初值,数据寄存器高字节
TCNT1L = 0x1E; //设置初值,数据寄存器低字节
TCCR1A = 0x00;
TCCR1B = 0x03; //启动定时器
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)//TIMER1 中断服务程序
{
TCNT1H = 0xFB; //装入计数器高字节
TCNT1L = 0x1E; //装入计数器低字节
_change++; //中断发生计数
if (_change == 100) //判是否已中断100次
{
_change = 0; //是,已定时1秒,_change清零
if (_second < 59) //秒计数
_second++; //小于59秒,秒计数加1
else
_second = 0; //否则,清零
}
if (_led ==0) //_led等于0,显示个位
{
_t = _second % 10; //将秒数取10的模得到个位数,存入_t
PORTB = tabs[_t]; //字形送端口PORTB
PORTC = 0xf1; //点亮个位
_led = 1; //改变_led标识的状态
}
else
{ //_led等于1,显示十位
_t = _second / 10; //字形送端口PORTB
PORTB = tabs[_t]; //将秒数除10取整得到十位数,存入_t
PORTC = 0xf2; //点亮十位
_led = 0; //改变_led标识的状态
}
}

//
void main(void)
{
CLI(); //关闭中断
port_init();
timer1_init();

TIMSK1 = 0x01; //时能Timer1中断
SEI(); //开中断
_second = 0;
_change = 0;
_led = 0;
_t = 0;

while(1)
{
; //空循环,等待中断
}
}

 > 相关内容:

 
Tags:ICCAVR 例程 AVR 单片机 定时器 一个秒表 程序 责任编辑:博趣
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[AVR汇编例程]AVR单片机控制双色.. 下一篇[ICCAVR C 例程]AVR单片机 红外接..

赞助商链接

最新文章

热门文章

推荐文章