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

📄 cap1p3.asm

📁 用AD7799做的电子汽车衡称重显示控制仪表程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;-----------------------------------------------------------
;-----------------------------------------------------------
;--      8142A weigh scale display instrument's program   --
;--	     version:1.2									  --
;--	     author:Farway                                    --
;--	     date:2005-05-21                                  --
;-----------------------------------------------------------
;-----------------------------------------------------------
;define bits:

        ;ad7791 spi communication define
        cs		    bit		p1.3
        sclk		bit		p1.2
        din		    bit		p1.0
        dout		bit		p1.1

        ;I2C communication of keyboard and LED display chip(zlg7290)
        zdata		bit		p1.5
        clk		    bit		p1.4
        key_int		bit		p3.2

        ;I2C communication of Memory(FM24C64) 
        scl		    bit		p1.6
        sda		    bit		p1.7
        wp_24cxx	bit		p3.4	;H---write protect

        ;I2C communication of RTL(sd2003) 
        rtl_sda     bit     P1.6            ;IIC的rtl_sda口线
        rtl_scl     bit     P1.7            ;IIC的rtl_scl口线
        ;buzzer control
        p_buzz		bit		p3.3

        ;rs485 and rs232 communication
        b8052rxd		bit		p3.0
        b8052txd		bit		p3.1
        p_re			bit		p3.5

        ;printer drive
        p8052rd			bit		p3.7
        p8052wr			bit		p3.6

        ;define	printer control status
        stb	    	bit		p2.3	;printer data select sign
        busy		bit		p2.2	;printer busying flag;H--busy L--no busy

        ;power status indication
        ac_test		bit		p2.6	;AC power indication  ;H--AC power using
        dc_test		bit		p2.0	;DC power indication  ;H--DC power full

        ;program running status indication or calibration
        p_cal		bit		p2.7

        ;flag bits
        f_cross_zero		bit		2bh.7		;表示曾经回过零位的标志:1=未回过,0=回过
        f_zero				bit		2ch.0		;零位标志 0-零位 1-非零位
        f_wdhz				bit		2ch.1		;使用微打汇总格式 0-不使用 1-使用
        f_bfl				bit		2ch.2		;使用填充打印格式标志位 0-不使用填充打印格式 1-使用填充打印格式
        f_soft_bt			bit		2ch.3		;面板软件系统参数设置标志位:0-不允许,1=允许
        f_stb_led			bit		2ch.4		;称重稳定状态标志
        f_start_send		bit		2ch.5 	   	;start sending flag:0-未准备好,1=准备好
        f_printer_busy		bit		2ch.6
        f_total_over		bit		2ch.7			;data over flag
        f_record			bit		2dh.0		;存贮器内有称重记录标志:1-有 0-没有
        f_flag2				bit		2dh.1			;通用标志位
        ;zlg7290 flag bits
        ACK					BIT		2dh.2		   	;应答标志位
		KEYON				BIT		2dh.3			;有键按下的标志位
		f_compare			bit		2dh.4			;weight data compare flag
		FLAG.0    			EQU     2dh.5         	;通用标志寄存器(sd2003)
                                        			;BIT0=1, ACK ERR
                                        			;BIT0=0 ,ACK OK
		FLAG.1    			EQU     2dh.6  
		f_stable			bit		2dh.7			;称重示数稳定标志位 1=稳定0=不稳定
		f_key_num           bit		2eh.0			;有数字键按下标志 
		f_filter_rc			bit		2eh.1			;RC低通滤波器赋初值标志 
		f_gross				bit		2eh.2			;毛重的正负符号标号
		f_sign				bit		2eh.3			;净重重量的正负符号标志	
													;clr为正	
													;setb为负
		f_rd_data			bit		2eh.4			;读取重量数据标志:1=读取 0=未读取
		f_SetZero_key		bit		2eh.5			;"置零"键状态标志
		f_flag1				bit		2eh.6			;通用标志位
		f_weight_over		bit		2eh.7			;超载标志位0=正常,1=超载
		f_function0			equ		2fh				;功能状态寄存器
