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

📄 serial.src

📁 rs485串口通讯程序,对大家很有帮助,
💻 SRC
📖 第 1 页 / 共 2 页
字号:
;   }
			; SOURCE LINE # 84
?C0010:
	RET  	
; END OF send

CSEG	AT	00023H
	LJMP	serial

; 
; 
; /*****************************串口中断响应处理函数***********************/
; 
; void serial(void) interrupt 4

	RSEG  ?PR?serial?SERIAL
	USING	0
serial:
	PUSH 	ACC
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 89
; {  uchar k;
;   if(RI)//为接收中断
			; SOURCE LINE # 91
	JNB  	RI,?C0011
;      {      
			; SOURCE LINE # 92
;       RI=0;                                         //清接收中断标志
			; SOURCE LINE # 93
	CLR  	RI
;        LED = ~LED;                                  //闪串口指示LED
			; SOURCE LINE # 94
	CPL  	LED
;       sbuffer = SBUF;                               //读取串口缓冲区数据
			; SOURCE LINE # 95
	MOV  	sbuffer,SBUF
; 
;       if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
			; SOURCE LINE # 97
	MOV  	A,sbuffer
	CJNE 	A,#073H,?C0012
	JB   	receive,?C0012
;        {     
			; SOURCE LINE # 98
;            receive = 1;     //开始接收标志                         
			; SOURCE LINE # 99
	SETB 	receive
;            cmd_numb = 0;    //清接收计数器
			; SOURCE LINE # 100
	MOV  	cmd_numb,#00H
;            re_finish = 0;   //清接收完成标志
			; SOURCE LINE # 101
	CLR  	re_finish
;           }
			; SOURCE LINE # 102
	SJMP 	?C0022
?C0012:
;       else if(sbuffer == 'e')   //判断数据尾     
			; SOURCE LINE # 103
	MOV  	A,sbuffer
	CJNE 	A,#065H,?C0014
;         { 
			; SOURCE LINE # 104
;           if(cmd_numb<8)//接收到的字符少于8个
			; SOURCE LINE # 105
	MOV  	A,cmd_numb
	CLR  	C
	SUBB 	A,#08H
	JNC  	?C0015
;             for(k=cmd_numb;k<8;k++)//则空位填空显示
			; SOURCE LINE # 106
;---- Variable 'k?241' assigned to Register 'R7' ----
	MOV  	R7,cmd_numb
?C0016:
	MOV  	A,R7
	CLR  	C
	SUBB 	A,#08H
	JNC  	?C0015
;               buffer[k] = 17;
			; SOURCE LINE # 107
	MOV  	A,#LOW (buffer)
	ADD  	A,R7
	MOV  	R0,A
	MOV  	@R0,#011H
	INC  	R7
	SJMP 	?C0016
?C0015:
;           re_finish = 1;         //置接收完成标志      
			; SOURCE LINE # 108
	SETB 	re_finish
;           receive =0;            //清接收标志
			; SOURCE LINE # 109
	CLR  	receive
;           }
			; SOURCE LINE # 110
	SJMP 	?C0022
?C0014:
;       else if(receive){     //判断当前是否处于接收状态
			; SOURCE LINE # 111
	JNB  	receive,?C0022
;                    
;           buffer[cmd_numb++] = sbuffer-'0';  //当前字符送缓冲区
			; SOURCE LINE # 113
	MOV  	A,sbuffer
	ADD  	A,#0D0H
	MOV  	R7,A
	MOV  	R6,cmd_numb
	INC  	cmd_numb
	MOV  	A,#LOW (buffer)
	ADD  	A,R6
	MOV  	R0,A
	MOV  	@R0,AR7
;          }      
			; SOURCE LINE # 114
	SJMP 	?C0022
;       else                    //无效命令则返回
;          return;
;        }
			; SOURCE LINE # 117
?C0011:
;     else{ 
			; SOURCE LINE # 118
;      TI=0;                   //为单个字符发送完中断
			; SOURCE LINE # 119
	CLR  	TI
;      if(!number)             //字符串发送完
			; SOURCE LINE # 120
	MOV  	A,number?
	JNZ  	?C0024
;       { REN = 1;             //允许接收
			; SOURCE LINE # 121
	SETB 	REN
;        }
			; SOURCE LINE # 122
	SJMP 	?C0022
?C0024:
;      else{                  //字符串未发送完
			; SOURCE LINE # 123
;         SBUF =  cash[i++];   //发送下一字符
			; SOURCE LINE # 124
	MOV  	R7,i
	INC  	i
	MOV  	A,#LOW (cash)
	ADD  	A,R7
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	SBUF,A
; 		number--;           //发送字符数减一
			; SOURCE LINE # 125
	DEC  	number?
;        }             
			; SOURCE LINE # 126
;      }
			; SOURCE LINE # 127
;    }
			; SOURCE LINE # 128
?C0022:
	POP  	AR7
	POP  	AR6
	POP  	AR0
	POP  	PSW
	POP  	ACC
	RETI 	
; END OF serial

; 
; /*****************************延时函数**********************/
; void  delay(unsigned int loop) 

	RSEG  ?PR?_delay?SERIAL
_delay:
	USING	0
			; SOURCE LINE # 131
;---- Variable 'loop?342' assigned to Register 'R6/R7' ----
; {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
			; SOURCE LINE # 132
;   for(i=0;i<loop;i++);      //循环执行空指令loop次,达到延时目的
			; SOURCE LINE # 133
;---- Variable 'i?343' assigned to Register 'R4/R5' ----
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
?C0026:
	CLR  	C
	MOV  	A,R5
	SUBB 	A,R7
	MOV  	A,R4
	SUBB 	A,R6
	JNC  	?C0029
	INC  	R5
	CJNE 	R5,#00H,?C0040
	INC  	R4
?C0040:
	SJMP 	?C0026
;  }
			; SOURCE LINE # 134
?C0029:
	RET  	
; END OF _delay

; 
; 
; /******************************数码管显示扫描*************************/
; 
; void ledscan()

	RSEG  ?PR?ledscan?SERIAL
ledscan:
	USING	0
			; SOURCE LINE # 139
; {  uchar i;  
			; SOURCE LINE # 140
; 
;     for(i=0;i<8;i++){
			; SOURCE LINE # 142
;---- Variable 'i?444' assigned to Register 'R3' ----
	CLR  	A
	MOV  	R3,A
?C0030:
;        P2 = 0xff;//关闭所有数码管
			; SOURCE LINE # 143
	MOV  	P2,#0FFH
;        addr3 = 0;
			; SOURCE LINE # 144
	CLR  	addr3
;        addr0 = 0;
			; SOURCE LINE # 145
	CLR  	addr0
;        addr1 = 1;
			; SOURCE LINE # 146
	SETB 	addr1
;        addr2 = 0;//开发板上U4(74HC574)的片选地址
			; SOURCE LINE # 147
	CLR  	addr2
;        P0 =table[cash[i]]; //取一行显示数据 
			; SOURCE LINE # 148
	MOV  	A,#LOW (cash)
	ADD  	A,R3
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	DPTR,#table
	MOVC 	A,@A+DPTR
	MOV  	P0,A
;        addr3 = 1; 
			; SOURCE LINE # 149
	SETB 	addr3
;        addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
			; SOURCE LINE # 150
	CLR  	addr3
;        P2 = scan[i];//取row0--row7行扫描数据
			; SOURCE LINE # 151
	MOV  	A,R3
	MOV  	DPTR,#scan
	MOVC 	A,@A+DPTR
	MOV  	P2,A
;        delay(50); //延时50us
			; SOURCE LINE # 152
	MOV  	R7,#032H
	MOV  	R6,#00H
	LCALL	_delay
;        }
			; SOURCE LINE # 153
	INC  	R3
	CJNE 	R3,#08H,?C0030
;  }
			; SOURCE LINE # 154
?C0033:
	RET  	
; END OF ledscan

; 
; /********************************主函数****************************/
; 
; main()

	RSEG  ?PR?main?SERIAL
main:
	USING	0
			; SOURCE LINE # 158
; {
			; SOURCE LINE # 159
;   initial(); 
			; SOURCE LINE # 160
	LCALL	initial
?C0034:
;   while(1){//主循环
			; SOURCE LINE # 161
;     if(re_finish){//把串口缓冲区的内容送到显示缓冲区    
			; SOURCE LINE # 162
	JNB  	re_finish,?C0036
;     cash[0] = buffer[0];
			; SOURCE LINE # 163
	MOV  	cash,buffer
;     cash[1] = buffer[1];
			; SOURCE LINE # 164
	MOV  	cash+01H,buffer+01H
;     cash[2] = buffer[2];
			; SOURCE LINE # 165
	MOV  	cash+02H,buffer+02H
;     cash[3] = buffer[3];
			; SOURCE LINE # 166
	MOV  	cash+03H,buffer+03H
;     cash[4] = buffer[4];
			; SOURCE LINE # 167
	MOV  	cash+04H,buffer+04H
;     cash[5] = buffer[5];
			; SOURCE LINE # 168
	MOV  	cash+05H,buffer+05H
;     cash[6] = buffer[6];
			; SOURCE LINE # 169
	MOV  	cash+06H,buffer+06H
;     cash[7] = buffer[7];
			; SOURCE LINE # 170
	MOV  	cash+07H,buffer+07H
;     re_finish = 0;//接收完成标志
			; SOURCE LINE # 171
	CLR  	re_finish
;     copyOK=1;//发送缓冲区填充完成标志
			; SOURCE LINE # 172
	MOV  	copyOK,#01H
;     send();  //把显示缓冲区的内容发送给电脑
			; SOURCE LINE # 173
	LCALL	send
;     }
			; SOURCE LINE # 174
?C0036:
;    ledscan(); //循环扫描数码管   
			; SOURCE LINE # 175
	LCALL	ledscan
;    }
			; SOURCE LINE # 176
	SJMP 	?C0034
; END OF main

	END

⌨️ 快捷键说明

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