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