[AVR汇编例程]AVR单片机 红外接收与发射实验 - 单片机应用 - 博趣

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

TOP

[AVR汇编例程]AVR单片机 红外接收与发射实验
发表日期:2012-03-02 08:57:35 来源:麦克鼠单片机学习网 作者: 【 】 浏览:4098次 评论:0

单片机入门学习者练习用的AVR单片机的红外接收与发射实验程序。用单片机入门实验套件提供的红外接收与发射套件完成红外的反射、阻断等实验。红外发射与接收器件广泛应用于机器人竞赛项目中,像寻迹、追光、蔽障等都会用到红外接收与发射器件。该程序用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 $0020
_port_init: ;端口初始化
; PORTB = 0x00;
clr R2
out 0x5,R2
; DDRB = 0xFF;
ldi R24,255
out 0x4,R24
; PORTC = 0x00;
out 0x8,R2
; DDRC = 0x06;
ldi R24,6
out 0x7,R24
ret
_adc_init: ;ADC 初始化
; ADCSRA = 0x00; 设置前,先关闭ADC
clr R2
sts 122,R2
ldi R24,64 ; 选择内部AVCC为基准
sts 124,R24
ldi R24,128 ;关闭模拟比较器
out 0x30,R24
; 使能ADC,启动ADC单次转换,选64分频
ldi R24,198
sts 122,R24
ret
_adc_get:
; ADC 转换函数
; 启动ADC转换
lds R24,122
ori R24,64
sts 122,R24
L4:
; 判断ADC转换是否结束
lds R2,122
sbrc R2,6
rjmp L4
lds R16,120
lds R17,120+1
ret
_delay_us: ;微秒级延时
L8:
subi R16,1
sbci R17,0
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L8
ret
_delay_ms: ;毫秒级延时
st -y,R20
st -y,R21
mov R20,R16
mov R21,R17
L12:
ldi R16,low(1000)
ldi R17,high(1000)
rcall _delay_us
subi R20,1
sbci R21,0
cpi R20,0
cpc R20,R21
brne L12
ld R21,y+
ld R20,y+
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
_main:
rcall _port_init
rcall _adc_init
L16:
; ADC转换一次
rcall _adc_get ;结果在r16:r17中
; adc_v = adc_v/10;
ldi R18,10 ;结果除10,保证AD转换的最大值100
ldi R19,0
rcall _div16
mov R17,R19 ;除10得到的结果送r16:r17
mov R16,R18
cpi R16,100 ;被除数与除数比较
brlt L17 ;大于100,置成99
ldi R16,99
L17:
; t = adc_v /10;
ldi R18,10 ;继续除10
ldi R19,0
rcall _div16 ;得到一个小于10的商在r18中,10的模在r16中
; PORTB = tabs[t];
ldi R24,2
mul R24,R18 ;将r18中的值乘2,结果在r0:r1中
movw R30,R0 ;将r0:r1的值赋给r30:r31,作为偏移量
ldi R24,low(_tabs<<1) ;获取字符表基地址
ldi R25,high(_tabs<<1)
add R30,R24 ;偏移量+基地址构成z指针
adc R31,R25
lpm R18,Z+0 ;取字型送入r18
out 0x5,R18 ;字型送PortB,输出
; PORTC = (1<<2);
ldi R24,4
out 0x8,R24 ;4送端口portc,即置位portc.2
; delay_ms(10);
push R16 ;r16中是除10的余数,即10的模,保存
ldi R16,10
ldi R17,0
rcall _delay_ms ;延时10ms
;
; PORTB = tabs[t];
pop R16 ;弹出r16
ldi R24,2
mul R24,R16 ;将r16中的值乘2,结果在r0:r1中
movw R30,R0 ;将r0:r1的值赋给r30:r31,作为偏移量
ldi R24,low(_tabs<<1) ;获取字符表基地址
ldi R25,high(_tabs<<1)
add R30,R24 ;偏移量+基地址构成z指针
adc R31,R25
lpm R16,Z+0 ;取字型送入r16
out 0x5,R16 ;字型送PortB,输出
; PORTC = (1<<1);
ldi R24,2
out 0x8,R24 ;2送端口portc,即置位portc.1
; delay_ms(10);
ldi R16,10 ;延时10ms
ldi R17,0
rcall _delay_ms
rjmp L16
ret
_tabs: ;字形定义表
.dw 192
.dw 249
.dw 164
.dw 176
.dw 153
.dw 146
.dw 130
.dw 248
.dw 128
.dw 152

 > 相关内容:

 
Tags:AVR 汇编 单片机 红外 接收 发射 实验 责任编辑:博趣
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[AVR汇编例程]AVR单片机定时器1做.. 下一篇[AVR汇编例程]AVR单片机 ADC转换..

赞助商链接

最新文章

热门文章

推荐文章