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

📄 限速发送主程序.asm

📁 这是为高速公路设计的限速报警器的发送端程序
💻 ASM
字号:
//这是专为高速公路设计的“限速警示器”发送器主程序
//MCU使用STC12C2052
//时钟=4MHZ
//设计师:	杨本雄
//联系电话:26735990	13602675760
//email: yangbx@szonline.net
//公司名称: 深圳市雄洋电子科技有限公司
//编制时间	2006年02月17日	修改时间:	2006年02月17日
//*************************************************************************
//编程说明:
//系统工作模式
;	1.对码模式
;	2.工作模式
;  对码模式的操作:
;		1) 和主机连好联线
;		2) 启动主机"呼叫器对码"进入对码模式
;		3) 呼叫器监测到对码接口的起始位后指示灯快闪2秒提示,声音"嘟!--嘟!"2声提示
;		4) 对码完成后,关闭指示灯和声音提示,进入工作模式
//  工作模式的操作:
//		1) 单击"呼叫"键,"嘟!"声提示,指示灯慢闪5秒提示,同时封锁"呼叫"键,禁止再触发
//		2) 单击"消除"键,"嘟!"声提示,同时重新开启"呼叫"键,允许再触发
//****************************************************
//修改说明

//特别注意:
//烧录时,选择低功耗模式和高功耗模式实际上对休眠电流没多大影响
//烧录时,一定要使能看门狗,否则不能唤醒
//****************************************************
//寄存器定义
IPH							EQU		0B7H		//中断级别控制寄存器
AUXR						EQU		8EH			//T0,T1
P1M0						EQU		91H			//端口P1模式控制寄存器
P1M1						EQU		92H			//端口P1模式控制寄存器
P3M0						EQU		0B1H		//端口P3模式控制寄存器
P3M1						EQU		0B2H		//端口P3模式控制寄存器
WDT_CONTR					EQU		0E1H		//看门狗
IDLE_CLK					EQU		0C7H

//PCON						EQU		087H
//#include<reg51.h>

//RXD						BIT		P3.0
//TXD						BIT		P3.1
LAMP						BIT		P3.2		//工作指示灯
AT24C08_SDA					BIT		P3.3		//
AT24C08_SCL					BIT		P3.4		//
AT24C08_PRE					BIT		P3.5		//

RF_DATA						BIT		P3.7		//板上RF模块D1


TI_FLAG						BIT		20H.0		//

RECV_COMD_FLAG				EQU	 	22H.4

T_500MS_OVER_FLAG			EQU		22H.5
FLASH_FLAG					EQU		22H.6

RECV_RS232_POINT			EQU		23H		

LAMP_STATUS_FLAG_REG		EQU		24H

TEMP0						EQU		25H			//
TEMP1						EQU		26H
TEMP2						EQU		27H
TEMP3						EQU		28H
TEMP4						EQU		29H
TEMP5						EQU		2AH
TEMP6						EQU		2BH

T_100MS_TIMER				EQU		2CH
T_500MS_TIMER				EQU		2DH

SOH_H						EQU		30H			//SOH_H为系统码
SOH_L						EQU		31H			//SOH_L是SOH_H的反码
DEVICE_NUM					EQU		32H			//设备号	1、2、3		由(P1.1P1.0)决定,当(P1.1P1.0)=00时是编程状态
SPEED						EQU		33H			//限制速度	由(P1.6~P1.2)决定,而(P6.1~P1.3)决定限速的十位数(BCD码)
												//起步30,步阶=10
												//P1.2决定限速的个位数(BCD码),P1.2=1(个位=5),P1.2=0(个位=0)
SPEED_C						EQU		34H			//限制速度的反码
				
RECV_COMD_BUFF				EQU		35H			//接收命令缓冲区

SP_POINT					EQU		50H			//堆栈区:60H-7FH


			                ORG     0000H
			                AJMP    BEGIN
			                
			                ORG     0003H
			                //AJMP    INT0_INT
							AJMP    BEGIN
							
			                ORG     000BH
			                AJMP    T0_INT
							
							ORG     0023H
			                AJMP    SERIES_PG
			                
			                
			
			                ORG     0030H

BEGIN:						CLR		EA

							CLR		LAMP							//工作指示灯亮
							
							MOV		P1,#11111000B
							CLR		FLASH_FLAG
							CLR		T_500MS_OVER_FLAG
							MOV		WDT_CONTR,#00000000B			//关闭看门狗

							MOV     SP,#SP_POINT
							//MOV		IDLE_CLK,#00000111B
			                MOV		PCON,#00000000B					//PCON地址=87H
			                										//SMOD=PCON.7=1,串口波特率加倍
			                										//SMOD0=PCON.6=1
			                										//LVDF=PCON.5=1
			                										//POF=PCON.4=1
			                										//GF1=PCON.3=1
			                										//GF0=PCON.2=1
			                										//PD=PCON.1=1,进入掉电模式,即POWER DOWN
			                										//IDL=PCON.0=1,进入休眠模式,IDL
			                MOV     PSW,#00H
			                MOV		TCON,#00000101B					//外部中断都使用下降沿触发方式,但本程序没用到
			                MOV     TMOD,#21H            			//T1为自动重装波特率发生器
			                										//T0为16位定时器
			                MOV     SCON,#50H						//
			                
			                MOV		TH0,#43H						//T0定时器基本定时=100mS
							MOV		TL0,#33H						//实际调试值,勿更改!!!!
			                
			                //时钟=4MHz时
			                MOV     TL1,#0F3H       				//设置波特率=9600
			                MOV     TH1,#0F3H						//
			                
			                //时钟=11.0592MHz时
			                /*
			                MOV     TL1,#0CDH       				//设置波特率=9600
			                MOV     TH1,#0CDH						//
			                */
			                
			                MOV		P1M0,#00000000B					//将P1口设置为高阻输入模式
			                MOV		P1M1,#00000111B
			                MOV		P1,#11111111B
			                MOV		P3M0,#00000000B					//将P3口相应为设置为高阻输入模式
			                MOV		P3M1,#00000000B
			                
			                MOV		IPH,#00010000B					//
			                MOV		AUXR,#01000000B					//T0x12=AUXR.7=1,定时T0输入时钟不12分频
			                										//T1x12=AUXR.6=1,定时T1输入时钟不12分频
			                										//UART_M0x6=AUXR.5=1,串口速度加倍
			                										//EADCI=AUXR.4=1,允许A/D中断
			                										//ESPI=AUXR.3=1,允许SPI中断
			                										//ELVDI=AUXR.2=1,允许低压中断			                										
			                
			                MOV     20H,#00H
			                MOV     21H,#00H
			                MOV     22H,#00H
			                
			                MOV		LAMP_STATUS_FLAG_REG,#0
			                
			                MOV		IP,#00010000B
			                MOV     IE,#10010010B					//EA=IE.7=1,开总中断
			                										//ET2=IE.5=0,禁止定时器2溢出或捕获中断
			                										//ES=IE.4=1,允许串行口中断
			                										//ET1=IE.3=0,禁止T1定时中断,用作波特率发生器
			                										//EX1=IE.2=0,禁止外部中断1
			                										//ET0=IE.1=1,允许T0定时中断
			                										//EX0=IE.0=0,禁止外部中断0
			                SETB    REN
			                
			                //*********初始化定时器1**********************
			                MOV		T_500MS_TIMER,#4
							CLR		T_500MS_OVER_FLAG
			                SETB	TR0			                
			                //********************************************
			                
			                //*********初始化定时器2**********************
			                SETB	TR1									//			                
			                //********************************************
			                
			                //*********初始化AT24C08**********************
			                CLR		AT24C08_PRE			                
			                CLR		AT24C08_SCL
			                CLR		AT24C08_SDA
			                //********************************************
			                
			                MOV		IDLE_CLK,#00000000B			                

							LCALL	START_DISP_PG			                	                	        
;**************************************************************************************************
MAIN:      					LCALL	RD_SYSTEM_STATUS_PG
							
							//*******调试用*******************************
							JB		P1.7,MAIN1
							
							MOV		A,30H
							LCALL	SEND_ACC_TO_232
							MOV		A,31H
							LCALL	SEND_ACC_TO_232
							MOV		A,32H
							LCALL	SEND_ACC_TO_232
							MOV		A,33H
							LCALL	SEND_ACC_TO_232
							MOV		A,34H
							LCALL	SEND_ACC_TO_232							
							//********************************************
							
MAIN1:						LCALL	TRANSMIT_PG

							LJMP	MAIN
;**************************************************************************************************
//读系统设置状态
RD_SYSTEM_STATUS_PG:		MOV		SOH_H,#55H
							MOV		SOH_L,#0AAH
							
							MOV		A,P1
							PUSH	ACC
							
							ANL		A,#00000011B
							MOV		DEVICE_NUM,A					//存储设备号
							
							POP		ACC
							
							MOV		B,#0
							JNB		ACC.2,RD_SYSTEM_STATUS_PG1		//检查并设置个位数
							MOV		B,#5

RD_SYSTEM_STATUS_PG1:		RR		A
							RR		A
							RR		A							
							ANL		A,#00001111B					//P1.7没用
							MOV		DPTR,#SPEED_CODE_TAB
							MOVC	A,@A+DPTR
							ADD		A,B
							MOV		SPEED,A
							CPL		A
							MOV		SPEED_C,A
							
							RET
//**************************************************************************************************
TRANSMIT_PG:				JB		T_500MS_OVER_FLAG,TRANSMIT_PG0
							RET

TRANSMIT_PG0:				CLR		TR0

							LCALL	SEND_LEAD_CODE_PG					//发送引导码

							MOV		R0,#SOH_H
							MOV		DPH,#5								//共发送5个字节
							
TRANSMIT_PG1:				MOV		A,@R0
							MOV		DPL,#8								//每字节8位
							
TRANSMIT_PG2:				RRC		A
							JC		TRANSMIT_1_CODE
							LCALL	SEND_0_CODE_PG
							LJMP	COMMON_PG

TRANSMIT_1_CODE:			LCALL	SEND_1_CODE_PG

