AVR汇编百例晋级篇参考程序.docx

上传人:b****0 文档编号:579000 上传时间:2022-10-11 格式:DOCX 页数:45 大小:36.23KB
下载 相关 举报
AVR汇编百例晋级篇参考程序.docx_第1页
第1页 / 共45页
AVR汇编百例晋级篇参考程序.docx_第2页
第2页 / 共45页
AVR汇编百例晋级篇参考程序.docx_第3页
第3页 / 共45页
AVR汇编百例晋级篇参考程序.docx_第4页
第4页 / 共45页
AVR汇编百例晋级篇参考程序.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

AVR汇编百例晋级篇参考程序.docx

《AVR汇编百例晋级篇参考程序.docx》由会员分享,可在线阅读,更多相关《AVR汇编百例晋级篇参考程序.docx(45页珍藏版)》请在冰豆网上搜索。

AVR汇编百例晋级篇参考程序.docx

AVR汇编百例晋级篇参考程序

;  以下提供几个补充参考程序,都带有详细说明和指令注释.它们是主从多机通讯程序,采

;用中断方式写入EEPROM,直接对晶振分频产生0.1秒和秒号的精确定时程序,以及RS-232/

;RS-485标准转换程序,AVR频率计程序,串行时锺日历芯片DS1302读写,共享时基的PWM输出、

;输入捕获测周期程序和定时信号获取,以及DS18B20测温等程序.多机通讯主要用8和9位数

;据模式区分被选分机(9位)和其它分机(8位),达到主机只与被选分机交换数据之目的.以中

;断方式写EEPROM的优点是可与系统运行同时进行(即在线写入),占用很少机时.

;精确定时用定时/计数器1(或0)直接对MCU主频(不设分频)设定时间常数,分频精度可达到

;1HZ.RS-232/RS-485标准转换程序中AVR不作中转,使两种器件相关脚位直接连接.以TCNT0

;定时,以T0引脚接收RS-232数据.以收到RS-232字符起始位下跳沿或结束符($03)为依据,

;控制切换RS-485的收发使能.(系统中的主AVR可兼做对通信标准之监控转换,即只是在完成

;主要工作任务的同时'附带'进行).具体过程不再细述.串行时锺日历芯片DS1302具体积小,

;可靠性高,与单片机连接方便等优点.

;  以下程序请参看有关章节或程序中的注释。

;范例91;多机通讯主机程序/晶振4MHZ

.ORG0;以8/9位数据模式区分被选/未被选分机通讯

.EQUDTPINT=$180;UBRR=12波特率19200(REL.ERR.=0.16%)

.EQUDRPINT=$1C0;主机对1#,2#,3#,4#分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BF

STRT38:

RJMPRST38;主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF

.ORG$00B;

RJMPSTRT38

.ORG$00C

RJMPSTRT38;主机不设串口中断,只以查询接收

.ORG$011

RST38:

LDIR16,12

OUTUBRR,R16;设波特率:

[BAUDRATE=FCP/16(UBRR+1)]

CLRR15;初始化分机号

LDIR27,HIGH(DTPINT)

LDIR26,LOW(DTPINT);发送数据指针(首指$180)

LDIR29,HIGH(DRPINT)

LDIR28,LOW(DRPINT);接收数据指针(首指$1C0)

NEXTNO:

LDIR16,$18

OUTUCR,R16;允许UART接收和发送,8位数据模式

INCR15;指向1#分机

OUTLP:

OUTUDR,R15;呼分机号,1:

1#/2:

2#/03:

3#/04:

4#...

TSLOP:

INR16,USR

SBRSR16,7

RJMPTSLOP;分机返回机号?

INR16,UDR

CPR16,R15;分机号正确返回?

BRNEOUTLP

LDIR16,$1C;改为9位数据模式TXB8=0

OUTUCR,R16;

TXLOP:

LDR16,X+

OUTUDR,R16;向分机发送数据块

TESTL:

INR17,USR

SBRSR17,5

RJMPTESTL;等待发送完成

CPIR16,$0A

BRNETXLOP;

RXTST:

INR17,USR

SBRSR17,7;RXC=1收到数据

RJMPRXTST;等待接收分机返回数据块

INR16,UDR

STY+,R16;存储接收数据

CPIR16,$0A;分机数据块发完?

BRNERXTST

MOVR16,R15

CPIR16,4;与分机轮询通讯完毕?

BRNENEXTNO;未完转对下一分机通信

HH38:

RJMPHH38;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询)

.DSEG

.ORG$180

DTPINT:

.BYTE$40

;$41$45$65$73$46$42$40$6F$33$44$66$5C$4D$4B$0D$0A

;$42$4F$66$78$47$45$44$63$32$48$60$7C$6D$45$0D$0A

;$43$56$55$53$4D$4F$40$2E$31$42$67$4C$47$4A$0D$0A

;$45$54$59$63$3D$4B$48$2F$35$48$69$3C$77$43$0D$0A

.ORG$1C0

DRPINT:

.BYTE$40

;范例92

