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

📄 485.lst

📁 AVR单片机的485通信参考程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
FILE: D:\mojinpan\485\485_master\usart.h
(0001) #define BAUDRATE        9600	//波特率
(0002) #define F_CPU 			8000000
(0003) 
(0004) 
(0005) //波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断 
(0006) void usart_init(void) 
(0007) { 
(0008)  UCSR1A=0x01;//多机通讯模式(MPCM=1) 
_usart_init:
    012D E081      LDI	R24,1
    012E 9380009B  STS	0x9B,R24
(0009)  UCSR1B=0x9C; 
    0130 E98C      LDI	R24,0x9C
    0131 9380009A  STS	0x9A,R24
(0010)  UCSR1C=0x36; 
    0133 E386      LDI	R24,0x36
    0134 9380009D  STS	0x9D,R24
(0011)  UBRR1L= (F_CPU/BAUDRATE/16-1)%256;
    0136 E383      LDI	R24,0x33
    0137 93800099  STS	0x99,R24
(0012)  UBRR1H= (F_CPU/BAUDRATE/16-1)/256; 
    0139 2422      CLR	R2
    013A 92200098  STS	0x98,R2
(0013)  PORTE&=~0x80; //MAX485平时工作在接收状态 
    013C 981F      CBI	0x03,7
(0014)  DDRE|=0x80; 
    013D 9A17      SBI	0x02,7
    013E 9508      RET
_usart_out:
  i                    --> R20
  n                    --> R18
  datas                --> R16
    013F 940E035F  CALL	push_gset1
(0015) } 
(0016) 
(0017) //----------------------------------------------------------- 
(0018) //从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧 
(0019) void usart_out(unsigned char *datas,unsigned char n) 
(0020) { 
(0021)  unsigned char i=0; 
    0141 2744      CLR	R20
(0022)  PORTE|=0x80; //使MAX485处于发送状态 
    0142 9A1F      SBI	0x03,7
    0143 C01E      RJMP	0x0162
(0023)  
(0024)  while(i<n )//一共发送amount个数据 
(0025)   { 
(0026)    if(i==0) UCSR1B|=0x01; 
    0144 2344      TST	R20
    0145 F431      BNE	0x014C
    0146 9180009A  LDS	R24,0x9A
    0148 6081      ORI	R24,1
    0149 9380009A  STS	0x9A,R24
    014B C005      RJMP	0x0151
(0027)    else UCSR1B&=0xfe; 
    014C 9180009A  LDS	R24,0x9A
    014E 7F8E      ANDI	R24,0xFE
    014F 9380009A  STS	0x9A,R24
(0028)    UDR1=*(datas+i); //装载数据开始发送 
    0151 2FE4      MOV	R30,R20
    0152 27FF      CLR	R31
    0153 0FE0      ADD	R30,R16
    0154 1FF1      ADC	R31,R17
    0155 8020      LDD	R2,Z+0
    0156 9220009C  STS	0x9C,R2
(0029)    while((UCSR1A&0x40)==0); //等待发送结束 
    0158 9020009B  LDS	R2,0x9B
    015A FE26      SBRS	R2,6
    015B CFFC      RJMP	0x0158
(0030)    UCSR1A|=0x40; //清除发送结束标志 
    015C 9180009B  LDS	R24,0x9B
    015E 6480      ORI	R24,0x40
    015F 9380009B  STS	0x9B,R24
(0031)    i++; //发送次数统计
    0161 9543      INC	R20
    0162 1742      CP	R20,R18
    0163 F300      BCS	0x0144
(0032)    //delay_nus(100);//每次发送必须有间隔,这个是最小值,实际情况可能还要加大
(0033)   } 
(0034)   
(0035)  PORTE&=~0x80; //使MAX485处于接收状态 
    0164 981F      CBI	0x03,7
    0165 940E0362  CALL	pop_gset1
    0167 9508      RET
_crc8:
  crc                  --> R20
  i                    --> R22
  len                  --> R18
  ptr                  --> R16
    0168 940E035D  CALL	push_gset2
FILE: D:\mojinpan\485\485_master\crc8.h
(0001) //--------------------------------------------------------------------------------- 
(0002) //crc8校验程序 
(0003) //--------------------------------------------------------------------------------- 
(0004) unsigned char crc8(unsigned char *ptr, unsigned char len) 
(0005) { 
(0006) unsigned char i; 
(0007) unsigned char crc=0; 
    016A 2744      CLR	R20
    016B C020      RJMP	0x018C
(0008) while(len--!=0) 
(0009) { 
(0010) for(i=1; i!=0; i*=2) 
    016C E061      LDI	R22,1
    016D C01A      RJMP	0x0188
(0011) { 
(0012) if((crc&1)!=0) {crc/=2; crc^=0x8C;} 
    016E FF40      SBRS	R20,0
    016F C009      RJMP	0x0179
    0170 9546      LSR	R20
    0171 E88C      LDI	R24,0x8C
    0172 E090      LDI	R25,0
    0173 2E24      MOV	R2,R20
    0174 2433      CLR	R3
    0175 2628      EOR	R2,R24
    0176 2639      EOR	R3,R25
    0177 2D42      MOV	R20,R2
    0178 C001      RJMP	0x017A
(0013) else crc/=2; 
    0179 9546      LSR	R20
(0014) if((*ptr&i)!=0) crc^=0x8C; 
    017A 01F8      MOVW	R30,R16
    017B 8020      LDD	R2,Z+0
    017C 2226      AND	R2,R22
    017D F039      BEQ	0x0185
    017E E88C      LDI	R24,0x8C
    017F E090      LDI	R25,0
    0180 2E24      MOV	R2,R20
    0181 2433      CLR	R3
    0182 2628      EOR	R2,R24
    0183 2639      EOR	R3,R25
    0184 2D42      MOV	R20,R2
    0185 E082      LDI	R24,2
    0186 9F86      MUL	R24,R22
    0187 2D60      MOV	R22,R0
    0188 2366      TST	R22
    0189 F721      BNE	0x016E
(0015) } 
(0016) ptr++; 
    018A 5F0F      SUBI	R16,0xFF
    018B 4F1F      SBCI	R17,0xFF
    018C 2E22      MOV	R2,R18
    018D 2433      CLR	R3
    018E 5021      SUBI	R18,1
    018F 2022      TST	R2
    0190 F6D9      BNE	0x016C
(0017) } 
(0018) return(crc); 
    0191 2F04      MOV	R16,R20
    0192 940E0351  CALL	pop_gset2
    0194 9508      RET
_key_read:
  i                    --> R20
    0195 940E035F  CALL	push_gset1
FILE: D:\mojinpan\485\485_master\key.h
(0001) //函数说明
(0002) //--------------------------------
(0003)   unsigned char get_key(void);
(0004) //--------------------------------
(0005) #include "delay.h"
(0006) unsigned char key_read(void)
(0007) {
(0008)  	 unsigned char i;
(0009) 	/*获取列地址*/
(0010) 	DDRB=0xf0; //高4位输出,低4位输入
    0197 EF80      LDI	R24,0xF0
    0198 BB87      OUT	0x17,R24
(0011) 	PORTB=0x0f;//高4位输出0,低4位带上拉输入
    0199 E08F      LDI	R24,0xF
    019A BB88      OUT	0x18,R24
(0012) 	delay_nms(1);
    019B E001      LDI	R16,1
    019C E010      LDI	R17,0
    019D DEF7      RCALL	_delay_nms
(0013) 
(0014) 	i=PINB&0x0f;
    019E B346      IN	R20,0x16
    019F 704F      ANDI	R20,0xF
(0015) 	
(0016) 	/*获取行地址*/
(0017) 	DDRB=0x0f;//高4位输入,低4位输出
    01A0 E08F      LDI	R24,0xF
    01A1 BB87      OUT	0x17,R24
(0018) 	PORTB=0xf0;//低4位输出0,高4位带上拉输入
    01A2 EF80      LDI	R24,0xF0
    01A3 BB88      OUT	0x18,R24
(0019) 	delay_nms(1);
    01A4 E001      LDI	R16,1
    01A5 E010      LDI	R17,0
    01A6 DEEE      RCALL	_delay_nms
(0020) 
(0021) 	i|=PINB&0xf0;
    01A7 B386      IN	R24,0x16
    01A8 7F80      ANDI	R24,0xF0
    01A9 2B48      OR	R20,R24
(0022) 	
(0023) 	switch(i)
    01AA 2755      CLR	R21
    01AB 3D47      CPI	R20,0xD7
    01AC E0E0      LDI	R30,0
    01AD 075E      CPC	R21,R30
    01AE F409      BNE	0x01B0
    01AF C075      RJMP	0x0225
    01B0 3D4B      CPI	R20,0xDB
    01B1 E0E0      LDI	R30,0
    01B2 075E      CPC	R21,R30
    01B3 F409      BNE	0x01B5
    01B4 C068      RJMP	0x021D
    01B5 3D4D      CPI	R20,0xDD
    01B6 E0E0      LDI	R30,0
    01B7 075E      CPC	R21,R30
    01B8 F409      BNE	0x01BA
    01B9 C05B      RJMP	0x0215
    01BA 3D4E      CPI	R20,0xDE
    01BB E0E0      LDI	R30,0
    01BC 075E      CPC	R21,R30
    01BD F409      BNE	0x01BF
    01BE C04E      RJMP	0x020D
    01BF ED8E      LDI	R24,0xDE
    01C0 E090      LDI	R25,0
    01C1 1784      CP	R24,R20
    01C2 0795      CPC	R25,R21
    01C3 F164      BLT	0x01F0
    01C4 3747      CPI	R20,0x77
    01C5 E0E0      LDI	R30,0
    01C6 075E      CPC	R21,R30
    01C7 F409      BNE	0x01C9
    01C8 C060      RJMP	0x0229
    01C9 374B      CPI	R20,0x7B
    01CA E0E0      LDI	R30,0
    01CB 075E      CPC	R21,R30
    01CC F409      BNE	0x01CE
    01CD C053      RJMP	0x0221
    01CE 374D      CPI	R20,0x7D
    01CF E0E0      LDI	R30,0
    01D0 075E      CPC	R21,R30
    01D1 F409      BNE	0x01D3
    01D2 C046      RJMP	0x0219
    01D3 374E      CPI	R20,0x7E
    01D4 E0E0      LDI	R30,0
    01D5 075E      CPC	R21,R30
    01D6 F409      BNE	0x01D8
    01D7 C039      RJMP	0x0211
    01D8 3747      CPI	R20,0x77
    01D9 E0E0      LDI	R30,0
    01DA 075E      CPC	R21,R30
    01DB F40C      BGE	0x01DD
    01DC C04E      RJMP	0x022B
    01DD 3B47      CPI	R20,0xB7
    01DE E0E0      LDI	R30,0
    01DF 075E      CPC	R21,R30
    01E0 F409      BNE	0x01E2
    01E1 C045      RJMP	0x0227
    01E2 3B4B      CPI	R20,0xBB
    01E3 E0E0      LDI	R30,0
    01E4 075E      CPC	R21,R30
    01E5 F409      BNE	0x01E7
    01E6 C038      RJMP	0x021F
    01E7 3B4D      CPI	R20,0xBD
    01E8 E0E0      LDI	R30,0
    01E9 075E      CPC	R21,R30
    01EA F161      BEQ	0x0217
    01EB 3B4E      CPI	R20,0xBE
    01EC E0E0      LDI	R30,0
    01ED 075E      CPC	R21,R30
    01EE F101      BEQ	0x020F
    01EF C03B      RJMP	0x022B
    01F0 3E47      CPI	R20,0xE7
    01F1 E0E0      LDI	R30,0
    01F2 075E      CPC	R21,R30
    01F3 F179      BEQ	0x0223
    01F4 3E4B      CPI	R20,0xEB
    01F5 E0E0      LDI	R30,0
    01F6 075E      CPC	R21,R30
    01F7 F119      BEQ	0x021B
    01F8 3E4D      CPI	R20,0xED
    01F9 E0E0      LDI	R30,0
    01FA 075E      CPC	R21,R30
    01FB F0B9      BEQ	0x0213
    01FC 3E4E      CPI	R20,0xEE
    01FD E0E0      LDI	R30,0
    01FE 075E      CPC	R21,R30
    01FF F059      BEQ	0x020B
    0200 3E47      CPI	R20,0xE7
    0201 E0E0      LDI	R30,0
    0202 075E      CPC	R21,R30
    0203 F13C      BLT	0x022B
    0204 3F4F      CPI	R20,0xFF
    0205 E0E0      LDI	R30,0
    0206 075E      CPC	R21,R30
    0207 F009      BEQ	0x0209
    0208 C022      RJMP	0x022B
(0024) 	{
(0025) 		case 0xff:return 0x00;
    0209 2700      CLR	R16
    020A C021      RJMP	0x022C
(0026) 		case 0xee:return 'D';
    020B E404      LDI	R16,0x44
    020C C01F      RJMP	0x022C
(0027) 		case 0xde:return '#';
    020D E203      LDI	R16,0x23
    020E C01D      RJMP	0x022C
(0028) 		case 0xbe:return '0';
    020F E300      LDI	R16,0x30
    0210 C01B      RJMP	0x022C
(0029) 		case 0x7e:return '*';
    0211 E20A      LDI	R16,0x2A
    0212 C019      RJMP	0x022C
(0030) 		case 0xed:return 'C';
    0213 E403      LDI	R16,0x43
    0214 C017      RJMP	0x022C
(0031) 		case 0xdd:return '9';
    0215 E309      LDI	R16,0x39
    0216 C015      RJMP	0x022C
(0032) 		case 0xbd:return '8';
    0217 E308      LDI	R16,0x38
    0218 C013      RJMP	0x022C
(0033) 		case 0x7d:return '7';
    0219 E307      LDI	R16,0x37
    021A C011      RJMP	0x022C
(0034) 		case 0xeb:return 'B';
    021B E402      LDI	R16,0x42
    021C C00F      RJMP	0x022C
(0035) 		case 0xdb:return '6';
    021D E306      LDI	R16,0x36
    021E C00D      RJMP	0x022C
(0036) 		case 0xbb:return '5';
    021F E305      LDI	R16,0x35
    0220 C00B      RJMP	0x022C
(0037) 		case 0x7b:return '4';
    0221 E304      LDI	R16,0x34
    0222 C009      RJMP	0x022C
(0038) 		case 0xe7:return 'A';
    0223 E401      LDI	R16,0x41
    0224 C007      RJMP	0x022C
(0039) 		case 0xd7:return '3';
    0225 E303      LDI	R16,0x33
    0226 C005      RJMP	0x022C
(0040) 		case 0xb7:return '2';
    0227 E302      LDI	R16,0x32
    0228 C003      RJMP	0x022C
(0041) 		case 0x77:return '1';
    0229 E301      LDI	R16,0x31
    022A C001      RJMP	0x022C
(0042) 		default:return 0x00;
    022B 2700      CLR	R16
    022C 940E0362  CALL	pop_gset1
    022E 9508      RET
_get_key:
  i                    --> R20
    022F 940E035F  CALL	push_gset1
(0043) 	}
(0044) }
(0045) 
(0046) unsigned char get_key(void)
(0047) {unsigned char i;
(0048)  static unsigned char j;//按键记录 
(0049)  i = key_read();
    0231 DF63      RCALL	_key_read
    0232 2F40      MOV	R20,R16
(0050)  if (i == 0x00)//无有效按键按下
    0233 2300      TST	R16
    0234 F429      BNE	0x023A
(0051)  {
(0052)   j = 0x00;//清除按键记录
    0235 2422      CLR	R2
    0236 92200125  STS	j,R2
(0053)   return 0x00;//程序退出
    0238 2700      CLR	R16
    0239 C011      RJMP	0x024B
(0054)   }
(0055)  if (j == 0x00) //为新按键
    023A 90200125  LDS	R2,j
    023C 2022      TST	R2
    023D F461      BNE	0x024A
(0056)   {j = i;//保存本次采样结果
    023E 93400125  STS	j,R20
(0057)   delay_nms(10);//去按键颤抖
    0240 E00A      LDI	R16,0xA
    0241 E010      LDI	R17,0
    0242 DE52      RCALL	_delay_nms
(0058)   i = key_read();
    0243 DF51      RCALL	_key_read
    0244 2F40      MOV	R20,R16
(0059)   if(i == j) {return i;}
    0245 90200125  LDS	R2,j
    0247 1502      CP	R16,R2
    0248 F409      BNE	0x024A
    0249 C001      RJMP	0x024B
(0060)   }
(0061) return 0x00;
    024A 2700      CLR	R16
    024B 940E0362  CALL	pop_gset1
    024D 9508      RET
_RXC_Int:
  ERROR                --> R16
    024E 922A      ST	R2,-Y
    024F 930A      ST	R16,-Y
    0250 938A      ST	R24,-Y
    0251 939A      ST	R25,-Y
    0252 93EA      ST	R30,-Y
    0253 93FA      ST	R31,-Y
    0254 B62F      IN	R2,0x3F
    0255 922A      ST	R2,-Y
FILE: D:\mojinpan\485\485_master\main.c
(0001) /*******************************************************************************
(0002)                            485多机通讯
(0003) --------------------------------------------------------------------------------
(0004) 通讯规则: 

⌨️ 快捷键说明

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