;		----------------------------------------------------------------------------------
;		2fh.7	  2fh.6	    2fh.5	2fh.4	  2fh.3	    2fh.2	  2fh.1	            2fh.0
;		----------------------------------------------------------------------------------
;		线性校正  扩展显示  按键音  皮重功能  自动去皮  自动清皮  数字键输入皮重值  保留
;		----------------------------------------------------------------------------------
;		1=允许		0=禁止												                      
		;define constant
		ram			equ		30h
        c_sp		equ		0d0h    	;stack address
        c_time0		equ		0d8h		;10ms
		;zlg7290 define
		ZLG7290		EQU		70H			;ZLG7290的器件地址
		;FM24Cxx define
		FADDR		EQU		0a0h		; fixed address for AT24Cxx EEPROMs
		;PADDR		EQU		0		    ; programmable address (0..7)
		SIZE01		EQU		80h		    ; bytes per AT24C01
		SIZE02		EQU		100h		; bytes per AT24C02	
		SIZE04		EQU		200h		; bytes per AT24C04
		SIZE08		EQU		400h		; bytes per AT24C08
		SIZE16		EQU		800h		; bytes per AT24C16
		;AT24C01 of PSIZE EQU 8
		PSIZE01		EQU	8		    	; bytes per page for AT24C01
		PSIZE		EQU	16		   	 	; bytes per page for AT24C02~16
		c_filter_base0		equ			06h;07h
		c_filter_base1		equ			40h;0d0h		;内码转外码的因子

		;impsr		data		85h
		;sconf		data		0bfh

;define	RAM register
		time_0a	   				data	ram		;30h
		time_1a	   				data	ram+1	;31h
		;kb_lock	   				data	ram+2  	;32h(已用于打印缓冲区的数据暂存)
		;zlg7290 ram define
		MTD		   				EQU	    ram+3	;33h~34h 发送数据缓冲器
		MRD		   				EQU	    ram+5	;35h 	 接收数据缓冲区
		SLA		   				DATA	ram+6	;36h 	 器件的从地址
		SUBA	   				DATA	ram+7	;37h 	 器件的子地址
		NUMBYTE	   				DATA	ram+8	;38h 	 读/写的字节数变量
		DISP_BUF   				EQU		ram+9	;39h~3eh 显示缓冲区
		m_date_time 			data    ram+15	;3fh	 时间/日期键的按键次数
		;ad7791
		weigh_num   			data	ram+16	;40h
		weigh_min0  			data	ram+17	;41h
		weigh_min1				data	ram+18	;42h
		weigh_min2				data	ram+19	;43h
		weigh_max0				data	ram+20	;44h
		weigh_max1				data	ram+21	;45h
		weigh_max2				data	ram+22	;46h
		weigh_0					data	ram+23	;47h
		weigh_1					data	ram+24	;48h
		weigh_2					data	ram+25	;49h
		weigh_3					data	ram+26	;4ah
		m_filter_rc				equ		ram+27	;4bh
		c_weight_scale			equ		ram+28	;4ch	   xx个内码显示一个分度数
		m_filter_rc1			data	ram+29	;4dh
		m_filter_rc2			data	ram+30	;4eh
		m_filter_rc3			data	ram+31	;4fh
		;define the general register
		;时间寄存器	
        YEAR    				EQU     ram+32	;50h       年
        MONTH   				EQU     ram+33  ;51h       月
        DATE     				EQU     ram+34  ;52h       日
        DAY   	 				EQU     ram+35  ;53h       星期(已用于打印缓冲区的数据暂存)
        HOUR    				EQU     ram+36  ;54h       小时
        MINUTE  				EQU     ram+37  ;55h       分钟
        SECOND  				EQU     ram+38  ;56h       秒
        ;单片机与实时时钟间通信寄存器
        TIMETEMP    			EQU     2fh  ;2fh   	  	时间标志寄存器
        TIMETX      			EQU     ram+39  ;57h   	  	时间数据发送寄存器
        TIMERX      			EQU     ram+40  ;58h   	  	时间数据接收寄存器
		;m_gross_count			data	ram+41	;59h      	"毛重/净重"按键次数(已用于打印缓冲区的数据暂存)
		m_tare_count			data	ram+42	;5ah      	"去皮"按键次数
		m_gross_0				equ		ram+43	;5bh	   	毛重字节0
		m_gross_1				equ		ram+44	;5ch	   	毛重字节1
		m_gross_2				equ		ram+45	;5dh	   	毛重字节2
		m_tare_0				data	ram+46	;5eh	   	皮重字节0
		m_tare_1				data	ram+47	;5fh	   	皮重字节1
		m_tare_2				data	ram+48	;60h	   	皮重字节2
		m_function_key			data	ram+49	;61h		参数设置选择功能键
		;FM24Cxx define
		addr_h					data	ram+50	;62h	 	2-byte address register
		addr_l					data	ram+51	;63h 		2-byte address register
		;------------------------------------------------------------------
		m_weight_L0				data	ram+52	;64h	   	滤波后重量值0
		m_weight_L1				data	ram+53	;65h	   	滤波后重量值1
		m_weight_L2				data	ram+54	;66h	   	滤波后重量值2
		m_weight_p0				data	ram+55	;67h		重量修正用寄存器0
		m_weight_p1				data	ram+56	;68h		重量修正用寄存器1
		m_weight_p2				data	ram+57	;69h		重量修正用寄存器2
		m_divid_value			equ		ram+58	;6ah		称的分度值的有效数字
		m_divid_e0				equ		ram+59	;6bh		称的分度值的小数部分0
		m_divid_e1				equ		ram+60	;6ch		称的分度值的小数部分1
		m_divid_number0			equ		ram+61	;6dh		称的分度数0
		m_divid_number1			equ		ram+62	;6eh		称的分度数1
		m_code_max0				equ		ram+63	;6fh		称的最大外码值0
		m_code_max1				equ		ram+64	;70h		称的最大外码值1
		m_code_max2				equ		ram+65	;71h		称的最大外码值2
		m_dp_position			equ		ram+66	;72h		小数点位置
		m_OpenAutoClrZero		equ		ram+67	;73h		开机自动清零范围
		m_KeyClrSpan			equ		ram+68	;74h		按键自动清零范围
		m_AutoZeroFollow		equ		ram+69	;75h		自动零跟踪阀值
		;m_Warm_upTime			equ		ram+70	;76h		开机预热时间(已用于蠕变补偿的定时)
		time_1b					equ		ram+70	;76h		
		;m_UnitSelect			equ		ram+71	;77h		单位选择(已用于打印缓冲区的数据暂存)
		m_FixValueAlam			equ		ram+72	;78h		设定值报警
		m_base_0				equ		ram+73	;79h	   	重量值底数字节0
		m_base_1				equ		ram+74	;7ah	   	重量值底数字节1
		m_base_2				equ		ram+75	;7bh	   	重量值底数字节2
		m_DigitalFilter			equ		ram+76	;7ch		数字滤波器的滤波深度

		org		   0000h
        ljmp	   start_program

		org		   0003h
		ljmp	   int0_int			;int0

		org		   000bh
		ljmp	   time0_int		;T0

		org		   001bh 
		;ljmp	   time1_int		;T1
		reti

		org		   0023h
		ljmp	   sbuf_int			;serial communication
		;reti

;=============================================================

		org		   0030h

;(30h)machine name:8142A           (4bytes)(R)
;(31h)machine SN  :200505210001    (6bytes)(R)
;(32h)machine addr:1.0             (1byte)(W/R)	
;(33h)hardware ver:1.0             (1byte)(R)	
;(34h)software ver:1.0             (1byte)(R)
;(35h)company name:Honsta          (1byte)(R)		
;(36h)memory chip wrong:0a5h       (1byte)(W/R)  ;only 0a5h is right,and the other is wrong
JQ_name:
	db	81h,42h,0Ah,00h
JQ_SN:
	db	05h,05h,21h,00h,01h
JQ_addr:
	db	01h
hardware_ver:
	db	10h
software_ver:
	db	01h,00h
company_name:
	db	'HONSTA'
fm24c64_wrong:
	db	0a5h
;------------------------------------------------------------------------------------	
start_program:

;		clr			ea
		mov			psw,#00h
		nop
		mov			sp,#c_sp
		nop
		nop
		clr			flag.0
		clr			flag.1

ini_csh:

        MOV     SCON,#01010000B	     ;串口Mode 1
        mov		tmod,#21h
        lcall	baud_set			;设置波特率

	    setb   	 	ea
   		setb    	es
        SETB    	TR1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        mov         th0,#c_time0

        lcall		long_delay
        lcall		long_delay		;delay 600ms
		;mov			impsr,#01h
		;mov			sconf,#02h 
				       
        setb    	it0

		;setb		ps

		setb   	    et0             ;OPEN time0
		;setb    	et1             ;OPEN time1

        setb    	ex0             ;open ext int0

		setb       tr0
		
		clr			p_buzz
		lcall		delay20ms
		setb		p_buzz
		
		lcall	   led_testself		;数码管自检
		lcall	   StatusLed_testself	;状态指示灯自检

ini_csh0:		
		setb		key_int

		setb		p8052wr
		setb		p8052rd			;74hc377控制

		lcall	   spi_ini
		lcall	   ini_ad7791
        lcall      ini_data
        lcall	   ini_sd2003		;ini RTL(SD2003AP)
        lcall		ini_system_parameter
        lcall		get_weight_scale	;计算出x个内码转换为一个分度数

		lcall		check_adc		;检查传感器或A/D

		jb			p_cal,no_cal
		jmp			parameter_set
	no_cal:
		lcall		lack_weighting
		mov			r0,m_OpenAutoClrZero
		lcall		weighting_ClrZero_span
		lcall		over_weighting
		lcall		find_zero_point
;=========================================================
main_loop:

