avr单片机汇编参考程序

2019-11-14来源: 51hei关键字:avr  单片机  汇编

该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。

该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。



                           图  简易24小时时钟硬件原理图

系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式,ATmega128的PA口输出显示数字的7段码(注意:图中省缺了PA口连接到LED各段的8个限流电阻,阻值800欧左右),PC口用于控制8个LED的位选。ATmega128使用外部16MHz晶振(图中未画出)。

系统还使用ATmega128片内的计数/定时器T1,设计T1工作在定时溢出中断方式,定时间隔为2ms,即T1每2ms产生一次中断。5次中断得到10ms的时间间隔,此时时钟的1/100秒加1,并相应进行时、分、秒的调整。

LED动态扫描方式的设计如下:在每2ms的时间中,点亮8个LED中的一个,显示其相应的数字(PC口的输出只有一位为低电平,选通一个LED,保持2ms)。因此PC口的输出值为0b11111110,每隔2ms循环右移,到0b01111111时8个LED各点亮一次,时间为16ms。在1秒钟内,循环8个LED的次数为62.5(1000/16),是人眼的滞留时间(25次/秒)的2.5倍,保证了LED显示亮度均匀,无闪烁。在程序设计中,在各个LED转换和7段码输出时,关闭位选信号(PC输出0b11111111),消除了显示的拖尾现象(消影功能)。

T1的设计:T1为16位定时器,系统时钟为16M,采用其64分频后的时钟作为T1的计数信号(寄存器TCCR1B = 0x03),一个计数周期为4us,2ms需要计500个(0x01F4)。由于T1溢出中断发生在0xFFFF后下一个T1计数脉冲的到来(参见第二章关于定时器原理部分),因此T1的计数初始值为0xFE0C = 0xFFFF – 0x01F3(65535-499),即寄存器TCNT1的初值为0xFE0C。


3.8.2  AVR汇编源代码

  该系统的汇编源代码如下,开发软件平台使用AVR Studio 4.08。


;********************************************************


;AVR汇编程序实例


;简易带1/100秒的24小时制时钟


;********************************************************


.include "m128def.inc"                ;引用器件I/O配置文件




;定义程序中使用的变量名(在寄存器空间)


.def count                =        r18        ;循环计数单元


.def position                =        r19        ;LED显示位指针,取值为0-7


.def p_temp                 =        r20        ;LED显示位选,其值取反由PC口输出


.def count_10ms        =        r21                ;10ms计数单元


.def flag_2ms                =        r22        ;2ms到标志


.def temp                        =        r23        ;临时变量


.def temp1                =        r24                ;临时变量


.def temp_int                =        r25        ;临时变量(中断中使用)




;中断向量区定义,flash空间$0000-$0045


.org $0000


        jmp reset                ;复位处理


        reti                        ;IRQ0 Handler


        nop


        reti                        ;IRQ1 Handler


        nop


        reti                        ;IRQ2 Handler


        nop


        reti                        ;IRQ3 Handler


        nop


        reti                        ;IRQ4 Handler


        nop


        reti                        ;IRQ5 Handler


        nop


        reti                        ;IRQ6 Handler


        nop


        reti                        ;IRQ7 Handler


        nop


        reti                        ;Timer2 Compare Handler


        nop


        reti                        ;Timer2 Overflow Handler


        nop


        reti                        ;Timer1 Capture Handler


        nop


        reti                        ;Timer1 CompareA Handler


        nop


        reti                        ;Timer1 CompareB Handler


        nop


        jmp time1_ovf ;Timer1 Overflow Handler


        reti                        ;Timer0 Compare Handler


        nop


        reti                        ;Timer0 Overflow Handler


        nop


        reti                        ;SPI Transfer Complete Handler


        nop


        reti                        ;USART0 RX Complete Handler


        nop


        reti                        ;USART0 UDR Empty Handler


        nop


        reti                        ;USART0 TX Complete Handler


        nop


        reti                        ;ADC Conversion Complete Handler


        nop


        reti                        ;E2PROM Ready Handler


        nop


        reti                        ;Analog Comparator Handler


        nop


        reti                        ;Timer1 CompareC Handler


        nop


        reti                        ;Timer3 Capture Handler


        nop


        reti                        ;Timer3 CompareA Handler


        nop


        reti                        ;Timer3 CompareB Handler


        nop


        reti                        ;Timer3 CompareC Handler


        nop


        reti                        ;Timer Overflow Handler


        nop


        reti                        ;USART1 RX Complete Handler


        nop


        reti                          ;USART1 UDR Empty Handler


        nop


        reti                        ;USART1 TX Complete Handler


        nop


        reti                        ;Two-wire Serial Interface Handler


        nop


        reti                        ;SPM Ready Handler


        nop                




