1、STRT38: RJMP RST38 ;主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF .ORG $00B ; RJMP STRT38 .ORG $00C RJMP STRT38 ;主机不设串口中断,只以查询接收 .ORG $011RST38: LDI 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(DR
2、PINT) 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: IN R16,USR SBRS R16,7 RJMP TSLOP ;分机返回机号? IN R16,UDR CP R16,R15 ;分机号正确返回? BRNE OUTLP LDI R16,$1C ;改为9位数据模式 TXB8=0TXLOP: LD R16,X+ OUT UDR,R
3、16 ;向分机发送数据块TESTL: IN R17,USR SBRS R17,5 RJMP TESTL ;等待发送完成 CPI R16,$0A BRNE TXLOP ;RXTST: SBRS R17,7 ;RXC=1 收到数据 RJMP RXTST ;等待接收分机返回数据块 IN R16,UDR ST Y+,R16 ;存储接收数据 CPI R16,$0A ;分机数据块发完? BRNE RXTST MOV R16,R15 CPI R16,4 ;与分机轮询通讯完毕? BRNE NEXTNO ;未完转对下一分机通信HH38: RJMP HH38 ;否则踏步(可改为处理分机返回的数据,之后再进行下一个
4、轮询) .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 $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 $1C0DRP
5、INT:范例92多机通讯1#分机程序/晶振4MHZ.EQU DTPIT1=$180 ;(UBRR)=12 波特率为19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT39: RJMP RST39 .ORG $00B RJMP UARXC ;8535UART接收完成中断 RJMP UATXC ;UART发送完成中断RST39: CLR R18 ;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7)设波特率BAUD RATE=4000000/16*(12+1)=19200 LDI R16,HIGH(DRPNT1) MOV R8,R16 LDI R16,L
6、OW(DRPNT1) MOV R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0) LDI R16,$98 ;允许UART中断接收,8位数据模式 OUT UCR,R16 SEIRXDTS: SBRS R18,6 ;主机呼号已收到(若收到,在R17中)? RJMP RXDTS OUT UDR,R17 ;返还该机号TXDON: SBRS R16,5 RJMP TXDON ;该机号发送完成? LDI R16,$9C ; 允许UART中断接收,9位数据模式,TXB8=0 OUT UCR,R16 RCVBLK: SBRS R18,7 RJMP RCVBLK ;主机发来数据块
7、已接收完毕? LDI R16,HIGH(DTPIT1) MOV R6,R16 LDI R16,LOW(DTPIT1) MOV R7,R16 ;设发送数据指针r6r7,首指$180 LDI R16,$3C ;允许UART中断发送,9位数据模式,TXB8=0TXDN: SBIC UCR,5 RJMP TXDN ;发送完毕? RJMP RST39 ; :UART中断接收程序UARXC: SBIC USR,4 RETI ;祯错误(主机正与其它分机进行9位数据模式通信),不予接收 IN R14,SREG ;保存当前状态 TST R18 BREQ NUMB ;(R18)=0时收到数据,只可能是机号,转去核
8、实 PUSH R16 ;否则为主机向本分机发来数据块(9位模式,机号已符合) 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:取出数据 CPI R17,1 ;是1#分机?2#分机与$02比较/3#
9、分机与$03比较. BRNE DRETI ;机号不符合,转! SBR R18,$40 ;建机号符合标志 RJMP DRETI UART中断发送程序UATXC:r6 r7:发送数据指针,首指$180 IN R16,SREG PUSH R16 MOV XH,R6 MOV XL,R7 ;取出发送指针 LD R16,X+ ;取数据,调指针 MOV R6,XH MOV R7,XL送入发送寄存器 BRNE SDCOM CBI UCR,5 ;发送最后1个字符后,禁止发送寄存器空中断(CLR UDRIE) LDI R16,HIGH(DRPINT) LDI R16,LOW(DRPINT)接收数据指针初始化(PO
10、INT TO $1C0)SDCOM: OUT SREG,R16DTPIT1:DRPNT1:.BYTE $10范例93以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,并可在线写入运作过程特点如下:(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成(3)本程序为一写入特例,写入地址为$100-$1FF,可作适当修改(如设块长计数器等)(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套(5)本例为简化程序只以查询写入地址循环作为背景程序
11、,实用时可改为具体的背景序(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分.STWEEP: LDI R16,HIGH(ramend) OUT SPH,R16 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