;debug:

		;mov		dptr,#print_tab0
		;mov		r3,#2
		;lcall	prn_send_loop			;打印机初始化
		
		;mov			dptr,#font_style
		;mov			r3,#3
		;lcall		prn_send_loop			;字体类型:显赫体
		
		;mov			dptr,#printhead_position
		;mov			r3,#2
		;lcall		prn_send_loop			;打印头归位
				
		;mov			dptr,#line_length
		;mov			r3,#3
		;lcall		prn_send_loop			;走纸
		
		;mov			1eh,#01h
		;mov			1fh,#00h
		
		;mov			19h,#06h
		;mov			1ah,#07h
		;mov			1bh,#22h
		
		;mov			16h,#14h
		;mov			17h,#51h
		;mov			18h,#01h
		
		;mov			08h,#00h
		;mov			09h,#30h
		;mov			0ah,#39h
		
		;mov			14h,#4dh

		;mov			15h,#58h
		
		;mov		dptr,#print_space
		;mov		r3,#9
		;lcall	prn_send_loop			;空格
		;lcall		sn_PrntData
		;mov		a,#13
		;lcall	printer_cr				;打印
				
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;lcall		date_data_send
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;lcall		time_data_send
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;lcall		vehicle_PrntData
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;lcall		cargo_PrntData
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;mov		r5,0eh
		;mov		r6,0fh
		;mov		r7,10h
		;lcall	btd0					;毛重数据(out:r6r5r4)
		;lcall	dp_position_data		;发送带小数点的称重数据
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;mov		r5,0bh
		;mov		r6,0ch
		;mov		r7,0dh
		;lcall	btd0					;皮重数据(out:r6r5r4)
		;lcall	dp_position_data		;发送带小数点的称重数据
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;lcall	client_PrntData			;扣率
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov		dptr,#print_space
		;mov		r3,#10
		;lcall	prn_send_loop			;空格
		;mov		r5,11h
		;mov		r6,12h
		;mov		r7,13h
		;mov		1ch,08h					;保护车号的最高字节
		;lcall	btd0					;净重数据(out:r6r5r4)
		;lcall	dp_position_data		;发送带小数点的称重数据
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov			dptr,#top_page
		;mov			r3,#3
		;lcall		prn_send_loop			;空格
		
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov			dptr,#bottom_page
		;mov			r3,#3
		;lcall		prn_send_loop			;走纸
		
		;mov		a,#13
		;lcall	printer_cr				;打印
		
		;mov			dptr,#printhead_position
		;mov			r3,#2
		;lcall		prn_send_loop			;打印头归位
		
		;jmp			main_loop
		
		setb     wp_24cxx		;write protect

		lcall	   	rd_ad7791				;AD process
		lcall		p_weight
		lcall		weight_mend
		lcall		key_ClrZero				;按键置零功能
		lcall		AutoZeroFollow			;自动零跟踪
		lcall		get_gross
		lcall		get_weight

		lcall		scale_over				;超载判断
		jb			f_weight_over,main_loop

		lcall		get_net					;若去皮寄存器为零,得到毛重;若去皮寄存器不为零,得到净重

		mov			a,sp
		cjne		a,#0d0h,reset_system

		lcall		dis_weight_led			;显示重量

		lcall		get_sbuf_data			;将通讯数据写入缓冲区

		lcall		sbuf_int				;发送数据

		lcall		keyboard_p
		
	    jmp	   main_loop
;-------------------------------	    
reset_system:
		mov			psw,#00h
		nop
		mov			sp,#c_sp
		nop
		nop
		clr			flag.0
		clr			flag.1

        MOV     	SCON,#01010000B	     ;串口Mode 1
        mov			tmod,#21h
        lcall		baud_set			;设置波特率
	    setb   	 	ea
   		setb    	es
        SETB    	TR1	
   
        mov         th0,#c_time0

        setb    	it0

		setb   	    et0             ;OPEN time0

        setb    	ex0             ;open ext int0

		setb       tr0	
		jmp			ini_csh0	    
;==========================================================
ini_data: 
		mov			r0,#08h					;判断'车号皮重'存贮指针的值若=00h,or,0ffh,or,<005bh
		mov			r2,#2					;则赋值005bh
		mov			addr_h,#00h
		mov			addr_l,#59h	
		lcall		fm_read_block
		mov			a,08h
		jnz			fm_dptr_ini0
		mov			a,09h
		jnz			fm_dptr_ini0			;=00?
		jmp			fm_dptr_ini
	fm_dptr_ini0:
		mov			a,08h
		cpl			a
		jnz			fm_dptr_ini1
		mov			a,09h
		cpl			a
		jnz			fm_dptr_ini1
		jmp			fm_dptr_ini				;=ffh?
	fm_dptr_ini1:

⌨️ 快捷键说明

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