📄 限速发送主程序.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 + -