;程序开始


.org $0046


reset: 


        ldi r16,high(RAMEND)                ;设置堆栈指针高位


        out sph,r16


ldi r16

[1] [2] [3] [4]
关键字:avr  单片机  汇编 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479973.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机一些学习笔记
下一篇:AVR的指令与汇编器系统及宏指令

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR编程_如何通过软件复位AVR?
Question如何通过软件复位AVR?Answer如果你想通过软件复位AVR,你应该使用内部看门狗。简单的使能它和让它溢出。当看门狗触发后,程序计数器返回到0,清除所有的寄存器和其他正在执行的任务,这与将RESET脚拉低有同样的效果。你不应该处理: --用另一个AVR的引脚连接外部RESET引脚。在短暂的复位时间,AVR的引脚会三态失效,这会导致RESET无效。 --跳到程序地址0,跳到程序地址0,这不会清除全部的寄存器,所以你不会得到一个完整的“复位”。下列是每30mS复位一次AVR的例子代码(GCC):#include <avr/io.h>#include <avr/wdt.h>int main
发表于 2019-12-11
AVR(M48)的i2c程序,读写at24c02
//ICC-AVR application builder : 2007-12-5 17:34:01// Target : m48// Crystal: 1.0000Mhz#include <iom168v.h>#include <macros.h>#include <myfun.h>//#include <I2C.h>#define START 0x08#define ReSTART 0x10#define MT_SLA_ACK 0x18#define MT_DATA_ACK 0x28#define MR_SLA_ACK 0x40#define MR_DATA_ACK
发表于 2019-12-11
AVR ATMEGA8 串口USART
avr串口配置很简单,配置就几个寄存器就可以进收发;但有几点要搞明白的是:1、串口一但被配置成功IO功能自动被占用,这点与LPC或STM8/32不同(需要寄存配置);2、没有专门的串口开起或闭关功位(整个串口);3、读写控制寄存器C需要把URSEL位写成1,而读写UBRRH寄存器时须要URSEL写成0;   1: //晶振频率     2: #define F_CPU 6000000UL     3: //波特率     4: #define BAUD 9600  
发表于 2019-12-10
avr官方充电器
我主要做的是对LiIon电池进行充电,用到的主要是AVR的相位修正PWM和ADC,AVR--PWM分为三种:1.快速PWM模式--单斜边工作模式,计数器从BOTTOM到TOP,对于普通比较模式OCnx在TCNTn与OCRnx匹配时置位,在TOP时清零,PWM频率fpwm = fclk/(N(1+TOP)),N为分频系数。              2.相位修正PWM模式--双斜边工作模式, 计数器重复的从BOTTOM到TOP,然后又从TOP退到BOTTOM,一般工作模式下,往TOP计数时OCnx在TCNTn与OCRnx匹配时清零,往BOTTOM计数时置位,fpwm
发表于 2019-12-10
ubuntu下gcc-avr安装
ubuntu下研究arduino时发现,原来可以不用arduino IDE开发,linux下还有gcc-avr直接开发avr系列的控制器。于是,迫不及待的查看了下相关资料,总结一下安装gcc-avr的步骤。PS:感叹一下,现在ubuntu做得实在是太好用了,以前很费心的事情,现在都很简单了。1、更新下系统,并安装开发包。apt updateapt upgradeapt install build-essential2、安装gcc-avr的工具链。apt install gcc-avr avr-libc avrdude gdb-avr3、安装相关软件的帮助文档。apt install avrdude-doc gcc-doc
发表于 2019-12-10
打造最强Eclipse-嵌入式开发环境(AVR)
,所以当前MinGW是最好的选择,当然你也可以选择CodeBlocks、C-free等等以上安装都比较简单,在网上检索相关博客即可,需要注意的是要添加必要的系统环境变量。为此我使用批处理脚本做了一个插件,敬请期待我的其他博文。推荐其他相关博文:搭建Eclipse IDE AVR开发平台搭建AVR-C语言开发环境eclipse+winavreclipse 环境搭建_百度经验我将其分别安装在D:CODEMinGW   D:CODEeclipse-Luna目录下,这样便于管理我的Eclipse必备插件列表: AVR-Eclipse       辅助配置AVR项目  
发表于 2019-12-10
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved