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

📄 main.s

📁 485多机通讯
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile D:\avr\+++精华+++\485\485_master/delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 15
; /*******************************************************************************
;                            485多机通讯
; --------------------------------------------------------------------------------
; 通讯规则: 
; 1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 
; 2:通讯连接采用硬件MAX485,双向单工 
; 3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量) 
; 4:每个上行/下行的数据包都采用CRC8校验 
; 5:数据接收采用中断+查询的方式 
; 6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包 
; 7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收 
; 8:从机之间不能相互通讯,必须通过主机才能交换数据 
; 9:无效地址是0,主机地址是1,从机地址是2.3.4......广播地址是255 
; ********************************************************************************/ 
; 
	.dbline 16
; #include <iom16v.h>
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 20
; #include <macros.h> 
; #include "delay.h" 
; #include "1602.h" 
; #include "usart.h" 
	.dbline 21
; #include "crc8.h" //CRC校验函数就在这个文件里面 
	clr R20
	clr R21
	.dbline 22
; #include "key.h" 
	xjmp L6
L3:
	.dbline 23
	xcall _delay_1us
L4:
	.dbline 22
	subi R20,255  ; offset = 1
	sbci R21,255
L6:
	.dbline 22
	cp R20,R22
	cpc R21,R23
	brlo L3
	.dbline -2
L2:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 27
; #define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧) 
; 
; 
; unsigned char send[amount]; //发件箱 
; unsigned char inbox[amount]; //收件箱 
	.dbline 29
	clr R16
	clr R17
	xjmp L11
L8:
	.dbline 29
L9:
	.dbline 29
	subi R16,255  ; offset = 1
	sbci R17,255
L11:
	.dbline 29
; unsigned char n=0; //记忆中断次数 
; unsigned char flag_me=0;
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L8
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 33
; unsigned char flag_all=0;
; 
; 
; 
	.dbline 34
; //-------------------主机接收子程序-------------------------------- 
	clr R20
	clr R21
	.dbline 35
; #pragma interrupt_handler RXC_Int: 12
	xjmp L16
L13:
	.dbline 36
	xcall _delay_1ms
L14:
	.dbline 35
	subi R20,255  ; offset = 1
	sbci R21,255
L16:
	.dbline 35
	cp R20,R22
	cpc R21,R23
	brlo L13
	.dbline -2
L12:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfile D:\avr\+++精华+++\485\485_master/1602.h
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 44
; void RXC_Int(void) //接收中断 
; { 
;  unsigned char ERROR=0; 
;  if(UCSRA&0x08||UCSRA&0x10 )ERROR=1; //奇偶效验错误(avr自动完成)或者帧错误就记录下来
;  inbox[n]=UDR;
;  n++; //记忆中断次数 
;  if(ERROR) inbox[0]=0; //如果通讯有错,收件箱的地址帧就标记成无效地址0 
; } 
; 
	.dbline 45
; void int_485(void)//接收程序,在中断中调用或者扫描调用
	in R24,0x14
	ori R24,15
	out 0x14,R24
	.dbline 46
; {
	sbi 0x14,5
	.dbline 47
;  //if(n<3) 如果接收到的数据还不到3个,那么就是通讯线路故障 
	sbi 0x14,4
	.dbline 48
; 
	ldi R16,40
	xcall _LCD_write_command
	.dbline 49
;    //如果收件箱已经收到amount个数据,并且crc8校验成功就... 
	xcall _LCD_en_write
	.dbline 50
;    if(n==amount && inbox[amount-1]==crc8(inbox,amount-1)) 
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 51
;     { 
	ldi R16,40
	xcall _LCD_write_command
	.dbline 52
;      if(inbox[0]==1)flag_me=1; 
	ldi R16,12
	xcall _LCD_write_command
	.dbline 53
; 	 //接收完数据后会置标志位	 
	ldi R16,1
	xcall _LCD_write_command
	.dbline 54
; 	 if(inbox[0]==255) flag_me=1; //请在这里添加收到广播数据的处理程序 
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 61
; 	  
;     } 
;   
; }
; 
; 
; 
	.dbline 62
; void out_485(unsigned char address,unsigned char *ptr)
	sbi 0x15,5
	.dbline 63
