⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuhen.asm

📁 cbiancheng xu,danpianjikongzhi
💻 ASM
字号:

;##############################################################################################
;signA  signB  存放两次过线状态 
;ztai   存放传感器状态
;signC  存放上次发送的偏离信号
;rec    接收结果存储器(接收)
;八位(0/1):0位:禁止/使能,1位:向后/向前,2位:直线/转弯,3位:右转/左转
;r19	扫描结果存储器(发送)
;八位(0/1):0位:不偏/偏,1位:右偏/左偏,2位:偏小/偏大,3位:不过线/过线       					
;###############################################################################################
.INCLUDE "M16DEF.INC"
.equ rec=$0060
.equ state=$0061
.equ sign0=$0062
.equ signa=$0063
.equ signb=$0064
.ORG $0000
JMP RESET
.ORG $0002
JMP inint0
.ORG $0004
JMP inint1

.ORG $0016
JMP USART_Receive

.ORG $0030
RESET:  LDI R16,HIGH(RAMEND)
        OUT SPH,R16
	    LDI R16,LOW(RAMEND)
	    OUT SPL,R16
		CLR R17
		CLR R18
		CLR R19
		CLR R20
		CLR R21
		CLR R22
        LDI r16,0B00000000
        STS REC,R16
		STS state,R16
		STS sign0,R16
		STS signa,R16
		STS signb,R16


;******************************************************************************
;初始化成程序开始	    
Port_Init:                    
        LDI R16,(1<<PUD)      ;全局上拉电阻禁止
	    OUT SFIOR,R16
	    LDI R16,$0FF
        OUT DDRA,R16          ;A口设置为输出 
	    OUT PORTA,R16
	    OUT DDRC,R16          ;C口设置为输出
		OUT PORTC,R16
		LDI R16,$00
		OUT DDRB,R16
		OUT PORTD,R16
		LDI R16,0B11110011
	    OUT DDRD,R16          ;D口设置
		ldi r16,0b11111111	
        OUT PORTD,R16
		LDI R16,(0<<PUD)      ;开启全局上拉电阻
	    OUT SFIOR,R16 

		LDI R16,0B00001010
		OUT MCUCR,R16         ;外部低电平中断0与2
		LDI R16,0B11000000    ;允许中断
		OUT GICR,R16
		
                              
							  ;调制信号开启,5kHZ,TC2
        ldi r16,0
	    out tcnt2,r16
	    ldi r16,100
	    out ocr2,r16
        ldi r16,0b00011010
		out tccr2,r16
                       
                              ;232通讯初始化
        ldi r16,0b10001110
		out ucsrc,r16         ;8位数据+1位停止位
		ldi r16,0b10011000    
		out ucsrb,r16         ;允许发送,允许接收,接受完成中断
		ldi r16,51            ;波特率为9600bps
        out ubrrl,r16
	                 
	    SEI                   ;全局中断使能
;初始化成程序结束
;******************************************************************************
main:                  
                       lds r16,rec
                       sbrs r16,0
                       rjmp main
					   
					   sbrs r16,1
					   rjmp m1
					   call scan_a               ;扫描a组
                       rjmp m2
                    m1:call scan_b               ;扫描b组
                    m2:call sign_test0           ;过线判断子程序

					   lds r16,rec
					   sbrc r16,2            
					   rjmp main
					   ;call sign_test1          ;物体探测判断子程序
					   call sign_test2           ;直线行走判别子程序
                       
					   cpi r18,0b10000000        ;出错反方向扫描
					   brne m3
                       lds r16,rec
					   sbrs r16,1
					   rjmp e1
                       call scan_b
					   rjmp e2
                    e1:call scan_a
					e2:call sign_test0           ;过线判断子程序
					   lds r16,rec
					   sbrc r16,2            
					   rjmp main
					   ;call sign_test1          ;物体探测判断子程序
					   call sign_test2           ;直线行走判别子程序

                    m3:rjmp main 



;******************************************************************************
;前进方向传感器扫描
scan_a:               ldi  r16,0b11111010         ;第一次扫描传感器1,3,5,11
                      out  porta,r16
					  ldi  r16,0b01011111         
					  out  portc,r16
                      call delay
                      in   r16,pinb
					  andi r16,0b00001111
					  ldi  r17,0b00000000
					  sbrs r16,0 
					  ori  r17,0b01000000
					  sbrs r16,1
					  ori  r17,0b00000100
					  sbrs r16,2
					  ori  r17,0b00000001
					  sbrs r16,3
					  ori  r17,0b00010000
					  ldi  r16,0b11110101          ;第二次扫描传感器2,4,6,12
					  out  porta,r16
					  ldi  r16,0b10101111
					  out  porta,r16
					  call delay
                      in   r16,pinb
					  andi r16,0b00001111
					  sbrs r16,0
					  ori  r17,0b10000000
					  sbrs r16,1
					  ori  r17,0b00001000
					  sbrs r16,2
					  ori  r17,0b00000010
					  sbrs r16,3
					  ori  r17,0b00100000
					  ret