.ORG0;多机通讯1#分机程序/晶振4MHZ

.EQUDTPIT1=$180;(UBRR)=12波特率为19200(REL.ERR.=0.16%)

.EQUDRPNT1=$1C0

STRT39:

RJMPRST39

.ORG$00B

RJMPUARXC;8535UART接收完成中断

.ORG$00C

RJMPUATXC;UART发送完成中断

.ORG$011

RST39:

CLRR18;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7)

LDIR16,12

OUTUBRR,R16;设波特率[BAUDRATE=4000000/16*(12+1)=19200]

LDIR16,HIGH(DRPNT1)

MOVR8,R16

LDIR16,LOW(DRPNT1)

MOVR9,R16;r8,r9:

接收数据指针(FIRSTPOINTTO$1C0)

LDIR16,$98;允许UART中断接收,8位数据模式

OUTUCR,R16

SEI

RXDTS:

SBRSR18,6;主机呼号已收到(若收到,在R17中)?

RJMPRXDTS

OUTUDR,R17;返还该机号

TXDON:

INR16,USR

SBRSR16,5

RJMPTXDON;该机号发送完成?

LDIR16,$9C;允许UART中断接收,9位数据模式,TXB8=0

OUTUCR,R16

RCVBLK:

SBRSR18,7

RJMPRCVBLK;主机发来数据块已接收完毕?

LDIR16,HIGH(DTPIT1)

MOVR6,R16

LDIR16,LOW(DTPIT1)

MOVR7,R16;设发送数据指针r6r7,首指$180

LDIR16,$3C;允许UART中断发送,9位数据模式,TXB8=0

OUTUCR,R16

TXDN:

SBICUCR,5

RJMPTXDN;发送完毕?

RJMPRST39;

:

UART中断接收程序

UARXC:

SBICUSR,4

RETI;祯错误(主机正与其它分机进行9位数据模式通信),不予接收

INR14,SREG;保存当前状态

TSTR18

BREQNUMB;(R18)=0时收到数据,只可能是机号,转去核实

PUSHR16;否则为主机向本分机发来数据块(9位模式,机号已符合)

PUSHR26

PUSHR27

INR17,UDR;接收数据

MOVXH,R8

MOVXL,R9;取接收数据指针

STX+,R17;转入RAM

MOVR8,XH

MOVR9,XL;存数据指针

CPIR17,$0A;是数据块结束符LF?

BRNERSCOM1

SBRR18,$80;收到完整数据块标志

RSCOM1:

POPR27

POPR26

POPR16

DRETI:

OUTSREG,R14

RETI

NUMB:

INR17,UDR;取出数据

CPIR17,1;是1#分机?

2#分机与$02比较/3#分机与$03比较...

BRNEDRETI;机号不符合,转!

SBRR18,$40;建机号符合标志

RJMPDRETI

;UART中断发送程序

UATXC:

PUSHR16;r6r7:

发送数据指针,首指$180

INR16,SREG

PUSHR16

PUSHR26

PUSHR27

MOVXH,R6

MOVXL,R7;取出发送指针

LDR16,X+;取数据,调指针

MOVR6,XH

MOVR7,XL

OUTUDR,R16;送入发送寄存器

CPIR16,$0A

BRNESDCOM

CBIUCR,5;发送最后1个字符后,禁止发送寄存器空中断(CLRUDRIE)

LDIR16,HIGH(DRPINT)

MOVR8,R16

LDIR16,LOW(DRPINT)

MOVR9,R16;接收数据指针初始化(POINTTO$1C0)

SDCOM:

POPR27

POPR26

POPR16

OUTSREG,R16

POPR16

RETI

.DSEG

.ORG$180

DTPIT1:

.BYTE$40

.ORG$1C0

DRPNT1:

.BYTE$10

;$41$45$65$73$46$42$40$6F$33$44$66$5C$4D$4B$0D$0A

;范例93

;以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,

;并可在线写入

;运作过程特点如下:

;

(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位

;

(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成

;(3)本程序为一写入特例,写入地址为$100--$1FF,可作适当修改(如设块长计数器等)

;(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套

;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序

;(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分.

STWEEP:

LDIR16,HIGH(ramend)

OUTSPH,R16

LDIR16,LOW(ramend)

OUTSPL,R16

SBIEECR,3;设置EEPROM就绪(ready)中断使能位

SEI;中断总使能

RJMPSRTW

.ORG$00F

RJMPEEPRDY;8535EEPROM就绪(ready)中断向量

SRTW:

LDIYH,1

LDIYL0;EEPROM写入首地址:

$100

LDIXL,$60;欲写入数据块首地址:

$60

CLRXH

WEEP0:

SBICEECR,1;当前有EEPROM写入操作,有则等待写入完成

RJMPWEEP0

RCALLWREEP;写入第一个字节,($60)->$100,写入完成后,EEWE=0时引发EEPROM就绪中断

INCYL;调整写入地址指针

HHWEEP:

TSTYL

BRNEHHWEEP

CPIYH,2;写入地址达到$2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1