; {unsigned char i;
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline 64
;    n=0; //中断次数清0 
	cbi 0x15,5
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_command _LCD_write_command fV
;        command -> R20
	.even
_LCD_write_command::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 68
;    inbox[0]=0; //收件箱地址清0 
;    //请更新准备发送的数据 
;    //send[1]=? 
;    //...... 
	.dbline 82
;    //send[n]=? 
;    send[0]=address; //改变这个地址就可以实现与某个从机对话 
;    for(i=1;i<amount-1;i++)send[i]=*ptr++;//把发送的数据方到发信箱 
;    	 
;    send[amount-1]=crc8(send,amount-1); //计算发件箱的crc8校验码 
;     
;    usart_out(send,amount); //将发件箱的数据send[]发送出去; 
;   
;    //等待,从机接收到数据后会回复数据的,如果是10个字节数据量,不能少于13ms!!! 
;    //这个时间由人工计算,要考虑从机由于各种中断延长回复时间的可能 
; 
;    delay_nms(15); 
; }
; 
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 83
; 
	cbi 0x15,4
	.dbline 84
; 
	in R24,0x15
	andi R24,240
	out 0x15,R24
	.dbline 85
; void main(void) 
	mov R24,R20
	swap R24
	andi R24,#0x0F
	andi R24,15
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 86
; { unsigned char key[8],i,address,j;
	xcall _LCD_en_write
	.dbline 87
;  usart_init(); //串口初始化 
	in R24,0x15
	andi R24,240
	out 0x15,R24
	.dbline 88
;  UCSRA=0x00; //主机关闭地址筛选功能(多机通讯功能)
	mov R24,R20
	andi R24,15
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 89
;  LCD_init();//液晶初始化
	xcall _LCD_en_write
	.dbline -2
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r command 20 c
	.dbend
	.dbfunc e LCD_write_data _LCD_write_data fV
;           data -> R20
	.even
_LCD_write_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 95
;  SEI(); //打开全局中断,需要macros.h支持
;  LCD_write_string(0,0,"out:");
;  LCD_write_string(0,1,"int:");
;     
; 
;  while(1) 
	.dbline 109
;   {
;   //-------------以下为测试语句------------------------------------
;    
;   if(flag_me)
;    {
;     LCD_write_string(7,1,inbox);
;     flag_me=0;
;    }
;   i=get_key();
;   switch (i)
;   	{
;   case '+':{address=2;LCD_write_string(4,0,"2>>");}
;   	break;
;   case '-':{address=3;LCD_write_string(4,0,"3>>");}
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 110
;   	break;
	sbi 0x15,4
	.dbline 111
;   case '=':out_485(address,key);
	in R24,0x15
	andi R24,240
	out 0x15,R24
	.dbline 112
;   	break;
	mov R24,R20
	swap R24
	andi R24,#0x0F
	andi R24,15
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 113
;   case 'C':{j=0;LCD_write_string(7,0,"         ");}
	xcall _LCD_en_write
	.dbline 115
;   	break;
; 	default: 
	in R24,0x15
	andi R24,240
	out 0x15,R24
	.dbline 116
; 	if(j<8&&i<='9'&&i>='0'){key[j++]=i;LCD_write_char(j+6,0,i);}
	mov R24,R20
	andi R24,15
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 117
; 	
	xcall _LCD_en_write
	.dbline -2
L20:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_set_xy _LCD_set_xy fV
;        address -> R20
;              y -> R20
;              x -> R22
	.even
_LCD_set_xy::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 124
;   	}
;   
;      LCD_write_string(4,1,inbox);
; 	 LCD_write_string(12,1,"     ");//数组没有结束符,所以要修正液晶后面多余的乱码
; 
; 
; //------------------------------------------------------------   
	.dbline 126
; 
;   } 
	tst R20
	brne L22
	.dbline 126
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L23
L22:
	.dbline 127
; } 
	mov R20,R22
	subi R20,64    ; addi 192
L23:
	.dbline 128
; } 
	mov R16,R20
	xcall _LCD_write_command
	.dbline -2
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r y 20 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              s -> R20,R21
;              Y -> R10
;              X -> R22
	.even
_LCD_write_string::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 132
; } 
; } 
; } 
; } 
	.dbline 133
; } 
	mov R18,R10
	mov R16,R22
	xcall _LCD_set_xy
	xjmp L26
L25:
	.dbline 135
	.dbline 136
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_data
	.dbline 137
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 138
L26:
	.dbline 134
; } 
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L25
	.dbline -2
L24:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           data -> y+4
;              Y -> R22
;              X -> R20
	.even
_LCD_write_char::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 143
; } 
; } 
; } 
; } 
; } 
; } 
; } 
; } 
; } 
	.dbline 144
; } 
	mov R18,R22
	mov R16,R20
	xcall _LCD_set_xy
	.dbline 145
; } 
	ldd R16,y+4
	xcall _LCD_write_data
	.dbline -2
L28:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data 4 c
	.dbsym r Y 22 c
	.dbsym r X 20 c
	.dbend
	.dbfile D:\avr\+++精华+++\485\485_master/usart.h
	.dbfunc e usart_init _usart_init fV
	.even
_usart_init::
	.dbline -1
	.dbline 7
	.dbline 8
	ldi R24,1
	out 0xb,R24
	.dbline 9
	ldi R24,156
	out 0xa,R24
	.dbline 10
	ldi R24,182
	out 0x20,R24
	.dbline 11
	ldi R24,46
	out 0x9,R24
	.dbline 12
	clr R2
	out 0x20,R2
	.dbline 13
	cbi 0x12,3
	.dbline 14
	sbi 0x11,3
	.dbline -2
L29:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e usart_out _usart_out fV
;              i -> R20
;              n -> R22
;          datas -> R10,R11
	.even
_usart_out::
	xcall push_gset3
	mov R22,R18
	movw R10,R16
	.dbline -1
	.dbline 20
	.dbline 21
	clr R20
	.dbline 22
	sbi 0x12,3
	xjmp L32
L31:
	.dbline 25
	.dbline 26
	tst R20
	brne L34
	.dbline 26
	sbi 0xa,0
	xjmp L35
L34:
	.dbline 27
	in R24,0xa
	andi R24,254
	out 0xa,R24
L35:
	.dbline 28
	mov R30,R20
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+0
	out 0xc,R2
L36:
	.dbline 29
L37:
	.dbline 29
	sbis 0xb,6
	rjmp L36
	.dbline 30
	sbi 0xb,6
	.dbline 31
	inc R20
	.dbline 32
	ldi R16,100
	ldi R17,0
	xcall _delay_nus
	.dbline 33
L32:
	.dbline 24
	cp R20,R22
	brlo L31
	.dbline 35
	cbi 0x12,3
	.dbline -2
L30:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r n 22 c
	.dbsym r datas 10 pc
	.dbend
	.dbfile D:\avr\+++精华+++\485\485_master/crc8.h
	.dbfunc e crc8 _crc8 fc
;            crc -> R20
;              i -> R22
;            len -> R18
;            ptr -> R16,R17
	.even
_crc8::
	xcall push_gset2
	.dbline -1
	.dbline 5
	.dbline 7
	clr R20
	xjmp L41
L40:
	.dbline 9
	.dbline 10
	ldi R22,1
	xjmp L46
L43:
	.dbline 11
	.dbline 12
	sbrs R20,0
	rjmp L47
	.dbline 12
	.dbline 12
	lsr R20
	.dbline 12
	ldi R24,140
	ldi R25,0
	mov R2,R20
	clr R3
	eor R2,R24
	eor R3,R25
	mov R20,R2
	.dbline 12
	xjmp L48
L47:
	.dbline 13
	lsr R20
L48:
	.dbline 14
	movw R30,R16
	ldd R2,z+0
	and R2,R22
	breq L49
	.dbline 14
	ldi R24,140
	ldi R25,0
	mov R2,R20
	clr R3
	eor R2,R24
	eor R3,R25
	mov R20,R2
L49:
	.dbline 15
L44:
	.dbline 10
	ldi R24,2
	mul R24,R22
	mov R22,R0
L46:
	.dbline 10
	tst R22
	brne L43
	.dbline 16
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 17
L41:
	.dbline 8
	mov R2,R18
	clr R3
	subi R18,1
	tst R2
	brne L40
	.dbline 18
	mov R16,R20
	.dbline -2
L39:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r crc 20 c
	.dbsym r i 22 c
	.dbsym r len 18 c
	.dbsym r ptr 16 pc
	.dbend
	.dbfile D:\avr\+++精华+++\485\485_master/key.h
	.dbfunc e key_read _key_read fc
;              i -> R20
	.even
_key_read::
	xcall push_gset1
	.dbline -1
	.dbline 7
	.dbline 10
	ldi R24,240
	out 0x17,R24
	.dbline 11
	ldi R24,15
	out 0x18,R24
	.dbline 12
	ldi R16,1
	ldi R17,0
	xcall _delay_nms
	.dbline 14

⌨️ 快捷键说明

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