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

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

TOP

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

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

;----------------------------------------------------------------------------------
;--------单片机入门实验 红外接收与发射实验 AVR 汇编程序-----------
;----------------------------------------------------------------------------------
;作者: 超简单工作室
;Email: fullmous@hotmail.com
;软件版本: AVR Studio 4.13.571 Service Pack 2
;创建日期: 2008.3
;版本 V1.00
;
; Target : M48
; Crystal: 8.0000Mhz
;*****************************************************
.include "m48def.inc"

.org $0000
rjmp _main

.org $000d
rjmp _timer1_ovf_isr

.org $0020

_tabs:;定义字形数组
.db 192,249
.db 164,176
.db 153,146
.db 130,248
.db 128,152

_port_init:
clr R2
out 0x5,R2; PORTB = 0x00
ldi R24,255
out 0x4,R24; DDRB = 0xFF
out 0x8,R2; PORTC = 0x00
ldi R24,3
out 0x7,R24; DDRC = 0x03
ret

_timer1_init:;定时器1初始化
; //TIMER1 分频数:64
; // 定时: 10mSec
; TCCR1B = 0x00 关定时器
clr R2
sts 129,R2
; TCNT1H = 0xFB 设置数据寄存器高字节
ldi R24,251
sts 133,R24
; TCNT1L = 0x1E 设置数据寄存器低字节
ldi R24,30
sts 132,R24
; TCCR1A = 0x00;
sts 128,R2
; TCCR1B = 0x03 启动定时器1
ldi R24,3
sts 129,R24
ret

_div16: ;双字节除法。同时得到整数和余数
; 入口:除数在r18:r19中,被除数在r16:r17中
push R25 ;r24:r25存中间值,最后是商
push R24
clr R25
clr R24
L_div:
cp R16,R18 ;被除数与除数比较
cpc R17,R19
brlt L_end_div ;小于除数,结束
adiw R25:R24,1 ;否则,中间值加1
sub R16,R18 ;被除数减除数
sbc R17,R19
rjmp L_div ;返回继续
L_end_div:
mov R18,R24 ;除法运算结束,商存r18:r19中,余数留在r16:r17中
mov R19,R25
pop R24
pop R25
ret

_timer1_ovf_isr:;计数溢出中断服务子程序入口
st -y,R2
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
ldi R24,251;装入计数寄存器高字节
sts 133,R24
ldi R24,30;装入计数寄存器低字节
sts 132,R24
lds R24,_change;中断发生计数
subi R24,255 ;加一
sts _change,R24
cpi R24,100;判是否已中断100次
brne L4
clr R2;是,已定时1秒,_change清零
sts _change,R2
lds R24,_second;秒计数
cpi R24,59
brsh L6
subi R24,255 ;小于59秒,秒计数加1
sts _second,R24
rjmp L4
L6:
clr R2;否则,清零
sts _second,R2
L4:
lds R2,_led;_led等于0,显示个位
tst R2
brne L8
ldi R18,10;将秒数取10的模得到个位数
clr R19
lds R16,_second
clr R17
rcall _div16
ldi R24,low(_tabs<<1);字形送端口PORTB
ldi R25,high(_tabs<<1)
mov R30,R16
clr R31
add R30,R24
adc R31,R25
lpm R2,Z
out 0x5,R2
ldi R24,241;点亮个位
out 0x8,R24
ldi R24,1;改变_led标识的状态
sts _led,R24
rjmp L9
L8:;_led等于1,显示十位
ldi R18,10;将秒数除10取整得到十位数
clr R19
lds R16,_second
clr R17
rcall _div16
ldi R24,low(_tabs<<1);字形送端口PORTB
ldi R25,high(_tabs<<1)
mov R30,R18
clr R31
add R30,R24
adc R31,R25
lpm R2,Z
out 0x5,R2
ldi R24,242;点亮十位
out 0x8,R24
clr R2;改变_led标识的状态
sts _led,R2
L9:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R2,y+
reti;中断返回

_main:
cli;关中断
rcall _port_init
rcall _timer1_init
ldi R24,1
sts 111,R24;时能定时器1中断
sei;开全局中断
clr R2;初始化数据变量
sts _second,R2
sts _change,R2
sts _led,R2
L11:;无限循环
rjmp L11

ret

.DSEG;变量定义区

_led:
.db 0
_change:
.db 0
_second:
.db 0

 > 相关内容:

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

赞助商链接

最新文章

热门文章

推荐文章