;******************************************************************************
;后退方向传感器扫描
scan_b:               ldi  r16,0b10101111         ;第一次扫描7,9,5,11
                      out  porta,r16
					  ldi  r16,0b01011111
					  out  portc,r16
                      call delay
                      in   r16,pinb
					  andi r16,0b00001111
					  ldi  r17,0b00000000
					  sbrs r16,0
					  ori  r17,0b01000000
					  sbrs r16,1
					  ori  r17,0b00000010
					  sbrs r16,2
					  ori  r17,0b00001000
					  sbrs r16,3
					  ori  r17,0b00100000
					  ldi  r16,0b01011111           ;第二次扫描8,10,6,12
					  out  porta,r16
					  ldi  r16,0b10101111
					  out  portc,r16
					  call delay
                      in   r16,pinb
					  andi r16,0b00001111
					  sbrs r16,0
					  ori  r17,0b10000000
					  sbrs r16,1
					  ori  r17,0b00000001
					  sbrs r16,2
					  ori  r17,0b00000100
					  sbrs r16,3
					  ori  r17,0b00010000
					  ret
                 

;*******************************************************************************
;过线判断子程序
sign_test0:            
                       sbrc r17,4 
					   rjmp test0
					   ldi r16,0
					   sts sign0,r16
                       rjmp end0
test0:                 cpi r16,0b00001000
                       brne test0_end
					   rjmp end0
test0_end:             ldi r16,0b00001000
					   sts sign0,r16
                       out UDR,r16
end0:                  ret      


;********************************************************************************
;物体探测判断子程序          
sign_test1:            lds r16,rec
					   sbrs r16,1
					   rjmp ta
					   rjmp tb
                       
ta:                    sbrc r17,6 
					   rjmp testa
					   ldi r16,0b00000000
					   sts signa,r16
                       rjmp enda
testa:                 cpi r16,0b00001000
                       brne testa_end
					   rjmp enda
testa_end:             ldi r16,0b00010000
					   sts signa,r16
                       out UDR,r16
enda:                  ret  

tb:                    sbrc r17,7 
					   rjmp testb
					   ldi r16,0b00000000
					   sts signb,r16
                       rjmp endb
testb:                 cpi r16,0b00001000
                       brne testb_end
					   rjmp endb
testb_end:             ldi r16,0b00010000
					   sts signb,r16
                       out UDR,r16
endb:                  ret
 

;*******************************************************************************
;直线行走偏离状态判断程序
sign_test2:            call test2
                       lds r16,state
					   cp r16,r18
					   breq end2
                       out udr,r18 
					   sts state,r18
end2:				   ret

test2:    			   andi r17,0b00001111
					   cpi r17,0b00000001    ;右偏大
					   breq s1              
					   cpi r17,0b00000011    ;右偏大
					   breq s1
					   cpi r17,0b00000010    ;右偏小
					   breq s2
					   cpi r17,0b00000111    ;右偏小
					   breq s2  
					   cpi r17,0b00001100    ;左偏大
					   breq s4 
					   cpi r17,0b00001000    ;左偏大
					   breq s4 
					   cpi r17,0b00001110    ;左偏小  
					   breq s3 
					   cpi r17,0b00000100    ;左偏小
					   breq s3    
					   cpi r17,0b00000110    ;正常
					   breq s5 
					   cpi r17,0b00001111    ;正常
					   breq s5
					   jmp error             ;错误

s1:                    ldi r18,0b00000101           
                       ret
s2:                    ldi r18,0b00000001
                       ret
s3:                    ldi r18,0b00000011
                       ret
s4:                    ldi r18,0b00000111
                       ret	
s5:                    ldi r18,0b00000000	
                       ret	
error :                ldi r18,0b10000000
					   ret	


inint0:LDI R16,0B11111111
       OUT UDR,R16
       RETI
inint1:LDI R16,0B11110000
       OUT UDR,R16
       RETI

;*******************************************************************************
;延时子程序
delay:                 ldi r21,$01
                    w3:LDI R19,200
                    W2:LDI R20,$0FF
					W1:DEC R20
	                   BRNE W1
					   DEC R19
					   BRNE W2
					   dec r21
					   brne w3
					   RET             
	
USART_Receive:         in r22,UDR	
			           sts rec,r22          ;存状态
					   reti
		








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -