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

📄 commu.asm

📁 一种简单可行的串行通讯方式
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;====================================================================
;Procedure name: key_dsp.asm
;The date of development: 2002.05
;Crystal Oscillator: 11.0592MHz
;Microcontroller: AT89C51 (Producted by ATEMEL Corporation)
;Developing devices: Personal Computer(486DX);EMP-100A;Avsim51
;Author:  Lixiufeng
;====================================================================
;----------------------------------------------------------------
;//define all the pins of the Microcontrollor(AT89C51)
d0a          	bit     p0.0    ;data 0 and address 0 in paralell port
d1a          	bit     p0.1    ;
d2a          	bit     p0.2    ;
d3a          	bit     p0.3    ;
d4a         	bit     p0.4    ;
d5a         	bit     p0.5    ;
d6a         	bit     p0.6    ;
d7a         	bit     p0.7    ;data 7 and address 7 
        
ask4        	bit     p1.0    ;来自主控机信号4
ask5        	bit     p1.1    ;来自主控机信号5
ask6       	bit     p1.2    ;来自主控机信号6
ask7        	bit     p1.3    ;来自主控机信号7
ans4        	bit     p1.4    ;发送到主控机信号4
ans5		bit     p1.5    ;发送到主控机信号5
ans6		bit     p1.6    ;发送到主控机信号6
ans7		bit     p1.7    ;发送到主控机信号7

re           	bit     p2.0    ;来自485的信号接收使能,低电平有效
de          	bit     p2.1    ;发往485的信号发送使能,高电平有效
comi         	bit     p2.2    ;请求主控机中断
dira          	bit     p2.3    ;数据传输方向,1表示主控机到专网通讯机
;         	bit     p2.4    ;
;          	bit     p2.5    ;
;          	bit     p2.6    ;
;          	bit     p2.7    ;

comin        	bit     p3.0    ;串行通讯输入
comout     	bit     p3.1    ;串行通讯输出
_int0		bit     p3.2    ;
;		bit     p3.3    ;
;		bit     p3.4    ; 
;		bit     p3.5    ; 
;        	bit     p3.6    ;
;        	bit     p3.7    ;
;--------------------------------------------------------------------
;//define the flag
;--------------------------------------------------------------------
conflag      	equ    24h     ;for cycle
out_cpu_f	bit	20h	; 表示mcpu有数据输出
common_dsp	bit	21h
other_dsp	bit	22h
star_dsp	bit	23h	; display star or number
number_f	bit	24h	; number key is pressed

mode_state   	equ   	25h
common_f	bit   	28h
config_f	bit   	29h     ;0 represent 1
adjust_f	bit   	2ah     ;show communication state
alarm_f      	bit   	2bh     ;
time_f       	bit   	2ch     ;
password_f	bit	2dh

key_state1   	equ     26h	;keys in first colume
k_7_f		bit     30h     ;7
k_8_f        	bit     31h     ;8
k_9_f        	bit     32h     ;9
k_u_f        	bit     33h     ;up
k_4_f        	bit     34h     ;4
k_5_f        	bit     35h     ;5
k_6_f        	bit     36h     ;6
k_d_f        	bit     37h 	;down

key_state2   	equ     27h     ;keys in second colume
k_1_f        	bit     38h     ;1
k_2_f        	bit     39h     ;2
k_3_f        	bit     3ah     ;3
k_m_f        	bit     3bh     ;mode
k_0_f        	bit     3ch     ;0
k_p_f        	bit     3dh     ;point
k_s_f       	bit     3eh	;sign	
k_c_f		bit	3fh	;confirm

serial_f	equ	28h
d_start_f	bit    40h
connect_f	bit	41h	; 与远程计算机接通标志
send_f		bit	42h	;为1表示送数成功
receive_m	bit	43h	;接收信息模式,1为送数后的返回信息
				;0为接收"*xxxxxxx+回车"信息模式
receive_f	bit	44h	; 接收状态, 1为有数据输入


display_f	equ     29h
com_dat_f	bit	48	;0 means command, 1 means data

;   		equ	2ah
;-----------------------------------------------------------------
;//define the RAM region
;-----------------------------------------------------------------
data_num	equ	30h
cursor_in	equ	31h
counter1	equ	32h
counter2	equ	33h
;		equ	34h
;		equ	35h
;		equ	36h
;		equ	37h

data1		equ    38h
data2		equ	39h
data3		equ	3ah
data4		equ	3bh
data5		equ	3ch
data6		equ	3dh
data7		equ	3eh
data8		equ	3fh

dsp_hz0	equ	40h
dsp_hz1	equ	41h
dsp_hz2	equ	42h
dsp_hz3	equ	43h
dsp_hz4	equ	44h
dsp_hz5	equ	45h
dsp_hz6	equ	46h
dsp_hz7	equ	47h
dsp_hz8	equ	48h
dsp_hz9	equ	49h
dsp_hz10	equ	4ah
dsp_hz11	equ	4bh
dsp_hz12	equ	4ch
dsp_hz13	equ	4dh
dsp_hz14	equ	4eh
dsp_hz15	equ	4fh




delay1		equ	50h	;
delay2		equ	51h	;
delay3		equ	52h	;
re_num		equ	53h	;received number of byte after "*"
dsp_dat1	equ	54h
dsp_dat2	equ	55h
dsp_com	equ	56h
u12		equ	57h	;输出芯片u12的数值

cursor_p	equ	58h
page_num	equ	59h	;页码序号
rscbufft	equ    5ah	
;		equ	5bh	
;		equ	5ch
;		equ	5dh
;		equ	5eh
;		equ	5fh


;//定义指令byte2(具体操作码) 
sd_volt	data	0	; 送电压值(临时)
sd_ee		data	24	; 送eeprom
wt_ee_done	data	33	; 写eeprom完成
wt_ee		data	34	; 写eeprom, 数据:高位地址\低位地址\字节数值
rd_ee		data	35	; 读eeprom
re_var		data	36	; 接收参数,\36\页码行码\3字节数值
				; #0000fah=N,#0000fb=Y, #xxxxh.xxh
sd_var		data	37	; 送参数,\37\页码行码\3字节数值
				; #0000fah=N,#0000fb=Y, #xxxxh.xxh
sd_com_done	data	38	; 送出指令到NC完成
cont_com	data	39	; 上位机要求连接
discont_com	data	40	; 上位机要求断开
rd_mb_date	data	41	; 读监控器日期
sd_mb_date	data	42	; 送监控器日期


;//通讯数据格式定义
; 主机 -> NC_COM -> 设备(主机 -> NC_COM 缺1、8、9项)
; 写eeprom:	*  3位设备地址+5位高位地址  34  低位地址  	三字节数据  	6项之和  回车
; 读eeprom:	*  3位设备地址+5位高位地址  35  低位地址  	0 0 0      	6项之和  回车


; 设备 -> NC_COM -> 主机 
; 送eeprom内容: * 3位设备地址+5位高位地址 24  低位地址  三字节数据  6项之和 回车
; 写eeprom完成: * 0 	33	0000	6项之和 回车
;
; 上位机->COM->主机
; 

;--------------------------------------------------------------
;//define the data used in the procedure.
_stack          data    60h     ;stack pointer=60h
time_num1	data    1       ;
time_num2	data    2       ;
time_num5	data    5       ;
time_num10	data    10       ;
time_num20	data    20      ;
time_num50	data    50      ;
time_num100	data    100       ;

dspbuffxlenth   data    4       ;
dspbuffylenth   data    4       ;
decbufflenth    data    4       ;
hexbufflenth    data    4       ;
b_rate          data    0fdh    ;baud rate : 9600bps.
;--------------------------------------------------------------
;//define the display data symbol for the purpose of reading.

;**************************************************************
;               MAIN PROGRAM
;       (General board for the Optical Sensor and SCARA)
;**************************************************************
          	org     0
           	sjmp    main            ;main procedure entry.

	   	org     0003h           ;int0 keyboard interrupt entrance.
		ljmp    re_cpu

;               org     000bh
;               ljmp    timer_0           ;t0 int_procedure entry.

;               org     0013h
;               ajmp    menu            ;int1 int_procedure entry.

;               org     001bh           ;t1 entrance.

                org     0023h           ;serial entrance.
                ljmp    serial
;==================================================================
;name: main procedure
;number:
;used resoures:
;algorithm:
;------------------------------------------------------------------
                org     30h
main:           mov     sp,#_stack
;//set stack pointer "#_stack",stack amount:32byte.

                mov     r0,#20h         ;initialize the clr_pointer.
                mov     r1,#64          ;endow "R1" with initial value.
main_clr_RAM:   mov     @r0,#0
                inc     r0
                djnz    r1,main_clr_RAM
;//clear the used RAM region from 20h to 5fh(64byte).

            	mov   	scon,#11010000b ;set serial communicating mode.
            	mov   	tmod,#00100001b ;set T1 mode for rs232c.
            	mov   	tl1,#b_rate     ;baud rate:9600bps(0fdh).
             	mov  	th1,#b_rate
		mov	th0,	#080h
		mov	tl0,	#080h


		setb	tr0
            	setb   tr1             ;start timer1
		clr    it0		;low voltage trig int0
             	clr    it1		;low voltage trig int1


		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms
		lcall	delay50ms



;		lcall	sd_cpu


		clr	re		; 允许485数据输入

		clr	receive_m	; 接收数据
		clr	connect_f
             	setb  	ea          	;enable interrupt.
             	setb  	es          	;enable serial interrupt
		setb  	ex0		;enable int0
		setb	ex1		;enable int1
;		setb	et0		; enable t0


main_loop:	nop
		jnb	receive_f, out_computer

		jb	connect_f, cont_case	; 收到远程计算机数据
		mov	a, data3		
		cjne	a, #cont_com, out_computer; 未接通数据不转送
		setb	connect_f
		ljmp	sd_com_mb

cont_case:	mov	a, data3			; 与上位机接通的情况
		cjne	a, #discont_com, sd_com_mb
		clr	connect_f

sd_com_mb:	lcall	sd_cpu
		clr	receive_f

out_computer:	jnb	out_cpu_f, main_le
		lcall	data_out
		clr	out_cpu_f

main_le:	ljmp    main_loop

;******************************************************************
;               SERIAL COMMUNICATION SUB_PROGRAM
;******************************************************************
;==================================================================
;name: serial
;number:
;used resoures: internal:acc
;               
;algorithm:
;entry:  No
;exit:   
;------------------------------------------------------------------
serial:    	clr	tr0
		clr     ea
		push	psw
		push	r0
            	
		lcall	read_rsc_port

serial_exit: 	pop	r0
		pop	psw
		setb    ea
 		setb	tr0
           	reti


;==================================================================
;name: read_rsc_port
;number:
;used resoures: internal:acc
;               lcall ls164k
;algorithm:
;entry:  No
;exit:   
;------------------------------------------------------------------
read_rsc_port:  push    psw
		push  	acc
		

		jnb  	ri,  $	
             	clr  	ri


		jnb	receive_m, read_rsc_n
		mov	a, sbuf	;读"#y"
					;判断送出的数据是否正常接收		
		cjne	a, #35, read_rsc_y1	; #
		mov	dsp_hz0, a
read_rsc_y2:	ljmp	read_exit

read_rsc_y1:	mov	r2, dsp_hz0
		cjne	r2, #35,	read_rsc_y2

		cjne	a, #121, read_rsc_y3	; y
		setb	send_f		;送数成功
read_rsc_y3:	mov	dsp_hz0, #0
		ljmp	read_exit

					;读"*xxxxxxx+回车键", 正确时返回"#y"
					; 九个数值存放在data1~dsp_hz0中
read_rsc_n:   mov   	a,  sbuf      	; read serial port
		jb    	d_start_f, read_rsc_1
		cjne  	a,  #42, read_exit 	; first data is not "*"
            	setb  	d_start_f		; start to read
		mov	data_num, #data1	; 存放数值起始位置

read_rsc_1:	mov	r0, data_num
		cjne	r0, #dsp_hz0, read_rsc_11	; 存放数值终了位置
            	cjne  	a,  #13, read_rsc_4	; 送数出错
		sjmp	read_rsc_3		; 第九个字符为回车键

read_rsc_11:	mov   	@r0,  a		; 赋值
		inc	data_num
             	sjmp 	read_exit		

read_rsc_3:  	mov	a, data2
		add	a, data3
		add	a, data4
		add	a, data5
		add	a, data6
		add	a, data7
		clr	c
		subb	a, data8
		clr	acc.7			; 128表示0
		cjne	a, #0, read_rsc_4

		mov   	rscbufft, #35		;send "#"
           	lcall 	send_rsc_port
		mov   	rscbufft, #121	;send "y"
		lcall 	send_rsc_port
		mov   	rscbufft, #35		;send "#"
           	lcall 	send_rsc_port

⌨️ 快捷键说明

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