1、AVR汇编百例 晋级篇 参考程序; 以下提供几个补充参考程序,都带有详细说明和指令注释.它们是主从多机通讯程序,采;用中断方式写入EEPROM,直接对晶振分频产生0.1秒和秒号的精确定时程序,以及RS-232/;RS-485标准转换程序,AVR频率计程序,串行时锺日历芯片DS1302读写,共享时基的PWM输出、;输入捕获测周期程序和定时信号获取,以及DS18B20测温等程序.多机通讯主要用8和9位数;据模式区分被选分机(9位)和其它分机(8位),达到主机只与被选分机交换数据之目的.以中;断方式写EEPROM的优点是可与系统运行同时进行(即在线写入),占用很少机时.;精确定时用定时/计数器1(或
2、0)直接对MCU主频(不设分频)设定时间常数,分频精度可达到;1HZ.RS-232/RS-485标准转换程序中AVR不作中转,使两种器件相关脚位直接连接.以TCNT0;定时,以T0引脚接收RS-232数据.以收到RS-232字符起始位下跳沿或结束符($03)为依据,;控制切换RS-485的收发使能.(系统中的主AVR可兼做对通信标准之监控转换,即只是在完成;主要工作任务的同时附带进行).具体过程不再细述.串行时锺日历芯片DS1302具体积小,;可靠性高,与单片机连接方便等优点.; 以下程序请参看有关章节或程序中的注释。 ;范例91 ;多机通讯主机程序/晶振4MHZ .ORG 0 ;以8/9位数
3、据模式区分被选/未被选分机通讯.EQU DTPINT=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ;主机对1#,2#,3#,4#分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BFSTRT38: RJMP RST38 ;主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF .ORG $00B ; RJMP STRT38 .ORG $00C RJMP STRT38 ;主机不设串口中断,只以查询接收 .ORG $011RST38: L
4、DI R16,12 OUT UBRR,R16 ;设波特率:BAUD RATE=FCP/16(UBRR+1) CLR R15 ;初始化分机号 LDI R27,HIGH(DTPINT) LDI R26,LOW(DTPINT);发送数据指针(首指$180) LDI R29,HIGH(DRPINT) LDI R28,LOW(DRPINT);接收数据指针(首指$1C0)NEXTNO: LDI R16,$18 OUT UCR,R16 ;允许UART接收和发送,8位数据模式 INC R15 ;指向1#分机OUTLP: OUT UDR,R15 ;呼分机号,1:1#/2:2#/03:3#/04:4#.TSLOP
5、: IN R16,USR SBRS R16,7 RJMP TSLOP ;分机返回机号? IN R16,UDR CP R16,R15 ;分机号正确返回? BRNE OUTLP LDI R16,$1C ;改为9位数据模式 TXB8=0 OUT UCR,R16 ;TXLOP: LD R16,X+ OUT UDR,R16 ;向分机发送数据块TESTL: IN R17,USR SBRS R17,5 RJMP TESTL ;等待发送完成 CPI R16,$0A BRNE TXLOP ;RXTST: IN R17,USR SBRS R17,7 ;RXC=1 收到数据 RJMP RXTST ;等待接收分机返回
6、数据块 IN R16,UDR ST Y+,R16 ;存储接收数据 CPI R16,$0A ;分机数据块发完? BRNE RXTST MOV R16,R15 CPI R16,4 ;与分机轮询通讯完毕? BRNE NEXTNO ;未完转对下一分机通信HH38: RJMP HH38 ;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询) .DSEG .ORG $180DTPINT:.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
7、$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 $1C0DRPINT:.BYTE $40;范例92 .ORG 0 ;多机通讯1#分机程序/晶振4MHZ.EQU DTPIT1=$180 ;(UBRR)=12 波特率为19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT39: RJMP
8、RST39 .ORG $00B RJMP UARXC ;8535UART接收完成中断 .ORG $00C RJMP UATXC ;UART发送完成中断 .ORG $011RST39: CLR R18 ;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7) LDI R16,12 OUT UBRR,R16 ;设波特率BAUD RATE=4000000/16*(12+1)=19200 LDI R16,HIGH(DRPNT1) MOV R8,R16 LDI R16,LOW(DRPNT1) MOV R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0) LDI
9、R16,$98 ;允许UART中断接收,8位数据模式 OUT UCR,R16 SEIRXDTS: SBRS R18,6 ;主机呼号已收到(若收到,在R17中)? RJMP RXDTS OUT UDR,R17 ;返还该机号TXDON: IN R16,USR SBRS R16,5 RJMP TXDON ;该机号发送完成? LDI R16,$9C ; 允许UART中断接收,9位数据模式,TXB8=0 OUT UCR,R16 RCVBLK: SBRS R18,7 RJMP RCVBLK ;主机发来数据块已接收完毕? LDI R16,HIGH(DTPIT1) MOV R6,R16 LDI R16,LOW
10、(DTPIT1) MOV R7,R16 ;设发送数据指针r6r7,首指$180 LDI R16,$3C ;允许UART中断发送,9位数据模式,TXB8=0 OUT UCR,R16TXDN: SBIC UCR,5 RJMP TXDN ;发送完毕? RJMP RST39 ; :UART中断接收程序UARXC: SBIC USR,4 RETI ;祯错误(主机正与其它分机进行9位数据模式通信),不予接收 IN R14,SREG ;保存当前状态 TST R18 BREQ NUMB ;(R18)=0时收到数据,只可能是机号,转去核实 PUSH R16 ;否则为主机向本分机发来数据块(9位模式,机号已符合)
11、 PUSH R26 PUSH R27 IN R17,UDR ;接收数据 MOV XH,R8 MOV XL,R9 ;取接收数据指针 ST X+,R17 ;转入RAM MOV R8,XH MOV R9,XL ;存数据指针 CPI R17,$0A ;是数据块结束符LF? BRNE RSCOM1 SBR R18,$80 ;收到完整数据块标志RSCOM1: POP R27 POP R26 POP R16DRETI: OUT SREG,R14 RETINUMB: IN R17,UDR ;取出数据 CPI R17,1 ;是1#分机?2#分机与$02比较/3#分机与$03比较. BRNE DRETI ;机号不
12、符合,转! SBR R18,$40 ;建机号符合标志 RJMP DRETI; UART中断发送程序UATXC: PUSH R16 ;r6 r7:发送数据指针,首指$180 IN R16,SREG PUSH R16 PUSH R26 PUSH R27 MOV XH,R6 MOV XL,R7 ;取出发送指针 LD R16,X+ ;取数据,调指针 MOV R6,XH MOV R7,XL OUT UDR,R16 ;送入发送寄存器 CPI R16,$0A BRNE SDCOM CBI UCR,5 ;发送最后1个字符后,禁止发送寄存器空中断(CLR UDRIE) LDI R16,HIGH(DRPINT)
13、MOV R8,R16 LDI R16,LOW(DRPINT) MOV R9,R16 ;接收数据指针初始化(POINT TO $1C0)SDCOM: POP R27 POP R26 POP R16 OUT SREG,R16 POP R16 RETI .DSEG .ORG $180DTPIT1:.BYTE $40 .ORG $1C0DRPNT1:.BYTE $10 ;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;范例93 ;以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,
14、 ;并可在线写入 ;运作过程特点如下: ;(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位 ;(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成 ;(3)本程序为一写入特例,写入地址为$100-$1FF,可作适当修改(如设块长计数器等) ;(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套 ;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序 ;(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分.STWEEP: LDI R16,HIGH(ramend) OUT SPH,R16
15、 LDI R16,LOW(ramend) OUT SPL,R16 SBI EECR,3 ;设置EEPROM就绪(ready)中断使能位 SEI ;中断总使能 RJMP SRTW .ORG $00F RJMP EEPRDY ;8535 EEPROM就绪(ready)中断向量SRTW: LDI YH,1 LDI YL 0 ;EEPROM 写入首地址:$100 LDI XL,$60 ;欲写入数据块首地址:$60 CLR XHWEEP0: SBIC EECR,1 ;当前有EEPROM写入操作,有则等待写入完成 RJMP WEEP0 RCALL WREEP ;写入第一个字节,($60)-$100,写入完成后,EEWE=0时引发EEPROM就绪中断 INC YL ;调整写入地址指针HHWEEP: TST YL BRNE HHWEEP CPI YH,2 ;写入地址达到$2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1