COMMON_PG:					DJNZ	DPL,TRANSMIT_PG2					//8位未完继续
							INC		R0
							DJNZ	DPH,TRANSMIT_PG1					//5字节未完继续
							
							CLR		TF0
							MOV		T_500MS_TIMER,#4
							CLR		T_500MS_OVER_FLAG					//清除标志
			                SETB	TR0			                
							
							RET
;**************************************************************************************************
SEND_LEAD_CODE_PG:			MOV		B,#8

SEND_LEAD_CODE_PG1:			SETB	RF_DATA
							LCALL	DELAY_1mS
							CLR		RF_DATA
							LCALL	DELAY_1mS
							
							DJNZ	B,SEND_LEAD_CODE_PG1
							
							RET
;**************************************************************************************************
SEND_1_CODE_PG:				SETB	RF_DATA
							LCALL	DELAY_700uS
							CLR		RF_DATA
							LCALL	DELAY_300uS
							
							RET
;**************************************************************************************************
SEND_0_CODE_PG:				CLR		RF_DATA
							LCALL	DELAY_300uS
							SETB	RF_DATA
							LCALL	DELAY_700uS
							
							RET
;**************************************************************************************************
DELAY_300uS:				MOV		R7,#3

DELAY_300uS1:				MOV		R6,#100
							
							DJNZ	R6,$			//在1T中,该指令执行4T,所以在4MH下正好是1uS
							
							DJNZ	R7,DELAY_300uS1
							
							RET
;**************************************************************************************************
DELAY_700uS:				MOV		R7,#7

DELAY_700uS1:				MOV		R6,#100
							
							DJNZ	R6,$			//在1T中,该指令执行4T,所以在4MH下正好是1uS
							
							DJNZ	R7,DELAY_700uS1
							
							RET
;**************************************************************************************************
DELAY_1mS:					MOV		R7,#10

DELAY_1mS1:					MOV		R6,#100
							
							DJNZ	R6,$			//在1T中,该指令执行4T,所以在4MH下正好是1uS
							
							DJNZ	R7,DELAY_1mS1
							
							RET
;**************************************************************************************************			
//调试用
SEND_ACC_TO_232:			CLR		TI_FLAG						
							MOV		SBUF,A
							JNB		TI_FLAG,$
							CLR		TI_FLAG
							RET		
;**************************************************************************************************
//定时器T0中断
//晶振频率=4MHz,
//
T0_INT:					PUSH	PSW										//保护中断现场
						PUSH	ACC
						
						MOV		TH0,#3CH								//T0定时器基本定时=150mS
						MOV		TL0,#0AFH
						
						DJNZ	T_500MS_TIMER,END_INT_RUPT
						MOV		T_500MS_TIMER,#4
						SETB	T_500MS_OVER_FLAG
						CPL		LAMP

END_INT_RUPT:			CLR		TF0

						POP		ACC
						POP		PSW
						
						RETI
;**************************************************************************************************
INT0_INT:				
						RETI
;**************************************************************************************************				
;串口中断
SERIES_PG:				JNB		TI,SERIES_PG0
						CLR		TI
						SETB	TI_FLAG
						RETI
						
SERIES_PG0:				CLR		RI
						PUSH	PSW
						PUSH	ACC
						MOV		A,R0
						PUSH	ACC
						
						MOV		R0,RECV_RS232_POINT
						MOV		A,SBUF
						PUSH	ACC
						MOV		@R0,A
						INC		RECV_RS232_POINT
						MOV		A,RECV_RS232_POINT
						CJNE	A,#RECV_COMD_BUFF+8,SERIES_PG1
						POP		ACC
						JMP		SERIES_PG2
						
SERIES_PG1:				POP		ACC
						CJNE	A,#',',	SERIES_PG3
						SETB	RECV_COMD_FLAG
						
SERIES_PG2:				MOV		RECV_RS232_POINT,#RECV_COMD_BUFF						
						
SERIES_PG3:				POP		ACC
						MOV		R0,A
						POP		ACC
						POP		PSW
						RETI
;**************************************************************************************************
START_DISP_PG:			MOV		DPTR,#Version_Number
						LCALL	SEND_TO_RS232
						
						MOV		DPTR,#Release_Time
						LCALL	SEND_TO_RS232
						
						MOV		DPTR,#Deviser
						LCALL	SEND_TO_RS232
						
						RET
;**************************************************************************************************
SEND_TO_RS232:			CLR		TI_FLAG

SEND_TO_RS232_1:		CLR		A
						MOVC	A,@A+DPTR
						INC		DPTR
						MOV		SBUF,A
						JNB		TI_FLAG,$
						CLR		TI_FLAG
						CJNE	A,#0DH,SEND_TO_RS232_1
						
						MOV		SBUF,#0AH
						JNB		TI_FLAG,$
						CLR		TI_FLAG
						
						RET
;**************************************************************************************************
SPEED_CODE_TAB:
DB	30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180

Version_Number:
DB	'Ver:V1.0',0DH
Release_Time:
DB	'Time:2006-03-29',0DH
Deviser:
DB	'杨本雄',0DH

END

⌨️ 快捷键说明

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